开发者社区 问答 正文

如何检测图像Python上的开始/结束坐标和线的交点?

我试图创建一个脚本,采取图像的折纸折痕图: 脚本应该返回这些线的坐标(开始和结束)以及这些线的交点,因为我将在另一个程序中绘制它们。不同颜色的线条应该分开对待,因为它们意味着不同的东西。 我尝试使用OpenCV(确切地说是HoughLinesP)来检测线条,但是我的结果不够好。

我无法得到我检测到的直线的坐标。另外,不同颜色的线条之间没有任何区别。 我想知道是否有更好的方法来达到我想要的结果。 预先感谢你的任何帮助。 问题来源StackOverflow 地址:/questions/59380451/how-would-i-detect-the-start-end-coordinates-and-intersections-of-lines-on-an-im

展开
收起
kun坤 2019-12-28 14:17:12 556 分享 版权
阿里云 AI 助理回答

在OpenCV中,使用HoughLinesP进行直线检测是一个常见方法,但确实可能需要一些调整和后处理来优化结果。针对你的需求,这里有一些建议来改进你的脚本:

  1. 提高HoughLinesP参数:首先,确保你正确调整了HoughLinesP的参数,如rho, theta, threshold, minLineLength, 和 maxLineGap。这些参数直接影响到检测到的线段的质量和数量。特别是minLineLengthmaxLineGap可以帮助过滤掉短小或不连续的线段。

  2. 颜色分离:为了区分不同颜色的线条,你需要在应用Hough变换之前先对图像进行颜色空间转换(例如从BGR到HSV)并分割出不同的颜色范围。可以使用cv2.inRange()函数创建掩码,然后分别对每个颜色通道应用Hough变换。

  3. 获取线段坐标:一旦检测到线段,你可以通过HoughLinesP返回的结果直接获得线段的起始和结束坐标。HoughLinesP返回的是一个二维数组,每一行代表一条线段,前四个元素分别是[x1, y1, x2, y2],即线段的两个端点坐标。

  4. 计算交点:要找到线段之间的交点,你可以遍历所有线段对,并使用线段方程求解交点。对于每一对线段[(x1, y1), (x2, y2)]和[(x3, y3), (x4, y4)],可以设置两个线性方程组并求解。注意检查交点是否实际位于两条线段之间,以避免误报非实际存在的交点。

  5. 后处理:考虑引入一些后处理步骤,比如去除非常接近的线段、合并重叠线段或者基于几何规则进一步筛选有效交点,以提升最终结果的准确性。

示例代码片段(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()

请注意,上述代码仅为示例,具体颜色范围和参数需要根据你的实际情况调整。对于交点计算,你可能需要编写额外的逻辑来实现。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答