提高图像处理速度

Che*_*tah 9 c++ multithreading opencv image-processing

我正在使用C++和OpenCV来实时处理从网络摄像头拍摄的一些图像,我希望从我的系统中获得最佳速度.

除了更改处理算法(假设,现在,您无法更改它).我是否应该采取任何措施来最大限度地提高处理速度?

我想也许Multithreading可以在这里提供帮助,但我很惭愧地说我不知道​​这些来龙去脉(虽然很明显我之前使用过多线程但不是在C++中).

假设我有一个x-core处理器,将处理分成x个线程实际上是否会加快速度?...或者这些线程的管理开销会否定它,假设我正在寻找20fps的吞吐量(我认为这会影响你给出的答案,因为它应该给你一个指示每个线程将完成多少处理)

多线程会帮助吗?

是否有任何提示,特别是提高OpenCV的速度,或任何我可能陷入降低速度的陷阱.

谢谢.

Cap*_*liC 6

我认为,更简单的方法可能是框架操作.

您可以使用线程池,顺序地将帧内存缓冲区分配给第一个可用线程,以便在关联帧上的算法步骤完成时释放到池中.

这可能使您当前(调试的)算法几乎保持不变,但是需要更多的内存来缓冲中间结果.

当然,如果没有关于你的任务的细节,很难说这是否合适......


Jav*_*ock 5

关于提高OpenCV的速度与处理器和算法无关,有一个重要的事情是它在处理矩阵时避免了额外的复制.我将从文档中给出一个示例:

"...通过构建另一个矩阵的一部分的标题.它可以是单行,单列,多行,几列,矩阵中的矩形区域(在代数中称为次要)或对角线.这样的操作是也是O(1),因为新标题将引用相同的数据.您实际上可以使用此功能修改矩阵的一部分,例如"

// add 5-th row, multiplied by 3 to the 3rd row
M.row(3) = M.row(3) + M.row(5)*3;

// now copy 7-th column to the 1-st column
// M.col(1) = M.col(7); // this will not work
Mat M1 = M.col(1);
M.col(7).copyTo(M1);
Run Code Online (Sandbox Code Playgroud)

也许您已经知道这个问题,但我认为将openCV中的标题突出显示为一个重要而有效的编码工具非常重要.