OpenCV Hough Line Transform提供不存在的水平线

时间:2017-06-21 02:04:13

标签: opencv image-processing computer-vision

我首先使用canny检测器从二进制图像中提取边缘。结果是完美的,但后来我使用霍夫变换来矢量化这些边缘。然而,我得到的线路是错误的,大量不存在的水平线只是突然冒出来。

edges

霍夫线 lines

100票 enter image description here

我使用的代码和参数

    // detect edges.
    cv::Mat1b edges(bw.size());
    cv::Canny(bw, edges, 40, 120);

    // detect lines.
    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 0);

    // minimum 100 votes version.
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 100);

    cv::Mat1b tmp(edges.size());
    for (unsigned i = 0; i < lines.size(); i ++) {
            cv::Vec4i const& line = lines[i];
            cv::line(tmp, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(255));
    }

1 个答案:

答案 0 :(得分:1)

经过一番挣扎,我发现这不是霍夫变换的问题。问题是我使用了cv :: Mat1b tmp(edges.size());作为输出目标。看来cv :: line无法绘制二进制图像。它可能溢出图像边界,导致这些错误的像素。当我把它切换到cv :: Mat1i tmp(edges.size());事情很完美。

固定代码

    // detect edges.
    cv::Mat1b edges(bw.size());
    cv::Canny(bw, edges, 40, 120);

    // detect lines.
    std::vector<cv::Vec4i> lines;
    cv::HoughLinesP(edges, lines, 1, CV_PI/180, 40, 100, 200);

    cv::Mat1i tmp(edges.size());
    for (unsigned i = 0; i < lines.size(); i ++) {
            cv::Vec4i const& line = lines[i];
            cv::line(tmp, cv::Point(line[0], line[1]), cv::Point(line[2], line[3]), cv::Scalar(255));
    }

    cv::imwrite("tmp.png", tmp);

结果: enter image description here