C++ 为什么hough变换检测两条直线而只有一条直线

C++ 为什么hough变换检测两条直线而只有一条直线,c++,opencv,image-processing,line,C++,Opencv,Image Processing,Line,我想检测一条线并提取它的两个端点。常用的方法是使用hough变换。幸运的是,OpenCV中有一个关于is的问题,因此我画了一条线,它的两个端点是p1(100200),p2(400200)。我认为上述方法只会给我提供这些要点。我的样本图像是 hough变换为我提供了两个图像,它们是 对于Canny过滤器 在代码中,似乎检测到两行。这就解释了为什么红线更粗,这表明有两条线而不是一条。当我打印出行数时,它显示两行,如下所示 lines.size(): 2 p1:<99,201>

我想检测一条线并提取它的两个端点。常用的方法是使用hough变换。幸运的是,OpenCV中有一个关于is的问题,因此我画了一条线,它的两个端点是p1(100200),p2(400200)。我认为上述方法只会给我提供这些要点。我的样本图像是

hough变换为我提供了两个图像,它们是

对于Canny过滤器

在代码中,似乎检测到两行。这就解释了为什么红线更粗,这表明有两条线而不是一条。当我打印出行数时,它显示两行,如下所示

lines.size(): 2
p1:<99,201>  p2:<401,201>
lines.size(): 2
p1:<102,198>  p2:<398,198>
lines.size():2
p1:p2:
lines.size():2
p1:p2:

为什么我会有两条线?

这可能是因为你房间里的垃圾箱太宽了。 您可能会选择一个默认的OpenCv函数,即

HoughLines(X,X,1,CV_PI/180,X,X,X)

不是X的参数定义了箱子的宽度。 上面写着:

rho:参数r的分辨率(以像素为单位)。我们使用1像素。

对于第一个参数和第二个参数:

theta:参数的分辨率\theta(弧度)。我们使用1度(CV_PI/180)


我现在不知道您选择的值,但您可能希望选择更大的值。

根据HoughSpace中箱子的宽度,并非所有像素都可以指定给线条。尝试更宽/更少的箱子。在houghLines之前是否使用了精明的边缘检测?您应该检查中间图像的外观。渐变可能会在粗线条的每一侧产生一条边。@Mika,是的,样本实际上使用了canny算法。你能发布中间canny图像吗?@Mika,我在帖子中链接了整个代码。对于canny,
Mat dst、cdst;Canny(src、dst、50、200、3);CVT颜色(dst、cdst、CV_GRAY2BGR)我试图更改一个参数,但运气不好。