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();
是新开一个线程实时刷新图片显示。