C++ Opencv c++;使用两个线程从两个摄像头捕获图像

C++ Opencv c++;使用两个线程从两个摄像头捕获图像,c++,multithreading,opencv,thread-safety,C++,Multithreading,Opencv,Thread Safety,我已经写了这段代码,从两个ip摄像头抓取帧,然后将两个图像缝合在一起。 在Init中,我打开相机,然后在grabThread循环中,我抓取相机帧并设置互斥。 在getFrame中,我获取互斥锁并通过引用释放cvMat class GrabberThread { private: std::string device; cv::Mat mm; std::atomic<bool> grabOn; cv::VideoCapture cap; std:

我已经写了这段代码,从两个ip摄像头抓取帧,然后将两个图像缝合在一起。 在Init中,我打开相机,然后在grabThread循环中,我抓取相机帧并设置互斥。 在getFrame中,我获取互斥锁并通过引用释放cvMat

class GrabberThread {
private:
    std::string device;
    cv::Mat mm;
    std::atomic<bool> grabOn;
    cv::VideoCapture cap;
    std::mutex mtx;
public:
GrabberThread() : grabOn(false) {};
~GrabberThread()
{
    grabOn.store(false);
    cap.release();
}
bool Init(std::string dev)
{
    device = dev;
    cap.open(device);
    std::cout << "cap " << dev << " opened " << cap.isOpened() << "\n";
    return cap.isOpened();
}
void StopGrabing()
{
    grabOn.store(false);
}
void GrabThread()
{
    if (!cap.isOpened()) cap.open(device);
    if (!cap.isOpened()) return;
    cv::Mat tmp;
    grabOn.store(true);
    while (grabOn.load() == true)
    {
        if (!cap.read(tmp))
            continue;
        {
            std::lock_guard<std::mutex> lock(mtx);
            tmp.copyTo(mm);
        }
    }
} 
void getFrame(cv::Mat& m)
{
    {
        std::lock_guard<std::mutex> lock(mtx);
        mm.copyTo(m);
    }
}
}; 
class-read{
私人:
字符串设备;
cv::Mat mm;
std::原子抓子;
cv::视频捕获帽;
std::互斥mtx;
公众:
GrabberThread():grabOn(false){};
~GrabberThread()
{
grabOn.store(假);
释放帽();
}
bool Init(std::string dev)
{
设备=dev;
开盖(装置);

std::cout矩阵周围的同步很好,但是析构函数可能会导致问题。如果dtor在
GrabThread
完成循环迭代之前完成,则所有成员的生命周期都将结束,并且访问它们是未定义的行为。您应该使用或其他同步工具来确保
GrabThread
在dtor返回之前已完成