type OpenCV 2.4에서 윤곽선과 경계 사각형 다루기-python 2.7



python opencv hull (1)

OpenCv와 Python으로 작업하고 있으며 Structural Analysis 및 Shape Descriptors를 다루고 있습니다. 나는이 블로그를 발견했다 : http://opencvpython.blogspot.it/2012/06/contours-2-brotherhood.html 그것은 매우 도움이되고 나는 경계 사각형을 그리기 위해 흑백 이미지로 시도해 왔으며 작동한다. 하지만 이제는 이미지에서 추출한 것입니다. 예를 들어 노랑색을 사용하고 경계 사각형을 그립니다. 문제는 흑백 이미지가 일정하지 않고 약간의 노이즈가 있고 코드가 전체 모양을 인식하지 못하는 것입니다.

그리고 이것은 코드입니다 :

import numpy as np
import cv2

im = cv2.imread('shot.bmp')
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
COLOR_MIN = np.array([20, 80, 80],np.uint8)
COLOR_MAX = np.array([40, 255, 255],np.uint8)
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX)
imgray = frame_threshed
ret,thresh = cv2.threshold(frame_threshed,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
cnt=contours[0]
x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("Show",im)
cv2.waitKey()
cv2.destroyAllWindows()

원본 이미지가 상당히 시끄 cv2.medianBlur() 때문에 간단한 수정은 cv2.medianBlur() 사용하여 일부 노이즈를 제거하는 것입니다. 이렇게하면 원본 이미지의 작은 노이즈 영역이 제거되고 하나의 컨투어 만 cv2.medianBlur() 됩니다. 코드의 처음 몇 줄은 다음과 같습니다.

im = cv2.imread('shot.bmp')
im = cv2.medianBlur(im,5)    # 5 is a fairly small kernel size
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)

그러나이 방법은 커널 크기를 수동으로 지정해야하기 때문에 가장 강력하지 않으며 코드에서 cnt=contours[0] 은 관심있는 컨투어가 컨투어 목록의 전나무라고 가정합니다. 하나의 등고선 만 있습니다. 보다 견고한 방법은 가장 큰 윤곽에 관심이 있다고 가정하여 중간 정도의 노이즈까지도 보정 할 수 있습니다.

이렇게하려면 다음 행을 추가하십시오.

# Find the index of the largest contour
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
cnt=contours[max_index]

줄 이후 :

contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

이 코드 결과 :

import numpy as np
import cv2

im = cv2.imread('shot.bmp')
hsv_img = cv2.cvtColor(im, cv2.COLOR_BGR2HSV)
COLOR_MIN = np.array([20, 80, 80],np.uint8)
COLOR_MAX = np.array([40, 255, 255],np.uint8)
frame_threshed = cv2.inRange(hsv_img, COLOR_MIN, COLOR_MAX)
imgray = frame_threshed
ret,thresh = cv2.threshold(frame_threshed,127,255,0)
contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)

# Find the index of the largest contour
areas = [cv2.contourArea(c) for c in contours]
max_index = np.argmax(areas)
cnt=contours[max_index]

x,y,w,h = cv2.boundingRect(cnt)
cv2.rectangle(im,(x,y),(x+w,y+h),(0,255,0),2)
cv2.imshow("Show",im)
cv2.waitKey()
cv2.destroyAllWindows()

이 두 가지 방법 모두 올바른 경계 상자를 사용하여 결과를 제공합니다.

주의
OpenCV 3.x에서 findContours() 메소드는 ( here 볼 수 있듯이) 3 개의 결과를 반환하므로 추가 반환 값은 다음과 같이 catch되어야합니다.

_, contours, hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPL‌​E)




opencv-contour