使用openCV检测线的孔,末端和起点吗?

Run*_*ils 5 python opencv tracking detect

我正在尝试创建一个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)
Run Code Online (Sandbox Code Playgroud)

我不知道解决这个问题。

Ari*_*jit 2

我添加了一个 func getLandmarks() 它返回所有整体。所以这里我假设如果半径为30像素有2个角,就会被算作一个洞

if abs(x1-x2)<=30 and abs(y1-y2)<=30:
Run Code Online (Sandbox Code Playgroud)

这条线定义了范围。

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)
Run Code Online (Sandbox Code Playgroud)

输出

在此输入图像描述

现在对于开始和结束,您可以轻松地对X(如果路径从左到右)或Y(如果路径从上到下)的角进行排序,最小和最大将是您的开始和结束!