【OpenCV】绘图与注释——绘制色差图
由于一些特殊原因,需要将色差图显示在Qt绘制的软件界面中。由于调用matlab编译动态库的运行效率较低,因此采用OpenCV提供的绘图与注释功能来绘制色差图。其最终效果如图1所示,图中camera数据由imx347模组拍摄的X-Rite 24色卡,在经过简单的去马赛克和白平衡处理后得到的数据值;而idea数据则为CIE标准值。
图1 色差图效果示意 绘制色差图,需要使用到OpenCV提供的直线、矩形、圆、文字等绘制方法。绘制色差图所使用的函数已经在表1中给出。 表1 色差图使用的绘图与注释函数
函数 | 描述 |
---|---|
cv::circle() | 画一个简单的圆 |
cv::line() | 画一条简单的直线 |
cv::rectangle() | 画一个简单的矩形 |
cv::putText() | 在图像中绘制指定的文字 |
关于绘制色差图,主要经过了以下步骤:
- 准备Camera数据,并将数据从rgb域转换到lab域;
- 绘制色差图背景;
- 绘制camera、idea数据点,并将数据点连线,打印色卡块序号;
- 添加camera、idea图例;
1. 准备数据,并将数据从rgb域转换到lab域。在此仅给出rgb转lab域的函数,并未给出具体的色块数据。
/*描述: rgb -> lab输入:存储rgb信息的矩阵(24 * 3)输出:L, a, b数据值
*/
void rgb2lab(Mat src, Mat *L, Mat *a, Mat *b)
{Mat rgbchannel[3], labchannel[3], rgb, lab;rgbchannel[0] = src.colRange(0, 1).clone();rgbchannel[1] = src.colRange(1, 2).clone();rgbchannel[2] = src.colRange(2, 3).clone();// rgb——>labmerge(rgbchannel, 3, rgb);cvtColor(rgb, lab, COLOR_RGB2Lab);split(lab, labchannel);(*L) = labchannel[0].clone();(*a) = labchannel[1].clone();(*b) = labchannel[2].clone();
}
2. 绘制色差图背景。
/*描述:与matlab meshgrid功能相同
*/
void meshgrid(const Range xr, const Range yr, float step, Mat &outX, Mat &outY)
{vector<float> x, y;for (float i = xr.start; i <= xr.end; i += step)x.push_back(i);for (float i = yr.start; i <= yr.end; i += step)y.push_back(i);repeat(Mat(x).t(), y.size(), 1, outX);repeat(Mat(y), 1, x.size(), outY);
}/*描述:生成色差图背景返回:色差图背景
*/
Mat createBackground()
{Mat a, b, lab, rgb, channel[3];// 准备数据meshgrid(Range(-80, 100), Range(-80, 120), 0.1, a, b); // 生成网格Mat L = Mat::ones(a.size(), CV_32FC1);L = L.mul(90);L.row(800) = 50;L.col(800) = 50;a.convertTo(a, CV_32FC1);b.convertTo(b, CV_32FC1);// 生成背景channel[0] = L;channel[1] = a;channel[2] = b;merge(channel, 3, lab);cvtColor(lab, rgb, COLOR_Lab2BGR);flip(rgb, rgb, 0);return rgb;
}
3. 绘制camera、idea数据点,并将数据点连线,打印色卡块序号;
for (int i = 0; i < 24; i++)
{// 指定颜色float colorR = target.at<float>(i, 0);float colorG = target.at<float>(i, 1);float colorB = target.at<float>(i, 2);// 绘制idea数据点int ix = calculateCoordinate((int)ideaa.at<float>(i, 0), Range(-80, 100));int iy = calculateCoordinate((int)ideab.at<float>(i, 0), Range(-80, 120));cv::Point ipoint;ix = ix * 10;iy = 2001 - iy * 10;ipoint.x = ix;ipoint.y = iy;circle(rgb, ipoint, 11, Scalar(0.4, 0.4, 0.4), 3, LINE_AA);circle(rgb, ipoint, 10, Scalar(colorB, colorG, colorR), -1, LINE_AA);// 绘制camera数据值int cx = calculateCoordinate((int)curta.at<float>(i, 0), Range(-80, 100));int cy = calculateCoordinate((int)curtb.at<float>(i, 0), Range(-80, 120));cx = cx * 10;cy = 2001 - cy * 10;cv::Point cpoint;cpoint.x = cx;cpoint.y = cy;Rect rectedge = Rect(cx - 9, cy - 9, 17, 17);Rect rect = Rect(cx - 8, cy - 8, 15, 15);rectangle(rgb, rectedge, Scalar(0.4, 0.4, 0.4), 3, LINE_AA);rectangle(rgb, rect, Scalar(colorB, colorG, colorR), -1, LINE_AA);// 连接idea值与camera数据值line(rgb, ipoint, cpoint, Scalar(colorB, colorG, colorR), 5, LINE_AA);// 打印色卡块序号string numlable = to_string(i+1);int x = (ix + cx) / 2;int y = (iy + cy) / 2; putText(rgb, numlable, Point(x, y), FONT_HERSHEY_DUPLEX, 1, Scalar(0, 0, 0), 1, LINE_AA);
}
由于背景是以Mat形式存储,因此在绘制数据点时,需要将a, b的值转换成Mat的横纵坐标。其转换函数如下
int calculateCoordinate(int value, const Range range)
{int count = 0;for (int i = range.start; i < range.end; i++){if (value == i)return count;count++;}return -1;
}
4. 添加camera、idea图例。
// 打印camera值图例
Rect camera = Rect(150 - 10, 100 - 10, 20, 20);
rectangle(rgb, camera, Scalar(0.4, 0.4, 0.4), -1, LINE_AA);
string camerastr = "camera";
putText(rgb, camerastr, Point(170, 105), FONT_HERSHEY_DUPLEX, 1, Scalar(0, 0, 0), 1, LINE_AA);// 打印理想值图例
circle(rgb, Point(150, 150), 11, Scalar(0.4, 0.4, 0.4), -1, LINE_AA);
string ideastr = "idea";
putText(rgb, ideastr, Point(170, 160), FONT_HERSHEY_DUPLEX, 1, Scalar(0, 0, 0), 1, LINE_AA);
说明:
上述代码,采用VS2013+OpenCV3.0环境编译,且验证通过。使用者可自行准备camera和idea的数据进行验证。图1所示的色差图中,并未打印色差相关的信息,若有人使用源码,可根据自己的需求添加色差信息。
个人声明:
以上内容,纯属个人观点,不喜勿喷。未经本人同意,不得私自转载。博客中出现的代码仅供学习参考,不得有其他用途。若文中存在纰漏,或读者有更好的建议,欢迎留言探讨。也可邮箱联系:yxyx_0212@163.com
【OpenCV】绘图与注释——绘制色差图相关推荐
- Python使用Plotly绘图工具,绘制面积图
今天我们来讲一下如何使用Python使用Plotly绘图工具,绘制面积图 绘制面积图与绘制散点图和折线图的画法类似,使用plotly graph_objs 中的Scatter函数,不同之处在于面积图对 ...
- python动态横道图_详细解说Python使用Plotly绘图工具,绘制甘特图
今天来讲一下如何使用Python 的绘图工具Plotly来绘制甘特图的方法 甘特图大家应该了解熟悉,就是通过条形来显示项目的进度.时间安排等相关情况的. 我们今天来学习一下,如何使用ployly来绘制 ...
- OpenCV绘图和注释
OpenCV的绘图函数可以在任意深度的图像上工作,但在大多数情况下,它们只对图像的前三个通道有影响BGR,如果是单通道图像,则默认只影响第一个通道.大多数绘图函数都支持操作对象的颜色.宽度.线型和亚像 ...
- R统计绘图-factoextra包绘制PCA图
library(FactoMineR) library(factoextra) a <- read.table('infile.txt',header = T,row.names = 1) gr ...
- R语言绘图—快速绘制Lollipop图
今天我们还是来介绍用该包快速绘制"棒棒糖"图. 一.数据模拟 我们还是使用上期的数据,代码如下: myda<-data.frame( disease=c(rep(c(&quo ...
- 三种方法绘制雷达图,用最快的时间做出最好看的可视化图表
雷达图是通过多个离散属性比较对象的最直观工具,掌握绘制雷达图的方法将会为生活和工作带来乐趣. 本例数据来源于网络,某大学本科一年级不同分院学生在五种核心通识能力方面的数据,使用多个工具来绘制多级雷达图 ...
- MATLAB绘制主函数动态图,matlab绘制动态图
mathematica绘制动态图,"绘图之王"争霸赛--Excel才是绘图王道,matlab绘制动态图,动态三维图绘制 matlab动态图画法_数学_自然科学_专业资料.Matla ...
- 34.35.热图(heatmap)、创建带注释的热图、使用辅助函数的代码样式、图像显示、图像插值、将图像数据导入Numpy数组、将numpy数组绘制为图像
34.热图(heatmap) 34.1.创建带注释的热图 34.2.使用辅助函数的代码样式 35.图像显示 35.1.图像插值 35.2.将图像数据导入Numpy数组 35.3.将numpy数组绘制为 ...
- ComplexHeatmap |理解绘图逻辑绘制热图
作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 之前热图三部曲介绍了使用ggplot2和pheatmp绘制热图 R语言学习 - 热图绘制 (heatmap) ...
- matlab实时动态绘图clc,Matlab绘制动态 .gif 图
有的时候,gif 有助于对问题的理解,下面就介绍一下如何利用Matlab来绘制gif图.主要是源代码及结果展示,代码里面有注释,根据自己的需求,进行修改即可. 注: 以下程序均需另存为 m 文件运行, ...
最新文章
- linux查看服务器设备信息命令dmidecode
- C/C++结构体struct 与结构体数组和枚举型enum的结合使用
- sonar 质量配置 操作(质量规则)
- mycat 分表子查询_还不懂MyCat?一文带你深入剖析,实现MySQL读写分离
- 人生永无止境的意思是什么_人生追求永无止境名言
- .NET Core应用程序的2种部署方式
- es6 for(var item of list)
- Splunk数据处理
- mysql5.5.8安装图解_MySQL 5.5.8安装详细步骤-阿里云开发者社区
- C++ 捕获程序异常奔溃minidump
- 景区大数据可视化交互系统-全方位旅游服务平台,打造景区信息数据管理分析平台
- C语言判断一个数是奇数还是偶数
- java公路车的气嘴,5分钟了解自行车常见的三种气嘴
- 如何将Python文件.py打包成.exe可执行程序(最简教程吗)
- c语言中swap表示什么意思,swap是什么意思_单片机里的SWAP A是什么意思啊?
- 【OpenCV学习】 《OpenCV3编程入门》--毛星云 01 邂逅OpenCV(OpenCV基本概念与基本架构) ROS系统上的运用(python实现)
- LeeCode祖玛游戏
- 学术研究科研工具推荐,共9个,拿走不谢!
- Python版警察抓小偷游戏源代码,有多个难度级别
- 小故事——巴比奇和他的计算机
热门文章
- 电工模拟接线软件 app_老电工教你家装线路接线
- nero刻录软件中文版|nero express刻录软件 (附教程)
- Android版抢票神器使用指南及下载地址
- ​FMEA失效模式分析中风险评估「SOD」标准
- 【技术分享】数据之大,云动未来 - 弹性云数据库技术解析
- [转载] 计算机端口详解
- zutuanxue.com-DNS服务器
- 合肥科学岛安光所计算机应用,国家大气污染防治攻关联合中心成立 合肥科学岛安光所承担重任...
- python逐行写入txt文件_Python中将变量按行写入txt文本中的方法
- 电脑打开其他电脑的TXT文本时出现乱码的处理办法