C++ OpenCV';在更复杂的图像上,s-Canny检测速度较慢

C++ OpenCV';在更复杂的图像上,s-Canny检测速度较慢,c++,opencv,optimization,edge-detection,object-detection,C++,Opencv,Optimization,Edge Detection,Object Detection,我在机器人相机的流图像上使用Canny检测(寻找圆圈)。为了获得边缘之间的最大对比度,我将rgb图像分割成单独的通道,对每个通道执行Canny,然后按位或将边缘合并成一个合并图像。在简单图像上使用时,我的fps在30 fps时相对不受影响。当相机看到更复杂的图像时,fps下降到24 fps。这正常吗?如果是这样的话,我是否可以加快速度,以便继续以恒定的帧速率运行 以下是我正在使用的代码: vector<Mat> rgb; split(src, rgb); Canny( rgb[0]

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

以下是我正在使用的代码:

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);
矢量rgb;
拆分(src、rgb);
Canny(rgb[0],rgb[0],cannyThreshold,cannyThreshold2,3);
Canny(rgb[1],rgb[1],cannyThreshold,cannyThreshold 2,3);
Canny(rgb[2],rgb[2],cannyThreshold,cannyThreshold2,3);
席状融合影像;
按位_或(rgb[0],rgb[1],合并图像);
按位_或(mergedImage,rgb[2],mergedImage);

事实上,这种行为是意料之中的

有三种方法可以加快速度:

  • ,如果有,可以安装。您可能必须自己编译OpenCV才能启用此功能

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

  • 研究不同的方法:有时不同的算法集可以在更短的时间内获得相同的结果


这是有道理的。因为按位_或可能只查看存在正值的图像位置。当有更多的正值时,它需要更长的时间。你知道一种对颜色执行精明方法的方法吗?我已经读过几篇关于这种策略的文章,但还没有看到opencv的实际实现。解决方案是在图像的每个单独通道(R、G、B)上执行Canny,就像您正在做的那样。