Обнаружить дыры, концы и начала линии, используя 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)
Я понятия не имею, чтобы обойти эту проблему.
1 ответ
Я добавил функцию getLandmarks(), которая возвращает все целые. Так что здесь я предполагаю, что это будет считаться дырой, если есть 2 угла в радиусе 30 пикселей
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(если путь идет сверху вниз), а min и max будут вашими началом и концом!