2013-11-24 18 views
2

我在机器人相机(寻找圆圈)的流图像上使用Canny检测。为了获得边缘之间的最大对比度,我将rgb图像分割为单独的通道,对每个通道执行Canny,然后将位图或边缘一起合并到合并的图像中。在简单图像上使用时,我的fps在30 fps时相对不受影响。当相机看到更复杂的图像时,fps降至24 fps。这是正常的吗?如果是这样,那么我是否可以加快速度以便继续以恒定的帧速率运行?OpenCV的Canny检测在更复杂的图像上变慢

下面是我使用的代码:

vector<Mat> rgb; 
split(src, rgb); 

Canny(rgb[0], rgb[0], cannyThreshold, cannyThreshold2, 3); 
Canny(rgb[1], rgb[1], cannyThreshold, cannyThreshold2, 3); 
Canny(rgb[2], rgb[2], cannyThreshold, cannyThreshold2, 3); 

Mat mergedImage; 
bitwise_or(rgb[0], rgb[1], mergedImage); 
bitwise_or(mergedImage, rgb[2], mergedImage); 
+0

它是有道理的。由于bitwise_or可能只查看存在正值的图像位置。当有更多的正面价值时,需要更长的时间。 –

回答

2

这是正常现象,确实如此。

有3种方式加快速度:

  • OpenCV can benefit from an Intel processor,如果你有一个你可以安装Intel IPP。您可能必须自行编译OpenCV才能启用此功能。

  • 使用OpenCV的GPU模块。方法gpu::Canny()提供在GPU上运行的Canny的实现。如果您的视频卡支持CUDA或OpenCL,则OpenCV可以在GPU上运行某些算法。您可能必须自行编译OpenCV才能启用此功能。

  • 调查不同的方法:有时一组不同的算法可以在较短的时间内达到相同的结果。 I talked briefly about this on your other question

+0

你知道一种对颜色执行canny方法的方法吗?我已经阅读了几篇关于这种策略的论文,但在OpenCV中没有看到实际的实现。 –

+0

解决方案就是在图像的每个单独通道(R,G,B)上执行Canny,就像你在做什么一样。 – karlphillip