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