Opencv c ++ захватывает изображения с двух камер, используя два потока - PullRequest
0 голосов
/ 17 марта 2020

Я написал этот код, который захватывает кадры с двух ip-камер и после того, как он объединяет два изображения. В Init я открываю камеру, затем в grabThread l oop Я хватаю кадры камеры и устанавливаю мьютекс. В 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 извне потока, чтобы получить изображения, которые я захватил. До сих пор все работает нормально, но все ли в порядке или я рискую какими-то условиями гонки? Большое спасибо.

1 Ответ

0 голосов
/ 17 марта 2020

Синхронизация вокруг матрицы в порядке, однако ваш деструктор, скорее всего, вызовет проблемы. Если dtor завершается до того, как GrabThread завершит все итерации oop, время жизни всех членов закончится, и доступ к ним будет неопределенным поведением. Вам следует использовать condition_variable или другое средство синхронизации, чтобы убедиться, что GrabThread завершено до того, как ваш dtor вернется.

...