2014-11-16 3 views
0

: 나는 인쇄 할 때OpenCV의 파이썬 인식을 형성 (나쁜 화질) 나는 이미지의 특정 모양을 감지하기 위해 다음 코드를 사용하고

import cv2 
import numpy as np 

img = cv2.imread("006.jpg") 

grey = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) 

ret,thresh = cv2.threshold(grey,127,255,1) 

cv2.imshow('img',thresh) 
cv2.waitKey(0) 

contours, h = cv2.findContours(thresh, 1, cv2.CHAIN_APPROX_SIMPLE) 
contours.sort(key = len) 
for contour in contours: 

    approx = cv2.approxPolyDP(contour, 0.01*cv2.arcLength(contour, True), True) 

    #star - > yellow 
    if len(approx) == 10: 
     cv2.drawContours(img, [contour],0, (0,255,255), -1) 

    #circle -> black 
    elif len(approx) >= 11: 
     cv2.drawContours(img, [contour], 0, (0,0,0), -1) 

    #triangle -> green 
    elif len(approx) == 3: 
     cv2.drawContours(img,[contour],0,(0,255,0),-1) 

    #square -> blue 
    elif len(approx) == 4: 
     cv2.drawContours(img, [contour],0, (255,0,0),-1) 

    #pentagon -> red 
    elif len(approx) == 5: 
     cv2.drawContours(img, [contour],0, (0,0,255), -1) 

cv2.imshow('img',img) 
cv2.waitKey(0) 

이 코드는 내 컴퓨터에 이미지를 잘 작동하지만, 이미지를 찍은 후 코드를 다시 실행 해보십시오 (예 : image). 그래야 제대로 작동하지 않습니다.

나는 블러와 카니를 사용하여 이미 시도했지만 두 번째 사진을 충분히 부드럽게 만들 수는 없습니다.

누군가 도와 드릴 수 있기를 바랍니다.

답변

0

고정 된 임계 값 (귀하의 경우 127)을 사용하는 것은 아마도 카메라로 촬영 한 사진의 경우에는 좋지 않습니다 (셰이더가 음영의 영향을받지 않는 순수한 색상 인 경우) . 127이 제공 한 이미지에 너무 높은 가치가있는 것 같습니다.

Otsu method을 사용해 보시지 않겠습니까? Here's opencv에서 python을 사용하는 방법에 대한 예제. 카메라가 촬영 한 이미지의 경우 실제 환경에 대해 임계 값 수준을 변경하지 않습니다.

+0

답변 해 주셔서 감사합니다. 오츠 방법은 나를 위해 잘 작동하지는 않았지만 적응 형 임계 값 지정과 캐니 함수를 사용하여 해결했습니다. –