C++ 通过引用传递mat对象OpenCv

C++ 通过引用传递mat对象OpenCv,c++,multithreading,opencv,concurrency,C++,Multithreading,Opencv,Concurrency,我正在尝试从一个线程(不同的类)获取网络摄像机视频源。。我想把Mat对象返回到main方法中。。。到目前为止,我只知道这样做是将在main方法中创建的Mat对象的引用传递给线程。 但它并没有完美地工作,这个错误出现了 (控制台应用程序10.exe中0x00983489(opencv_core248d.dll)处的未处理异常:0xC0000005:访问冲突写入位置0x05671050。)。 有人能帮我解决这个问题吗 原因是我的开发基于版主设计模式,这就是为什么。 谢谢你 #include <

我正在尝试从一个线程(不同的类)获取网络摄像机视频源。。我想把Mat对象返回到main方法中。。。到目前为止,我只知道这样做是将在main方法中创建的Mat对象的引用传递给线程。 但它并没有完美地工作,这个错误出现了 (控制台应用程序10.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;
}  
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
使用名称空间cv;
类摄像机
{
公众:
无效abc(Mat和img){//camara方法
Mat图像;
视频捕获上限(0);
namedWindow(“窗口”,CV\u窗口\u自动调整大小);
namedWindow(“win2”,CV\u窗口\u自动调整大小);
while(true)
{
cap>>图像;
如果(!image.empty())
{
img=image.clone();
imshow(“win2”,img);
imshow(“窗口”,图像);
}
等待键(1);
}
}
void操作符()(Mat&img){//thred类的方法
abc(img);//将对象传递给方法
}
};
int main()
{
Mat mImg;//主方法Mat
namedWindow(“win3”,CV\u窗口\u自动调整大小);
线程t1((Camera()),ref(mImg));//将主方法垫传递给经过REFF的踏板
while(true)
{
如果(!mImg.empty())
imshow(“win3”,mImg);//显示主方法对象
等待键(1);
}
系统(“暂停”);
返回0;
}  

使用线程是使用摄像头的好主意,但必须使用互斥锁来阻止图像数据访问。您可以很容易地找到文档和示例


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

注意,
cv::Mat
具有引用语义,因此您可以通过值传递它。如何??我不知道怎么做…:(@juanchopanza,除非该方法重新分配Mat内存;)@gamal:线程t1对Mat做什么?您可能需要一些线程同步(例如互斥),以便
if(!mImg.empty())
imshow(“win3”,mImg)不会被处理mat数据的另一个线程中断。我的猜测是,
t1
将在“
imshow
期间重新分配
mImg
”的内存,以便imshow将读取不再合法的内存将重新分配内存,若img和图像的大小不相同
#include
可能也会为您提供一些互斥类!哈哈哈,它起作用了。。。thax代表所有人……:)::)\m/对于这两个while循环,它们都被一个本地互斥对象锁定。。。很好,它能工作。。。。。(Y) 。。while(true){mtx.lock();//编码mtx.unlock();}