【发布时间】:2017-06-21 02:04:13
【问题描述】:
我首先使用精明检测器从二值图像中提取边缘。结果是完美的,但后来我使用霍夫变换来矢量化这些边缘。然而,我得到的线条是错误的,大量不存在的水平线条突然冒出来。
我使用的代码和参数
// 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));
}
【问题讨论】:
-
为什么你的阈值是 0?您可以考虑霍夫变换的一种方法是,它用线条填充您的图像,然后对于放置在该线上的图像中的每个白色像素,将该线的得分 +1。使用
threshold,您是在问“一条线需要接触多少个点才能算作一条线?”因此,如果您的阈值为 0,则意味着……霍夫的每条可能线都在您的图像中。而是尝试 50 或 100 或类似的东西。这实际上不是霍夫变换的工作原理,但它非常接近。 -
我明白了。它应该调用票数。在我将阈值设置为 100、300 和 500 之后,水平线是固定的,但是好的线没有了。我将编辑帖子以包含这些图片。
-
是的,我也在使用 OpenCV 3.2。当我将阈值设置为 100 票时,我在那个简单的边缘图中得到了大约 500 行,但代码没有崩溃。我猜的线条很好。只是它们是水平的。我不确定这是否会被视为错误。由于边缘图中的线条是 2 像素宽,因此可以得到一些阈值为 0 的水平线条。现在,我觉得奇怪的是,在阈值为 100 票后仍然有水平线。让我试试这个例子,看看我是否可以复制这个问题。
-
是的,不——除了阈值,您的代码看起来还不错。对您的代码稍作修改(主要是调整图像大小),我很容易就能检测到basically the whole outline fine。
标签: opencv image-processing computer-vision