通过引用传递一个mat对象OpenCv

时间:2014-10-23 10:30:25

标签: c++ multithreading opencv concurrency

我试图从一个线程(不同的类)获取网络摄像头视频源..我想将Mat对象返回到main方法...到目前为止,我知道这只是为了通过在主方法中创建的Mat对象的引用。  但它没有完美运行,出现此错误 (ConsoleApplication10.exe中0x00983489(opencv_core248d.dll)的未处理异常:0xC0000005:访问冲突写入位置0x05671050。)。 任何人都可以帮我解决这个问题。

原因是我的开发基于主持人设计模式进行构建,这就是原因。 谢谢...!!!

#include <opencv/cv.h>
#include <opencv/highgui.h>
#include <iostream>
#include <time.h>
#include <thread>

using namespace std;
using namespace cv;
class Camera
{
public:
    void abc(Mat &img){ //camara method

        Mat image;
        VideoCapture cap(0);
        namedWindow("window", CV_WINDOW_AUTOSIZE);
        namedWindow("win2", CV_WINDOW_AUTOSIZE);

        while(true)
        {
            cap >> image;   
            if(!image.empty())
            {
                img=image.clone();
                imshow("win2", img);
                imshow("window", image);
            }
            waitKey(1);
        }
    }
    void operator()(Mat &img){//thred method of the class
        abc(img); // passing Object TO method
    }
};

int main ()
{
    Mat mImg;//main method Mat
    namedWindow("win3", CV_WINDOW_AUTOSIZE);
    thread t1((Camera()),ref(mImg)); //passing main method Mat to the Tread PASSING BY REFF
    while(true)
    {
        if(!mImg.empty())
            imshow("win3", mImg);// display main method mat Object
        waitKey(1);
    }

    system("pause");
    return 0;
}  

1 个答案:

答案 0 :(得分:2)

使用线程最好使用相机,但必须使用互斥锁来阻止图像数据访问。您可以轻松找到文档和示例。

http://www.cplusplus.com/reference/mutex/mutex/

您还可以添加一个布尔值来指示新图像是否可用(如果您的处理速度快于您的处理),或使用缓冲区存储多个图像。