我需要在 OpenCV 中扫描图像并获取线条。为此,我使用精明边缘检测器,然后使用概率霍夫变换,我实际上得到了线条。
现在的问题是我得到了许多短线而不是一些连续的线。我正在分析的图像大小为 1024x768,我想知道这是否可能是错误源。从理论上讲,使图像更小应该会导致更少的线条。这对我的任务有帮助吗?还是在提取线条时我应该考虑其他任何因素?
OpenCV中图像大小对边缘检测的影响
在更改图像大小之前,您应该使用Canny()
和函数的许多参数。HoughLinesP()
的原型Canny()
是:
void Canny(InputArray image, OutputArray edges,
double threshold1, double threshold2,
int apertureSize=3, bool L2gradient=false )
您应该使用threshold1
、和参数threshold2
,直到您得到一个输出,该输出准确地标记了图像中线条中涉及的像素。该参数控制强度,在该强度之上,梯度值将被确定为边缘的一部分。将它设置得更高会给你更少的边缘。该参数控制强度,高于该强度的像素将被视为从相邻像素延续边缘。将它设置得更低会给你更长的边缘。比率/应至少为 2.0,可以大到 3.0,甚至可能更大。设置为将使算法稍微慢一些,但会使用一阶导数的更准确的梯度计算。环境aperturSize
L2gradient
Canny()
threshold2
threshold1
threshold2
threshold1
L2gradient
true
apertureSize
到 5 或 7 可能会在一阶导数计算中消除一些噪声。
只有在您Canny()
准确地找到图像中的边缘后,您才能继续运行HoughLinesP()
。 HoughLinesP()
还有一堆旋钮,你需要调整以获得不错的结果。
void HoughLinesP(InputArray image, OutputArray lines,
double rho, double theta,
int threshold,
double minLineLength=0,
double maxLineGap=0 )
rho
并且theta
可以根据您想要允许的长度和角度设置得更大或更小。设置rho
和theta
更大会给你更少的线段,但它们会不太准确。 threshold
可以增加以减少您获得的线段数。 minLineLength
可以增加以拒绝短线段,并且maxLineGap
可以增加以使短线更容易连接在一起。
设置较大Canny()
的apertureSize
参数有点像处理较小的图像,因为较大的光圈会对图像的细节进行更多的模糊/平滑。将HoughLinesP()
'srho
和theta
参数设置得更大有点像处理较小的图像,因为您将角度或长度的微小差异集中在一起,这些差异在较小的图像中是无法区分的。
OpenCV 文档HoughLinesP()
有一个示例:
Canny( src, dst, 50, 200, 3 );
...
HoughLinesP( dst, lines, 1, CV_PI/180, 80, 30, 10 );