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