OpenCV Hough线变换提供不存在的水平线

OpenCV Hough线变换提供不存在的水平线,opencv,image-processing,computer-vision,Opencv,Image Processing,Computer Vision,我首先使用canny检测器从二值图像中提取边缘。结果非常完美,但我使用了hough变换对这些边进行矢量化。然而,我得到的线是错误的,成吨的不存在的水平线只是突然从哪里冒出来 边缘 霍夫线 100票 我使用的代码和参数 // detect edges. cv::Mat1b edges(bw.size()); cv::Canny(bw, edges, 40, 120); // detect lines. std::vector<cv::Vec4i

我首先使用canny检测器从二值图像中提取边缘。结果非常完美,但我使用了hough变换对这些边进行矢量化。然而,我得到的线是错误的,成吨的不存在的水平线只是突然从哪里冒出来

边缘

霍夫线

100票

我使用的代码和参数

    // 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));
    }
//检测边缘。
cv::Mat1b边(bw.size());
cv::Canny(体重,边缘,40,120);
//检测线路。
std::矢量线;
cv::HoughLinesP(边,线,1,cv_PI/180,0);
//最低100票版本。
cv::HoughLinesP(边、线,1,cv_PI/180100);
cv::Mat1b tmp(edges.size());
for(无符号i=0;i
经过一番努力,我发现这不是hough变换的问题。问题是我使用了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);
//检测边缘。
cv::Mat1b边(bw.size());
cv::Canny(体重,边缘,40,120);
//检测线路。
std::矢量线;
cv::HoughLinesP(边、线、1、cv_PI/180、40、100、200);
cv::Mat1i tmp(edges.size());
for(无符号i=0;i
结果:

为什么您的阈值为0?考虑Hough变换的一种方法是,它用线条填充图像,然后对于图像中位于该线条上的每个白色像素,将该线条+1作为其分数。使用
threshold
你会问“一条线需要接触多少点才能算作一条线?”所以,如果你的阈值为0,这意味着……Hough的每一条可能的线都在你的图像中。相反,尝试50或100或类似的东西。这实际上不是Hough变换的工作原理,但它非常接近。我明白了。那就应该公布投票数了。在我将阈值设置为100、300和500之后,水平线是固定的,但是好的线消失了。我会编辑这篇文章以包含这些图片。不,你有另一个奇怪的问题。最近有一个非常类似的问题,在
行中有数百万行。此外,每行
中的值都是非常奇怪的大量数字。你也是吗?它看起来真的很奇怪。看见也有一个张贴的答案,不确定是否有帮助。是的,我也在使用OpenCV 3.2。当我将阈值设置为100票时,我在这个简单的边缘映射中得到了大约500行,但是代码没有崩溃。我想台词不错。只是它们是水平的。我不确定这是否会被视为一个bug。由于边缘贴图中的线宽为2像素,因此可以获得一些阈值为0的水平线。现在,我觉得奇怪的是,在设定100票的阈值后,仍然有水平线。让我试试这个例子,看看我是否可以复制这个问题。是的,不——除了阈值之外,你的代码看起来不错。只需对代码稍加修改(主要是调整图像大小),我就可以很容易地检测到。