我已经实现了一个openCV程序,它可以从视频文件中捕获帧并处理它并创建一个新文件。这是针对单个文件。现在我想要多个文件。然后我对POSIX线程pthread库有了一个想法。这是一个好主意还是坏主意。实际上,当我在opencv程序中实现pthread时,我遇到了一些错误:
OpenCV错误:断言失败(_src.sameSize(_dst)&& dcn == scn)in 累积,文件 /home/satinder/opencv_installation/OpenCV/opencv/modules/imgproc/src/accum.cpp, 第915行
什么(): /home/satinder/opencv_installation/OpenCV/opencv/modules/imgproc/src/accum.cpp:915: 错误:(-215)_src.sameSize(_dst)&& dcn == scn in function accumulate 中止(核心倾销)
损坏的双链表:0x00007fcd048f73d0 *** 中止(核心倾销)
seg fault 也有一段时间。
我是否有可能实现多线程或等效的方法我的目标是制作一个程序,可以获得更多的输入文件以进行相同的处理。
以下是我的代码快照:
#include "opencv2/highgui/highgui.hpp"
#include <sys/types.h>
#include <pthread.h>
#include <iostream>
using namespace cv;
using namespace std;
void * VideoCap(void *);
void * VideoCap(void *arg)
{
VideoCapture cap((char *)arg); // open the video file for reading
if ( !cap.isOpened() ) // if not success, exit program
{
cout << "Cannot open the video file" << endl;
exit(1);
}
//cap.set(CV_CAP_PROP_POS_MSEC, 300); //start the video at 300ms
double fps = cap.get(CV_CAP_PROP_FPS); //get the frames per seconds of the video
cout << "Frame per seconds : " << fps << endl;
namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
while(1)
{
Mat frame;
bool bSuccess = cap.read(frame); // read a new frame from video
if (!bSuccess) //if not success, break loop
{
cout << "Cannot read the frame from video file" << endl;
break;
}
imshow("MyVideo", frame); //show the frame in "MyVideo" window
if(waitKey(30) == 27) //wait for 'esc' key press for 30 ms. If 'esc' key is pressed, break loop
{
cout << "esc key is pressed by user" << endl;
break;
}
}
}
int main(int argc, char* argv[])
{
int ret ;
pthread_t th[2];
ret = pthread_create(&th[0] , NULL , VideoCap , (void *)"cctv3.mp4");
if(0 == ret)
{
cout << "Thread 1 is created successfull" << endl;
}
ret = pthread_create(&th[1] , NULL , VideoCap , (void *)"cctv10.mp4");
if(0 == ret)
{
cout << "Thread 2 is created successfull" << endl;
}
pthread_join(th[0] , NULL);
pthread_join(th[1] , NULL);
return 0;
}
答案 0 :(得分:0)
您的代码存在一些问题
namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"
您正在创建两个线程,因此窗口应具有不同的标识符。
namedWindow((char *)arg, CV_WINDOW_AUTOSIZE);
...
imshow((char *)arg, frame);
由于这个问题是用 linux 标签发布的,我猜测gtk是相关的。插入指令后
#include <gdk/gdk.h>
#include <gtk/gtkmain.h>
在文件的开头,然后在main()
pthread_t th[2];
gtk_disable_setlocale();
gtk_init(&argc, &argv);
gdk_threads_init();
可能需要新的链接器/编译器标志,
g++ -O -Wall test.cpp -lopencv_highgui -lopencv_core `pkg-config --libs --cflags gdk-2.0 gtk+-2.0`
在这些更改之后仍然偶尔会发生崩溃,因此我添加了gdk_threads_enter()
和gdk_threads_leave();
次来测试是否有帮助:
gdk_threads_enter();
namedWindow ((char *) arg, CV_WINDOW_AUTOSIZE);
gdk_threads_leave();
由于崩溃不可重现,因此很难判断这些线是否有任何影响。