我试图创建一个脚本,采取图像的折纸折痕图: 脚本应该返回这些线的坐标(开始和结束)以及这些线的交点,因为我将在另一个程序中绘制它们。不同颜色的线条应该分开对待,因为它们意味着不同的东西。 我尝试使用OpenCV(确切地说是HoughLinesP)来检测线条,但是我的结果不够好。
我无法得到我检测到的直线的坐标。另外,不同颜色的线条之间没有任何区别。 我想知道是否有更好的方法来达到我想要的结果。 预先感谢你的任何帮助。 问题来源StackOverflow 地址:/questions/59380451/how-would-i-detect-the-start-end-coordinates-and-intersections-of-lines-on-an-im
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
在OpenCV中,使用HoughLinesP进行直线检测是一个常见方法,但确实可能需要一些调整和后处理来优化结果。针对你的需求,这里有一些建议来改进你的脚本:
提高HoughLinesP参数:首先,确保你正确调整了HoughLinesP
的参数,如rho
, theta
, threshold
, minLineLength
, 和 maxLineGap
。这些参数直接影响到检测到的线段的质量和数量。特别是minLineLength
和maxLineGap
可以帮助过滤掉短小或不连续的线段。
颜色分离:为了区分不同颜色的线条,你需要在应用Hough变换之前先对图像进行颜色空间转换(例如从BGR到HSV)并分割出不同的颜色范围。可以使用cv2.inRange()
函数创建掩码,然后分别对每个颜色通道应用Hough变换。
获取线段坐标:一旦检测到线段,你可以通过HoughLinesP
返回的结果直接获得线段的起始和结束坐标。HoughLinesP
返回的是一个二维数组,每一行代表一条线段,前四个元素分别是[x1, y1, x2, y2],即线段的两个端点坐标。
计算交点:要找到线段之间的交点,你可以遍历所有线段对,并使用线段方程求解交点。对于每一对线段[(x1, y1), (x2, y2)]和[(x3, y3), (x4, y4)],可以设置两个线性方程组并求解。注意检查交点是否实际位于两条线段之间,以避免误报非实际存在的交点。
后处理:考虑引入一些后处理步骤,比如去除非常接近的线段、合并重叠线段或者基于几何规则进一步筛选有效交点,以提升最终结果的准确性。
示例代码片段(Python + OpenCV):
import cv2
import numpy as np
# 加载图像
image = cv2.imread('your_image_path.jpg')
# 转换到HSV空间
hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)
# 假设我们要找红色线段,定义红色的HSV范围
lower_red = np.array([0, 50, 50])
upper_red = np.array([10, 255, 255])
# 创建红色的掩码
mask = cv2.inRange(hsv, lower_red, upper_red)
# 对掩码应用HoughLinesP
edges = cv2.Canny(mask, 50, 150, apertureSize=3)
lines = cv2.HoughLinesP(edges, rho=1, theta=np.pi/180, threshold=100, minLineLength=100, maxLineGap=10)
# 绘制线段并获取坐标
if lines is not None:
for line in lines:
x1, y1, x2, y2 = line[0]
cv2.line(image, (x1, y1), (x2, y2), (0, 0, 255), 2)
print(f"Line coordinates: ({x1}, {y1}) to ({x2}, {y2})")
# 显示图像
cv2.imshow('Detected Lines', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
请注意,上述代码仅为示例,具体颜色范围和参数需要根据你的实际情况调整。对于交点计算,你可能需要编写额外的逻辑来实现。