点击上方“小白学视觉”,选择加"星标"或“置顶”
重磅干货,第一时间送达
OpenCV 中最常用的一个API函数 imshow 各种编程与应用技巧,是否有你以前一直想的,但是从来没有成功过的操作!
01 最简单的显示方式
很多人学习OpenCV,学会前面两个函数就是
Imread – 读图像
Imshow – 显示图像
代码看起来是这样
Mat src = imread("D:/images/test.png");
imshow("input", src);
觉得好简单,真的好简单,但是他们遇到大图的时候,就会发现OpenCV无法完整显示!想把多张图像,显示在一个窗口里面,无法做到!显示浮点数图像全白!这些问题其实是你不了解如何正确使用imshow导致,下面就分享一下本人的做法,也许你会有更好的,欢迎留言拍砖!
02 浮点数图像显示的正确姿势
上面的图像,左侧是输入图像,中间与右侧都是浮点数图像的显示结果。中间图像对应的代码如下:
Mat m1;
src.convertTo(m1, CV_32F);
imshow("m1", m1);
显示的结果是全白色,没有任何可见的信息,难道是程序错拉,程序没有错误,Mat类型转换从读入图像的CV_8UC3转为CV_32FC3也没有错误。修改一下代码
Mat m2;
src.convertTo(m2, CV_32F, 0.00392);
imshow("m2", m2);
只是在类型转换的时候多加了一个参数,这个参数是什么 1/255 = 0.00392
意思是把像素值从0~255 转换为0~1之间的浮点数,然后再显示,显示结果对应上图最右侧。
解释:原来imshow显示浮点数的时候,只支持0~1之间的浮点数显示,超过1就认为是白色,所以在没有对值域做rescale的时候,中间的浮点数Mat显示只能是白色。
03 如何在一个Mat对象中显示多张图
这个是很多人问我过的问题,其实很简单,创建一个空白的Mat,把两张图的内容放进去,然后显示新创建的Mat对象就可以把两张图显示在一个窗口里面。先看效果
代码实现如下:
Mat src1 = imread("D:/images/lena.png");
Mat src2 = imread("D:/images/t3.jpg");
imshow("src1", src1);
imshow("src2", src2);
// 构建新图像的大小
int width = src1.cols + src2.cols;
int height = max(src1.rows, src2.rows);
Mat two = Mat::zeros(Size(width, height), src1.type());
// 构建ROI
Rect r1(0, 0, src1.cols, src1.rows);
Rect r2(0, 0, src2.cols, src2.rows);
r2.x = src1.cols;
// 内容copy
src1.copyTo(two(r1));
src2.copyTo(two(r2));
imshow("two images demo", two);
waitKey(0);
上述代码,基本上已经很通用,直接读入任意两张图像都可以,唯一需要注意的是合并之后图像太大无法显示怎么办,没关系,我们这就来搞定这个问题。
04 图像太大,无法完整显示怎么办
这个问题,其实不能怪imshow,主要原因出在opencv的默认窗口创建上面,在OpenCV中你可以直接调用imshow函数去显示图像,默认会创建一个同名的窗口,这个窗口的默认打开模式是WINDOW_AUTOSIZE, 这种情况下你是无法调整窗口大小的,很多人其实是掉到这个坑里面去的,解决办法就是代码显式创建一个可以调整大小的窗口,一行代码搞定:
namedWindow("input", WINDOW_FREERATIO)
然后调用
imshow("input", yourMat)
显示时候,注意保持窗口名称一致即可,再大的图像显示都没有问题,前提是内存真的够大!
千万不要尝试的Mat类型图像显示
Imshow其实只支持 CV_8U与CV_32F 类型的数据显示,其它Mat类型数据最好先转换为这两种类型之一再显示,不然你可能会得到各种错误,各种掉坑。建议不要尝试跟API对着干,倒霉的只会是你自己。
下载1:OpenCV-Contrib扩展模块中文版教程
在「小白学视觉」公众号后台回复:扩展模块中文教程,即可下载全网第一份OpenCV扩展模块教程中文版,涵盖扩展模块安装、SFM算法、立体视觉、目标跟踪、生物视觉、超分辨率处理等二十多章内容。
下载2:Python视觉实战项目52讲
在「小白学视觉」公众号后台回复:Python视觉实战项目,即可下载包括图像分割、口罩检测、车道线检测、车辆计数、添加眼线、车牌识别、字符识别、情绪检测、文本内容提取、面部识别等31个视觉实战项目,助力快速学校计算机视觉。
下载3:OpenCV实战项目20讲
在「小白学视觉」公众号后台回复:OpenCV实战项目20讲,即可下载含有20个基于OpenCV实现20个实战项目,实现OpenCV学习进阶。
交流群
欢迎加入公众号读者群一起和同行交流,目前有SLAM、三维视觉、传感器、自动驾驶、计算摄影、检测、分割、识别、医学影像、GAN、算法竞赛等微信群(以后会逐渐细分),请扫描下面微信号加群,备注:”昵称+学校/公司+研究方向“,例如:”张三 + 上海交大 + 视觉SLAM“。请按照格式备注,否则不予通过。添加成功后会根据研究方向邀请进入相关微信群。请勿在群内发送广告,否则会请出群,谢谢理解~