如何使霍夫线变换更快地执行?

时间:2014-02-20 04:16:59

标签: c++ visual-c++ opencv image-processing mat

我已经编写了用于车道检测的代码,使用霍夫线变换,在我的电脑中存储的视频文件中识别出线条[有1280 * 720分辨率],我的视频运行缓慢,我怎样才能让运行速度更快? ,在我的代码中,我检查了函数hough_transform的执行时间,包括canny,cvtcolor和hough变换,我正在检索帧,我能够每秒执行两帧,请帮我减少执行time.thanks提前 这是代码:

#include <opencv2/highgui/highgui.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int hough_tranform(Mat src){

if(src.empty())
{

    cout << "can not open " << endl;
    return -1;
}

Mat dst, cdst;
Canny(src, dst, 50, 200, 3);

cvtColor(dst, cdst, COLOR_GRAY2BGR);

vector<Vec4i> lines;
   HoughLinesP(dst, lines, 1, CV_PI/180, 50, 50, 10 );

for( size_t i = 0; i < lines.size(); i++ )
{
    Vec4i l = lines[i];
    line( cdst, Point(l[0], l[1]), Point(l[2], l[3]), Scalar(0,0,255), 3, 0);
}

 imshow("detected lines", cdst);

}


int main() {

Mat frame;
string path = "C:/santhu/Wildlife.wmv";
VideoCapture capture(path); 
namedWindow("my_window");

for(;;) {
capture >> frame;

hough_tranform(frame);

imshow("my_window", frame);

  if(cv::waitKey(30) >= 0) break;
 }
}

2 个答案:

答案 0 :(得分:0)

在进行边缘检测之前,您应该缩小图像尺寸,然后进行霍夫线变换。然后,您可以将结果升级回原始大小。

答案 1 :(得分:0)

使用HoughLinesP函数的参数将帮助您提高精度成本。当图像尺寸增加时,此功能的性能将大幅降低。

如果可能的话,使用HoughLines而不是概率方法,因为它更快。

使用双线性插值缩小图像不会影响输出质量,因为在canny边缘检测器输出上执行了hough变换。

我将遵循的步骤是:

  • 阅读相框。
  • 转换为grayScale。
  • 缩小灰度图像。
  • 如果可能,请在灰色图像上选择ROI的ROI 检测。
  • 在ROI图像上做精算。
  • 做好转变。

当你正在进行车道检测算法时,我将把我的两美分放进去。单独的Canny检测对包含树木阴影的道路没有多大帮助,因为周围会检测到边缘。虽然Probabilisitic Hough方法在上述情况下减少了误差,但(a)限制theta值,(b)使用sobel边缘检测,其中dx优先于dy,是一些值得尝试的实验。