2016-03-07 57 views
4

我試圖創建一個Python腳本來檢測一個行的孔,結束和開始。我認爲openCV會很好實現這一點。使用openCV檢測線的孔,結束和開始?

因此,舉例來說一切開始與此圖像:

enter image description here

最後我想實現的是:

enter image description here

於是我開始導入圖像到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) 

我也沒辦法來解決這個問題。

+0

您可以比較每個項目的x-y座標與其他每個項目的x-y,如果它們落在特定的近似閾值內,則認爲它們是空洞,否則將它們視爲開始/結束線。 – Aphire

+1

GoodFeaturesToTrack這裏不是一個好的選擇。我會沿着這個做一些事情:1)分割每個blob('findContours')。你會有每個細分市場。 2)找到每個片段的起點和終點(這可能很棘手)3)如果兩個端點比給定的閾值更近,那麼就有一個_hole_。 4)剩下的兩個端點是開始和結束。 – Miki

+0

好的。謝謝!我做到了。現在我需要獲得所有的關鍵點。我需要一個roi嗎?還是有更快的方法? – RunningRails

回答

2

我添加了一個func getLandmarks()它返回所有的整體。所以我在這裏假定,如果有2個角部在30 PIX

​​

這一行定義的範圍內的半徑,將被計爲一個孔。

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) 

輸出

enter image description here

現在爲起點和終點,您可以輕鬆地在任何X角落進行排序(如果路徑是沿着從左至右)或Y(如果路徑是沿着從上到下),最小和最大將是你的開始和結束!

+0

哇!非常感謝!我沒有想到這個回答很好。輝煌! – RunningRails