gpt4 book ai didi

c++ - OpenCV显示和处理网络摄像头流

转载 作者:可可西里 更新时间:2023-11-01 11:12:28 25 4
gpt4 key购买 nike

我正在寻找使用来自网络摄像头的 opencv 处理流。我的目标是检测每一帧的矩形。我能够显示结果,但帧速率非常慢,~1 fps。

这是我的源代码的概述:

int main( int argc, char** argv ) {

CvCapture* cap=cvCreateCameraCapture(0);
cvNamedWindow("LiveFeed",CV_WINDOW_AUTOSIZE);

while(true) {
frame=cvQueryFrame(cap);
if(!frame)
printf("\n no");
else {
Mat mat_img(frame);
std::vector<std::vector<cv::Point>> rectangle = findSquaresInImage(mat_img);
rectangle=filterRectangleSimilaire(rectangle,20.0);
Mat res=debugSquares(rectangle,mat_img);

cvShowImage("LiveFeed",new IplImage(res));//new IplImage(res));
}
char c=cvWaitKey(33);
if(c==27)
break;
}

cvReleaseCapture(&cap);
cvDestroyAllWindows();
return 0;
}

我想知道是否有可能使其线程化以获得至少 30fps 的速度?

我正在使用 Windows 8.1、Visual 2010、c++ 和 OpenCV 2.4.10

最佳答案

您可以在 while(true) 循环之前使用线程。当然,从相机读取帧并显示它们必须序列化。

我看到您正在使用 C++ std::vector,所以我建议您使用 C++11 线程和互斥锁。我能想到的最有效的方法是在启动时打开所有线程(在 while(true) 循环之前),然后接收主线程捕获的帧。所有线程都将锁定在同一个互斥锁上以读取帧队列,并锁定在第二个互斥锁上以显示它。帧队列可以实现为:

struct frameQueue{
std::vector<Mat> frames;
std::mutex mtx;
};

根据项目的大小和副作用,它甚至可以声明为全局的。

关于c++ - OpenCV显示和处理网络摄像头流,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28071323/

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