簡體   English   中英

Opencv c++ 使用兩個線程從兩個攝像頭捕獲圖像

[英]Opencv c++ capture images from two cameras using two threads

我編寫了這段代碼,它從兩個 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);
    }
}
}; 

然后我從線程外部調用 getFrame 來獲取我抓取的圖像。 到目前為止,一切正常,但是一切正常還是我要冒一些競爭條件的風險? 非常感謝。

矩陣周圍的同步很好,但是您的析構函數可能會導致問題。 如果 dtor 在GrabThread完成循環迭代之前完成,則所有成員的生命周期都將結束,訪問它們是未定義的行為。 您應該使用condition_variable或其他一些同步工具來確保GrabThread在您的 dtor 返回之前完成。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM