OpenCV使用cv::imshow在子线程中更新图片不刷新

Ubuntu 16.04上测试OpenCV 3.2,遇到一个在子线程中更新图像,而界面不刷新的问题。

$ sudo apt-get install libopencv-dev

编译执行如下代码:

#include <pthread.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <stdlib.h>

void* imshowWorker(void*){
	for(int i = 0;i < 100;i++){
		char str[10+1];
		snprintf(str, 10,"%d",i);
		cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 );  
		cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 ));
		cv::imshow("Number View", img ); 
		if(i > 90){
			i = 0;		
		}
	}	
}

int main(void){
	cv::namedWindow("Number View");
	pthread_t id;
	pthread_create(&id,NULL,imshowWorker,NULL);
	getchar();
	return (0);
}
$ g++ opencv_imshow.cpp   -I `pkg-config --libs opencv` -lpthread -o opencv_imshow

可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。

这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。

修改后的代码如下:

#include <pthread.h>
#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <stdio.h>
#include <stdlib.h>

void* imshowWorker(void*){
	for(int i = 0;i < 100;i++){
		char str[10+1];
		snprintf(str, 10,"%d",i);
		cv::Mat img = cv::Mat::zeros( 100, 100, CV_8UC3 );  
		cv::putText(img,(char*)str,cv::Point( 50, 50 ),cv::FONT_HERSHEY_SIMPLEX,1,cv::Scalar( 255, 0, 0 ));
		cv::imshow("Number View", img ); 
		cv::waitKey(30);
		if(i > 90){
			i = 0;		
		}
	}	
}

int main(void){
	cv::namedWindow("Number View");
	pthread_t id;
	pthread_create(&id,NULL,imshowWorker,NULL);
	getchar();
	return (0);
}

也就是每次更新图片后手工调用代码

cv::waitKey(30);

这个等候时间,只要大于0即可,比如:

cv::waitKey(1);

参考链接


c++ opencv image not display inside the boost thread

发布者

《OpenCV使用cv::imshow在子线程中更新图片不刷新》上有1条评论

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注