gpt4 book ai didi

c++ - 如何用OpenCV解决图像处理相机IO延迟

转载 作者:塔克拉玛干 更新时间:2023-11-03 07:39:11 25 4
gpt4 key购买 nike

我有一个像这样工作的 OpenCV 程序:

VideoCapture cap(0);
Mat frame;
while(true) {
cap >> frame;
myprocess(frame);
}

问题是如果myprocess耗时比camera的IO间隔长,捕获的帧会延迟,无法与实时同步。

所以,我觉得要解决这个问题,应该让camera streaming和myprocess并行运行。一个线程做IO操作,另一个做CPU计算。当相机完成捕获后,发送到工作线程进行处理。

这个想法对吗?有没有更好的策略来解决这个问题?

演示:

int main(int argc, char *argv[])
{
cv::Mat buffer;
cv::VideoCapture cap;
std::mutex mutex;
cap.open(0);
std::thread product([](cv::Mat& buffer, cv::VideoCapture cap, std::mutex& mutex){
while (true) { // keep product the new image
cv::Mat tmp;
cap >> tmp;
mutex.lock();
buffer = tmp.clone(); // copy the value
mutex.unlock();
}
}, std::ref(buffer), cap, std::ref(mutex));
product.detach();

while (cv::waitKey(20)) { // process in the main thread
mutex.lock();
cv::Mat tmp = buffer.clone(); // copy the value
mutex.unlock();
if(!tmp.data)
std::cout<<"null"<<std::endl;
else {
std::cout<<"not null"<<std::endl;
cv::imshow("test", tmp);
}

}
return 0;
}

或者使用线程不断清除缓冲区。

int main(int argc, char *argv[])
{
cv::Mat buffer;
cv::VideoCapture cap;
std::mutex mutex;
cap.open(0);
std::thread product([](cv::Mat& buffer, cv::VideoCapture cap, std::mutex& mutex){
while (true) { // keep product the new image
cap.grab();
}
}, std::ref(buffer), cap, std::ref(mutex));
product.detach();
int i;
while (true) { // process in the main thread
cv::Mat tmp;
cap.retrieve(tmp);
if(!tmp.data)
std::cout<<"null"<<i++<<std::endl;
else {
cv::imshow("test", tmp);
}
if(cv::waitKey(30) >= 0) break;
}
return 0;
}

我认为第二个演示应该基于 https://docs.opencv.org/3.0-beta/modules/videoio/doc/reading_and_writing_video.html#videocapture-grab 工作, 但它不是...

最佳答案

在多目标跟踪项目中,我使用了 2 个帧缓冲区 (cv::Mat frames[2]) 和 2 个线程:

  1. 一个线程用于捕获下一帧并检测对象。

  2. 第二个线程用于跟踪检测到的对象并在帧上绘制结果。

我使用 index = [0,1] 进行缓冲区交换,并且此索引受互斥锁保护。为了发出有关工作结束的信号,使用了 2 个条件变量。

首先,CatureAndDetect 与 frames[capture_ind] 缓冲区一起工作,Tracking 与之前的 frames[1-capture_ind] 缓冲区一起工作。下一步 - 切换缓冲区:capture_ind = 1 - capture_ind。

你能在这里做这个项目吗:Multitarget-tracker .

关于c++ - 如何用OpenCV解决图像处理相机IO延迟,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55273689/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com