通过引用传递一个垫子对象 OpenCv

Posted

技术标签:

【中文标题】通过引用传递一个垫子对象 OpenCv【英文标题】:pass by reference a mat object OpenCv 【发布时间】:2014-10-23 10:30:24 【问题描述】:

我正在尝试从线程(不同的类)获取网络摄像头视频源。我想将 Mat 对象返回给 main 方法...到目前为止,我只知道这样做是传递一个引用在线程的 main 方法中创建的 Mat 对象。 但它工作不完美,出现此错误 (ConsoleApplication10.exe 中 0x00983489 (opencv_core248d.dll) 处的未处理异常:0xC0000005:访问冲突写入位置 0x05671050。)。 谁能帮我解决这个问题。

原因是我的开发是基于 Moderator 设计模式构建的,这就是原因。 谢谢你...!!!

#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;
  

【问题讨论】:

请注意,cv::Mat 具有引用语义,因此您可以按值传递它。 怎么样??我不明白该怎么做... :( @juanchopanza 除非该方法重新分配 Mat 内存 ;) @gamal : 线程 t1 对垫子做了什么?您可能需要一些线程同步(例如互斥锁),以便if(!mImg.empty())imshow("win3", mImg); 不会被其他线程操作垫子的数据中断。我的猜测是,t1 将重新分配 mImg “期间”imshow 的内存,以便 imshow 将读取不再合法的内存。 查看了您的函数:img=image.clone(); 将重新分配内存,如果 img 和 image 的大小不相同。 #include &lt;thread&gt; 可能也会给你一些互斥类! 【参考方案1】:

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

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

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

【讨论】:

哈哈它奏效了...谢谢所有人..... :) :) :) :) 两个 while 循环都被一个本地互斥对象锁定...很好用..... (Y).. while(true) mtx.lock(); //代码 mtx.unlock();

以上是关于通过引用传递一个垫子对象 OpenCv的主要内容,如果未能解决你的问题,请参考以下文章

通过引用而不是按值传递 OpenCV C++

通过引用递归传递对象? JAVA

Java中对象对象引用堆栈值传递以及引用传递的详解

通过引用方法传递对象数组

Java中对象对象引用堆栈值传递以及引用传递的详细解释

通过 IPC 跨进程传递对 COM 对象的引用?