Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV多段线CPU使用过度_C++_Multithreading_Opencv3.0 - Fatal编程技术网

C++ OpenCV多段线CPU使用过度

C++ OpenCV多段线CPU使用过度,c++,multithreading,opencv3.0,C++,Multithreading,Opencv3.0,我通过UDP接收视频流(640x480p),并使用OpenCV的imdecode()对同一线程中的每一帧进行解码。如果正确解码,帧将传递给新启动的线程进行图像处理(findChessboardCorners()和polylines()),线程将分离 接收和解码部分工作得很好,但我记录了polylines()的执行时间,它大约从5毫秒开始,随着程序运行时间的延长(高达4000毫秒或更长),它会变得更糟。Visual Studio的性能分析器报告说,polylines()使用了约98%的CPU。要使

我通过UDP接收视频流(640x480p),并使用OpenCV的imdecode()对同一线程中的每一帧进行解码。如果正确解码,帧将传递给新启动的线程进行图像处理(findChessboardCorners()和polylines()),线程将分离

接收和解码部分工作得很好,但我记录了polylines()的执行时间,它大约从5毫秒开始,随着程序运行时间的延长(高达4000毫秒或更长),它会变得更糟。Visual Studio的性能分析器报告说,polylines()使用了约98%的CPU。要使用多段线()绘制的带有点的向量由40个点组成

即使我正在分离每个线程,是什么导致性能损失?(甚至用Intel Xeon进行了测试)

我还使用了第二个选项以这种方式使用polylines():

const Point *pts = (const Point*)Mat(path_2d).data;
int npts = Mat(path_2d).rows;
polylines(chessboard, &pts, &npts, 1, false, Scalar(0, 255, 0), 5);

但这根本不起作用,图像显示时没有任何线条。

我通过将CV_AA替换为线条_4作为多段线()中的参数来解决这个问题。
显然,绘制线的抗锯齿是最重要的部分,现在它可以在0-1毫秒内运行。

当处理时间长于帧解码时间时,此代码可能会严重失控。一段时间后,您可以运行数千个线程,可能所有线程都会争夺polylines()使用的内部锁。您必须使用信号量进行节流,不允许线程数超过处理器核心数。在VS中使用“调试>窗口>线程调试器”窗口验证这一点。感谢您的回答。我跟踪了当前执行解码功能的线程总数,它没有超过3-5个。另外,threads debugger窗口显示,运行的线程从未超过20个,这应该是可管理的,对吗?我在单个线程中测试了decode函数,而不是每次都启动一个新线程,即使这样,polylines()的执行时间也在不断增加。也许我对polylines()的使用有缺陷,而不是多线程问题。
Mat frameVideo;
while(1) {
    //code for receiving a single frame, decode it and store it in frameVideo.
    thread decodeThread = thread(decode, frameVideo);
    decodeThread.detach();
}
const Point *pts = (const Point*)Mat(path_2d).data;
int npts = Mat(path_2d).rows;
polylines(chessboard, &pts, &npts, 1, false, Scalar(0, 255, 0), 5);