使用 openCV 检测线的孔、末端和起点?
Detect holes, ends and beginnings of a line using openCV?
我正在尝试创建一个 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() 它 returns 所有的整体。所以这里我假设如果在30pix的半径内有2个角就会算一个洞
if abs(x1-x2)<=30 and abs(y1-y2)<=30:
这一行定义了范围。
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)
输出
现在开始和结束您可以轻松地在 X(如果路径是从左到右)或 Y(如果路径是从上到下)中对角进行排序,最小值和最大值将是您的开始和结束!
我正在尝试创建一个 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() 它 returns 所有的整体。所以这里我假设如果在30pix的半径内有2个角就会算一个洞
if abs(x1-x2)<=30 and abs(y1-y2)<=30:
这一行定义了范围。
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)
输出
现在开始和结束您可以轻松地在 X(如果路径是从左到右)或 Y(如果路径是从上到下)中对角进行排序,最小值和最大值将是您的开始和结束!