2017-03-15 1 views
2

페이지에서 모양의 가장자리를 감지하고 모양을 확대/축소하기 위해 이미지를 자르고 감싸는 프로그램에서 작업하고 있습니다. 그러나 문제는 내 모양이 각 모서리의 마커로 묶여 있다는 것입니다.Python에서 OpenCV로 불완전한 모양의 모서리를 감지했습니다.

Example

가 어떻게 이미지의 모서리를 판단 할 수있을 것입니다 : 내가 함께 작동하도록 노력하고 있음을 예를 들어 이미지입니다 다음은? 윤곽 분석과 심지어는 기능 매칭 알고리즘을 시도했지만 그 중 어느 것도 내게 필요한 신뢰성을주지 못했습니다.

일반적으로 CV에 익숙하지 않아 정확한 문제를 해결할 수있는 편리한 기능이 있습니까?

감사합니다!

편집 :

Image Raw

+0

당신은'cv2.goodFeaturesToTrack을()'체크 아웃 한? –

답변

0

내가 cv2.goodFeaturesToTrack()를 사용하려고 할 것 : 변수 조명으로 인해, 나는 내가 다루는 노력하고있어의 예제 이미지를 추가했습니다. 당신은 문자 그대로/이것은 당신이 양자 필터와 goodFeaturesToTrack 매개 변수로 플레이 할 수 있습니다 results

을 무엇을 얻을 수있는 OpenCV의 워드 프로세서 LINK

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

img = cv2.imread('test.png') 
gray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY) 
blur = cv2.bilateralFilter(gray, 16, 50, 50) 

corners = cv2.goodFeaturesToTrack(blur, 40, 0.1, 10) 
corners = np.int0(corners) 

for i in corners: 
    x,y = i.ravel() 
    cv2.circle(img,(x,y),3,255,-1) 

plt.circle(img, (x, y), 3, 255, -1) 
plt.show() 

에서 코드를 붙여 복사 할 수 있습니다.

또 다른 옵션은 모서리의 일치 필터를 사용하는 것입니다 (즉, 단어에 대한 모든 조회수를 얻지는 않습니다).

+0

좋은 기능을 사용해 보았지만 두 번째로 실제 세계 사진 (전화 또는 비슷한 것으로부터)을 얻었습니다. 조명의 그라디언트가 goodFeaturesToTrack에 어려움을 줬습니다. 나는 – agupta231

+0

를 본다. 좋은 조명으로 처리가 훨씬 쉬워 지지만 BilateralFilter가 약간 도움이 될 수 있습니다. 이 실사 이미지 중 하나를 공유 할 수 있습니까? –

+0

원본 게시물을 수정하고 예제 이미지를 포함 시켰습니다. – agupta231

0

cv2.findContours()을 사용하여 주어진 이미지의 모든 윤곽선을 찾은 다음 각 윤곽선의 경계 사각형을 찾고 모든 윤곽 rect 중에서 minX, minY, maxX, maxY를 찾으십시오. 바깥 쪽 경계선은 모든 작은 윤곽선을 포함하므로 원하는 결과를가집니다.

import cv2 
import numpy as np 

img = cv2.imread("/Users/anmoluppal/Downloads/mjut8.png", 0) 

# Threshold and Invert the image to find the contours 
ret, thresh = cv2.threshold(img, 10, 255, cv2.THRESH_BINARY_INV) 

# Find the contours 
im, contours, hierarchy = cv2.findContours(thresh.copy(), cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_NONE) 

x, y, r, b = [img.shape[1]/2, img.shape[0]/2, 0, 0] 
# Iterate over all the contours, and keep updating the bounding rect 

for cnt in contours: 
    rect = cv2.boundingRect(cnt) 
    if rect[0] < x: 
     x = rect[0] 
    if rect[1] < y: 
     y = rect[1] 
    if rect[0] + rect[2] > r: 
     r = rect[0] + rect[2] 
    if rect[1] + rect[3] > b: 
     b = rect[1] + rect[3] 

bounding_rect = [x, y, r-x, b-y] 

# Debugging Purpose. 
cv2.rectangle(img, (x, y), (r, b), np.array([0, 255, 0]), 3) 

enter image description here

관련 문제