【发布时间】:2015-05-25 20:46:55
【问题描述】:
我有一张由虚线组成的图像:
注意:打开图片,放大图片并查看所有小点
如何使用 openCV 检测和参数化这些线条?
此图像是机器人上的激光测距仪的值,我需要尽可能好地获取所有线条。
HoughLinesP 函数应该是这个的理想选择?
我尝试了以下代码:
//converts laser range readings to a binary image.
cv::Mat binaryImg = laserRangesToBinaryImage();
cv::Mat cdst;
cvtColor(binaryImg, cdst, CV_GRAY2BGR);
std::vector<cv::Vec4i> lines;
HoughLinesP(binaryImg, lines, 2, 5.0*CV_PI/180.0, 1, 2, 20 );
for( size_t i = 0; i < lines.size(); i++ )
{
cv::Vec4i l = lines[i];
line( cdst, cv::Point(l[0], l[1]), cv::Point(l[2], l[3]), cv::Scalar(0,0,255), 3, CV_AA);
}
cv::imshow("Hough output", cdst);
这导致大约 50 到 60 行(在 Ubuntu 14.04 上使用 openCV 2.8.3):
这里最大的问题是有多个分开的线段,应该检测到一条完整的线。所以这些段没有正确连接。有些线条太短甚至无法检测到。
最佳结果应该如下所示(手动创建),大约有 20 个线段:
我怎样才能达到这个结果?
【问题讨论】:
-
你试过扩张和侵蚀吗?这可以将这些点连接起来并变成线,然后算法可能会更好地检测到。也可以检查彼此接近的段并将它们联合起来。
-
你可以 1. 使用 houghLines 方法而不是 HoughLinesP 2. 使用 hlp 的 gap 参数 3. 集群并连接你的小线段
标签: python c++ opencv hough-transform