Python 使用openCV检测线的孔、端点和起点?

Python 使用openCV检测线的孔、端点和起点?,python,opencv,tracking,detect,Python,Opencv,Tracking,Detect,我正在尝试创建一个Python脚本来检测一行的洞、结束和开始。我认为openCV将非常适合实现这一点 例如,一切都从这个图像开始: 最后,我想要实现的是: 因此,我开始将图像导入Python并将其转换为灰度。现在我想到了使用goodFeaturesToTrack()方法跟踪孔的想法。它通常用于在图像中查找角点 然而,这并没有起到很好的作用,因为在这之后脚本知道点,但它不知道点是来自孔还是线的起点或终点。另一个问题是,如果我使用另一幅图像,这种方法检测到的点不仅仅是线的洞、起点和终点 以下是我

我正在尝试创建一个Python脚本来检测一行的洞、结束和开始。我认为openCV将非常适合实现这一点

例如,一切都从这个图像开始:

最后,我想要实现的是:

因此,我开始将图像导入Python并将其转换为灰度。现在我想到了使用
goodFeaturesToTrack()
方法跟踪孔的想法。它通常用于在图像中查找角点

然而,这并没有起到很好的作用,因为在这之后脚本知道点,但它不知道点是来自孔还是线的起点或终点。另一个问题是,如果我使用另一幅图像,这种方法检测到的点不仅仅是线的洞、起点和终点

以下是我的完整代码,可以更好地理解我的问题:

import cv2
import numpy as np
import matplotlib.pyplot as plt

# lodes in img

img = cv2.imread('png1.png', cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

corners = cv2.goodFeaturesToTrack(img_gray, 200, 0.05, 10)

for corner in corners:
    x, y = corner.ravel()
    cv2.circle(img, (x,y), 7, (255,255,0), -1)

cv2.imshow('img',img)

我不知道如何解决这个问题。

我添加了一个func getLandmarks()函数,它返回所有的整数。所以这里我假设,如果在30像素的半径内有两个角,它将被算作一个孔

if abs(x1-x2)<=30 and abs(y1-y2)<=30:

<代码>如果ABS(X1-X2)可以将每个项目的X-Y组合与其他项目的X-Y进行比较,如果它们落在接近某个阈值的情况下,就把它们看作一个孔,否则就把它们看作是一个起点/终点线。我会做一些事情:1)分割每个blob(
findContours
)。您将拥有每个片段。2) 找到每个线段的起点和终点(这可能很棘手)3)如果两个端点的距离小于给定的阈值,则存在一个孔。4) 其余两个端点是start和end.Ok。非常感谢。是我干的。现在我需要得到阈值中的所有点。我需要roi吗?还是有更快的方法?看看你的图像#2很简单:你按半径(~孔公差)关闭图像。然后,对于对象中的任何点,沿对象测量的最远点必须是一个端点。。。然后,您会发现原始对象中没有的其他端点和连接区域是您的孔。哇!非常感谢你!我没想到会有这么好的回答。明亮的
import cv2
import numpy as np

def getLandmarks(corners):
    holes=[]
    for i in range(0,len(corners)):
        for j in range(i+1,len(corners)):
            x1,y1=corners[i].ravel()
            x2,y2=corners[j].ravel()
            if abs(x1-x2)<=30 and abs(y1-y2)<=30:
                holes.append((int((x1+x2)/2),int((y1+y2)/2)))
    return holes

# lodes in img

img = cv2.imread('img.png', cv2.IMREAD_COLOR)
img_gray = cv2.cvtColor(img, cv2.COLOR_RGB2GRAY)

corners = cv2.goodFeaturesToTrack(img_gray, 200, 0.05, 10)

holes=getLandmarks(corners)
print len(holes)
for corner in holes:
    cv2.circle(img, (corner), 7, (255,255,0), -1)

cv2.imshow('img',img)
cv2.waitKey(0)