由于一些特殊原因,需要将色差图显示在Qt绘制的软件界面中。由于调用matlab编译动态库的运行效率较低,因此采用OpenCV提供的绘图与注释功能来绘制色差图。其最终效果如图1所示,图中camera数据由imx347模组拍摄的X-Rite 24色卡,在经过简单的去马赛克和白平衡处理后得到的数据值;而idea数据则为CIE标准值。

图1 色差图效果示意    绘制色差图,需要使用到OpenCV提供的直线、矩形、圆、文字等绘制方法。绘制色差图所使用的函数已经在表1中给出。 表1 色差图使用的绘图与注释函数

函数 描述
cv::circle() 画一个简单的圆
cv::line() 画一条简单的直线
cv::rectangle() 画一个简单的矩形
cv::putText() 在图像中绘制指定的文字

  

关于绘制色差图,主要经过了以下步骤:

  1. 准备Camera数据,并将数据从rgb域转换到lab域;
  2. 绘制色差图背景;
  3. 绘制camera、idea数据点,并将数据点连线,打印色卡块序号;
  4. 添加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】绘图与注释——绘制色差图相关推荐

  1. Python使用Plotly绘图工具,绘制面积图

    今天我们来讲一下如何使用Python使用Plotly绘图工具,绘制面积图 绘制面积图与绘制散点图和折线图的画法类似,使用plotly graph_objs 中的Scatter函数,不同之处在于面积图对 ...

  2. python动态横道图_详细解说Python使用Plotly绘图工具,绘制甘特图

    今天来讲一下如何使用Python 的绘图工具Plotly来绘制甘特图的方法 甘特图大家应该了解熟悉,就是通过条形来显示项目的进度.时间安排等相关情况的. 我们今天来学习一下,如何使用ployly来绘制 ...

  3. OpenCV绘图和注释

    OpenCV的绘图函数可以在任意深度的图像上工作,但在大多数情况下,它们只对图像的前三个通道有影响BGR,如果是单通道图像,则默认只影响第一个通道.大多数绘图函数都支持操作对象的颜色.宽度.线型和亚像 ...

  4. R统计绘图-factoextra包绘制PCA图

    library(FactoMineR) library(factoextra) a <- read.table('infile.txt',header = T,row.names = 1) gr ...

  5. R语言绘图—快速绘制Lollipop图

    今天我们还是来介绍用该包快速绘制"棒棒糖"图. 一.数据模拟 我们还是使用上期的数据,代码如下: myda<-data.frame( disease=c(rep(c(&quo ...

  6. 三种方法绘制雷达图,用最快的时间做出最好看的可视化图表

    雷达图是通过多个离散属性比较对象的最直观工具,掌握绘制雷达图的方法将会为生活和工作带来乐趣. 本例数据来源于网络,某大学本科一年级不同分院学生在五种核心通识能力方面的数据,使用多个工具来绘制多级雷达图 ...

  7. MATLAB绘制主函数动态图,matlab绘制动态图

    mathematica绘制动态图,"绘图之王"争霸赛--Excel才是绘图王道,matlab绘制动态图,动态三维图绘制 matlab动态图画法_数学_自然科学_专业资料.Matla ...

  8. 34.35.热图(heatmap)、创建带注释的热图、使用辅助函数的代码样式、图像显示、图像插值、将图像数据导入Numpy数组、将numpy数组绘制为图像

    34.热图(heatmap) 34.1.创建带注释的热图 34.2.使用辅助函数的代码样式 35.图像显示 35.1.图像插值 35.2.将图像数据导入Numpy数组 35.3.将numpy数组绘制为 ...

  9. ComplexHeatmap |理解绘图逻辑绘制热图

    作者:严涛 浙江大学作物遗传育种在读研究生(生物信息学方向)伪码农,R语言爱好者,爱开源. 之前热图三部曲介绍了使用ggplot2和pheatmp绘制热图 R语言学习 - 热图绘制 (heatmap) ...

  10. matlab实时动态绘图clc,Matlab绘制动态 .gif 图

    有的时候,gif 有助于对问题的理解,下面就介绍一下如何利用Matlab来绘制gif图.主要是源代码及结果展示,代码里面有注释,根据自己的需求,进行修改即可. 注: 以下程序均需另存为 m 文件运行, ...

最新文章

  1. linux查看服务器设备信息命令dmidecode
  2. C/C++结构体struct 与结构体数组和枚举型enum的结合使用
  3. sonar 质量配置 操作(质量规则)
  4. mycat 分表子查询_还不懂MyCat?一文带你深入剖析,实现MySQL读写分离
  5. 人生永无止境的意思是什么_人生追求永无止境名言
  6. .NET Core应用程序的2种部署方式
  7. es6 for(var item of list)
  8. Splunk数据处理
  9. mysql5.5.8安装图解_MySQL 5.5.8安装详细步骤-阿里云开发者社区
  10. C++ 捕获程序异常奔溃minidump
  11. 景区大数据可视化交互系统-全方位旅游服务平台,打造景区信息数据管理分析平台
  12. C语言判断一个数是奇数还是偶数
  13. java公路车的气嘴,5分钟了解自行车常见的三种气嘴
  14. 如何将Python文件.py打包成.exe可执行程序(最简教程吗)
  15. c语言中swap表示什么意思,swap是什么意思_单片机里的SWAP A是什么意思啊?
  16. 【OpenCV学习】 《OpenCV3编程入门》--毛星云 01 邂逅OpenCV(OpenCV基本概念与基本架构) ROS系统上的运用(python实现)
  17. LeeCode祖玛游戏
  18. 学术研究科研工具推荐,共9个,拿走不谢!
  19. Python版警察抓小偷游戏源代码,有多个难度级别
  20. 小故事——巴比奇和他的计算机

热门文章

  1. 电工模拟接线软件 app_老电工教你家装线路接线
  2. nero刻录软件中文版|nero express刻录软件 (附教程)
  3. Android版抢票神器使用指南及下载地址
  4. ​FMEA失效模式分析中风险评估「SOD」标准
  5. 【技术分享】数据之大,云动未来 - 弹性云数据库技术解析
  6. [转载] 计算机端口详解
  7. zutuanxue.com-DNS服务器
  8. 合肥科学岛安光所计算机应用,国家大气污染防治攻关联合中心成立 合肥科学岛安光所承担重任...
  9. python逐行写入txt文件_Python中将变量按行写入txt文本中的方法
  10. 电脑打开其他电脑的TXT文本时出现乱码的处理办法