opencv中startWindowThread()的使用

本文探讨了OpenCV与ROS自带OpenCV在imshow功能上的不同,包括工具条、图片放大缩小功能及waitKey行为差异。通过分析,发现cv::startWindowThread()函数的作用在于确保图片实时刷新,解决了连续显示图片时的未响应问题。

opencv中startWindowThread()的使用

个人总结,目的是给自己日后参考,或让新人少走些弯路。如果有错请指出,我会及时修改,感谢 ?

相关/参考链接

本人机器开发环境

  • ubuntu 16.04

问题

最近在ROS自带的opencv(下面称cv_ros)和自己从官网下载用cmake编译的opencv(下面称cv)中切换,发现了它们在imshow()上的一些不同:

  • cv_ros中的imshow带工具条,并且可以对imshow的图片用鼠标滚轮放大缩小,放大到一定倍数时可以看到每个像素的像素值RGB。而cv则没有这个工具条。(自己编译的opencv如何能达到ros自带opencv的效果?需要打开哪些选项?有知道的欢迎留言~20190522更新,首先安装QT,然后在cmake OpenCV时候,勾选WITH_QT即可
  • waitKey(0)的不同。考虑如下代码
cv::namedWindow("image", cv::WINDOW_NORMAL);
//cv::startWindowThread();
for(i=0;i<100;i++)
{
	char image_name[256] = {0};
	sprintf(image_name, "%06d.png", i);
	Mat image = imread(image_name);
	cv::imshow("image", image);
	cv::waitKey(0);
}

代码每循环一次,从图片序列中读取一张图片并imshow显示,注意到cv::waitKey(0);,所以每次循环会等待用户按下一个按键(比如空格键)才会进行下次循环,如果用户需要连续不断显示图片序列,可以一直按住空格键,这样便会不断读取图片序列进行显示。
然而,一直按住空格键时,cv_ros与cv会有不同的表现。在cv_ros中一切正常,你可以看到图片不断刷新,而cv中的imshow窗口却会未响应,直到你松开按键一会儿才刷新显示。

为什么会这样?

我猜测cv窗口未响应是因为按键缓冲区有残留的键值没有读出,因此下一次cv::waitKey(0);时直接读取残留按键,因此还没有来得及刷新图片显示就退出cv::waitKey(0);函数。

解决

在创建窗口后,调用cv::startWindowThread();,即把上面代码中的cv::startWindowThread();取消注释,则可以正常显示。

cv::startWindowThread()作用

对于该函数,opencv官方文档没有说明:
在这里插入图片描述
经过我的尝试,在调用cv::startWindowThread();后,即使没有调用waitKey()函数,图片也依然实时刷新。大家知道,opencv的imshow()函数调用以后,并不立即刷新显示图片,而是等到waitKey()后才会刷新图片显示,所以我猜测cv::startWindowThread();是新开一个线程实时刷新图片显示。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值