我们可以使用pthread库进行opencv C ++编程吗?

时间:2016-01-28 10:10:28

标签: c++ c linux multithreading opencv

我已经实现了一个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;
}

1 个答案:

答案 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();

由于崩溃不可重现,因此很难判断这些线是否有任何影响。