2017-06-29 55 views
1

我是新來的opencv使用Python,所以請耐心等待。 我有一個托盤,鏈接中有不同大小的圓圈。 https://is.alicdn.com/img/pb/810/421/429/429421810_364.jpg 這不是我有的實際圖像,但它與上面的非常相似。 我必須檢測圖像中的紙盤並找到紙盤中所有孔(圓圈)的輪廓。取決於拍攝圖像的用戶,托盤可能會傾斜。到目前爲止,我對圖像使用了高斯模糊和Canny邊緣檢測,並關閉了Canny邊緣檢測中的間隙。這是Canny邊緣檢測後的圖像 After Canny Edge Detection 這是形態學後的圖像。 After morphology 然後,我用findcontours,並試圖找到4個頂點的最大輪廓,理想情況下是托盤本身。 輪廓檢測只能識別左側垂直邊界和頂部水平邊界。它無法識別托盤的四個邊緣。使用opencv python遊戲棋盤上的矩形檢測

這是我到目前爲止的代碼:

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

image = cv2.imread("img.jpg") 
image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY) 
image = cv2.GaussianBlur(image, (3, 3), 0) 
image_canny = cv2.Canny(image, 30, 200) 
kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (7, 7)) 
gaps_closed = cv2.morphologyEx(image_canny, cv2.MORPH_CLOSE, kernel) 
_, contours, _= cv2.findContours(gaps_closed.copy(), cv2.RETR_TREE, 
cv2.CHAIN_APPROX_SIMPLE) 
contours = sorted(contours, key = cv2.contourArea, reverse = True) 
[:5] 
Cnt = None 
for c in contours: 
    peri = cv2.arcLength(c, True) 
    approx = cv2.approxPolyDP(c, 0.04 * peri, True) 

    if len(approx) == 4: 
     Cnt = approx 
     break 

cv2.drawContours(image, [Cnt], -1, (0, 255, 0), 4) 
plt.imshow(image) 
plt.show() 
+1

Canny和形態學操作後可以附加當前輸出嗎? – ZdaR

+0

@ZdaR:添加了圖片。 – dep234

回答

0

調整cv2.canny的參數應該更容易檢測到托盤的邊緣。但是,使用cv2.HoughLines可能是檢測托盤的更好方法,因爲HoughLines不會要求檢測完整的邊緣。

0

對輸入執行直方圖均衡可以改善圖像的對比度。這將改善圖像中的邊緣檢測。

由於圖像中的孔看起來很小,因此形態學操作可能不是最佳選擇。這會弄髒孔洞,您可能無法將其取回。

Opencv具有霍夫圓變換的實現。下面是一個示例的python教程:http://docs.opencv.org/3.0-beta/doc/py_tutorials/py_imgproc/py_houghcircles/py_houghcircles.html。使用這應該可以解決你的問題。

如果這不起作用,張貼您的實際輸入圖像將是有幫助的