在Ubuntu 16.04
上测试OpenCV 3.2
,遇到一个在子线程中更新图像,而界面不刷新的问题。
1 |
$ sudo apt-get install libopencv-dev |
编译执行如下代码:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
#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); } |
1 |
$ g++ opencv_imshow.cpp -I `pkg-config --libs opencv` -lpthread -o opencv_imshow |
可以看到,上面的代码执行之后,界面并没有出现,即使出现也没有刷新。
这个问题是由于界面更新必须在主线程中执行,需要手工通知主线程。
修改后的代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
#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); } |
也就是每次更新图片后手工调用代码
1 |
cv::waitKey(30); |
这个等候时间,只要大于0
即可,比如:
1 |
cv::waitKey(1); |