如何使用OpENCV解决图像处理摄像头IO延迟
How to solve image processing camera IO delay with OpenCV
我有一个像这样起作用的opencv程序:
VideoCapture cap(0);
Mat frame;
while(true) {
cap >> frame;
myprocess(frame);
}
问题是myprocess
是否需要长时间的时间比相机的IO间隔更长,捕获的框架被延迟,无法与实时同步框架。
因此,我认为要解决这个问题,应该使摄像机流式传输和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/doc/reading_and_writing_video.html#videocapture-grab>
在带有多坐标跟踪的项目中,我使用了2个缓冲区(cv :: mat框架[2])和2个线程:
-
一个用于捕获下一帧并检测对象的线程。
-
第二个线程用于跟踪检测到的对象并在框架上绘制结果。
i使用index = [0,1]进行缓冲区交换,并且该索引被静音保护。用于有关工作结束的信号,使用了2个条件变量。
首先使用框架[capture_ind]缓冲区的CatureAndDetect和先前帧[1-capture_ind]缓冲区的跟踪作用。下一步 - 切换缓冲区:capture_ind = 1 -capture_ind。
您可以在此处进行此项目:Multitarget-Tracker。
相关文章:
- Seg Fault Issue C++ (file IO / getline)
- 如何防止 c++ 在从浮点型转换为双精度型(不适用于 IO)时添加额外的小数?
- 为什么在读取文件大小时文件IO速度会发生变化
- OpenCV 4.1.2 - 从网络摄像头获取帧并将其拆分
- 使用OpenCV和覆盆子上的多个网络摄像头拍摄延时摄影,出现多个V4L错误
- Agora.io 虚幻引擎插件构建错误
- 不将数据 socket.io c++(客户端)发送到 nodejs(服务器)socket.io
- ASIO signal_set多个 IO 线程不可靠,具体取决于代码顺序?
- 使用源读取器从网络摄像头源获取 H264 样本
- 通过 Tor 服务C++ socket.io 客户端
- 如何使用可视化代码和平台IO将环境变量注入CPP文件?
- 如何读取 google::p rotobuf::io::CodedOutputStream::WriteVarint32
- Conan.io 在编译步骤中或已经在签出时
- 为什么我不能让 3 个网络摄像头与 pthreads 并行运行?
- C++中真正的异步文件 IO
- 从 OpenCV 3 切换到 OpenCV 4 会导致网络摄像头以最大 5 fps 的速度录制,而不是通常的 30 f
- 如何使用realsense摄像头调试ROS错误消息
- 在C++中返回 IO 对象的目的是什么?
- 使用 Broadcast 发出的从节点服务器发送的数据不能被 C++ 套接字 IO 客户端读取
- 如何使用OpENCV解决图像处理摄像头IO延迟