Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.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

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实时处理从网络摄像头获取的一些图像,我希望从我的系统中得到最好的速度。_C++_Multithreading_Image Processing_Opencv - Fatal编程技术网

提高图像处理速度 我用C++和OpenCV实时处理从网络摄像头获取的一些图像,我希望从我的系统中得到最好的速度。

提高图像处理速度 我用C++和OpenCV实时处理从网络摄像头获取的一些图像,我希望从我的系统中得到最好的速度。,c++,multithreading,image-processing,opencv,C++,Multithreading,Image Processing,Opencv,除了更改处理算法(目前假设您不能更改它)。我应该做些什么来最大限度地提高处理速度 我在想多线程可能会有所帮助,但我很惭愧地说我真的不知道细节(虽然很明显我以前使用过多线程,但在C++中没有) 假设我有一个x-core处理器,将处理分成x个线程真的会加快速度吗?…或者假设我正在寻找20fps的吞吐量,这些线程的管理开销会抵消它吗(我假设这会影响您给出的答案,因为它会告诉您每个线程将完成多少处理) 多线程在这里有用吗 是否有任何提高OpenCV速度的技巧,或者我可能会陷入的任何陷阱 谢谢。除非您正在

除了更改处理算法(目前假设您不能更改它)。我应该做些什么来最大限度地提高处理速度

我在想多线程可能会有所帮助,但我很惭愧地说我真的不知道细节(虽然很明显我以前使用过多线程,但在C++中没有)

假设我有一个x-core处理器,将处理分成x个线程真的会加快速度吗?…或者假设我正在寻找20fps的吞吐量,这些线程的管理开销会抵消它吗(我假设这会影响您给出的答案,因为它会告诉您每个线程将完成多少处理)

多线程在这里有用吗

是否有任何提高OpenCV速度的技巧,或者我可能会陷入的任何陷阱


谢谢。

除非您正在使用的特定算法已经针对多线程/并行平台进行了优化,否则将其扔到x-core处理器上对您没有任何帮助。该算法必须具有固有的线程能力,才能从多线程中获益。但如果没有考虑到这一点,则必须对其进行修改。另一方面另一方面,许多图像处理算法都是“令人尴尬的并行”,至少在概念上是这样。你能分享一下你心目中的算法的更多细节吗

假设我有一个x-core处理器,将处理分成x个线程是否真的会加快速度

是的,尽管这在很大程度上取决于所使用的特定算法,以及您编写线程代码来处理同步之类的事情的技能。您没有提供足够的详细信息来进行更好的评估

有些算法非常容易并行化,例如:

for (i=0; i < DATA_SIZE; i++)
{
   output[i] = f(input[i]);
}
for(i=0;i

对于某些函数f,这些函数被称为令人尴尬的并行化函数;您可以简单地将数据分割成N个块,并让N个线程分别处理每个块。像OpenMP这样的库使这种线程非常简单。

在OpenCV中提高速度有一点很重要,与处理器或算法无关在处理矩阵时,可以避免额外的复制。我将给您举一个文档中的示例:

“…通过为另一个矩阵的一部分构造标头。它可以是 单行、单列、多行、多列、矩形 矩阵中的区域(在代数中称为小调)或对角线。例如 操作也是O(1),因为新标头将引用 同样的数据。你可以用这个来修改矩阵的一部分 特征,例如。“


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

我认为,更简单的方法可能是流水线帧操作

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

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


当然,如果没有关于任务的详细信息,很难说这是否合适…

如果线程可以对不同的数据进行操作,那么将其线程化似乎是合理的,也许可以将每个帧对象排队到线程池中。您可能必须向帧对象添加序列号,以确保从池的交付顺序与它们的交付顺序相同。

作为使用OpenCV进行多线程图像处理的示例代码,您可能希望查看我的代码:

这就是我想利用x-core CPU来提高目标检测性能的想法。
detect
程序基本上是一个并行算法,它在多个线程之间分配任务,每个任务都有一个单独的流水线线程:

  • 分配帧内存和视频捕获
  • 对象检测(每个Haar分类器一个线程。)
  • 用检测结果增加输出并显示帧
  • 内存释放

  • 由于所有线程共享每个捕获帧的内存,我获得了很好的性能和CPU利用率。

    目前我只是使用标准的OpenCV算法来“填补”处理的空白。(它们是多线程/优化的吗?)……我还没有决定我要使用的算法,但可能是逐像素分析,如果需要的话,我可以分成x个线程,让它们都返回一个结果。算法是在代码中实现的。代码本质上是线程安全的,所以这取决于数据。@MartinJames,代码主要是线程安全的-你必须避免muta在代码中使用可变静态变量。除非是自修改的,否则所有代码都是线程安全的。可变静态是数据。@MartinJames真的不知道这是什么意思。将每个传入帧抛给一组旋转的线程应该允许非常简单的多线程处理。
    // 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);