2017-02-20 10 views
1

OpenCV3를 사용하여 Python3에서 간단한 프로젝트를 만들고 "완료된"퍼즐 이미지와 일치하는 퍼즐 조각을 찾으려고합니다. SIFT를 사용하여 테스트를 시작했습니다.OpenCV Python 기능 감지 : 마스크를 제공하는 방법? (SIFT)

퍼즐 조각의 윤곽을 추출하여 이미지를자를 수 있지만 대부분 고주파수 부분이 조각 주위에 있기 때문에 (조각이 끝나고 바닥이 시작되는 곳) 마스크를 전달하고 싶습니다. SIFT detectAndCompute() 메서드를 호출하여 알고리즘이 조각 내에서만 키포인트를 찾도록합니다.

test_mask = np.ones(img1.shape, np.uint8) 
kp1, des1 = sift.detectAndCompute(img1, mask = test_mask) 

테스트 마스크를 통과 한 후 (확인이 UINT8의 수 있도록), 나는 다음과 같은 오류 얻을 : 내 연구에서

kp1, des1 = sift.detectAndCompute(img1,mask = test_mask) cv2.error: /home/pyimagesearch/opencv_contrib/modules/xfeatures2d/src/sift.cpp:772: error: (-5) mask has incorrect type (!=CV_8UC1) in function detectAndCompute

을 UINT8은 동일 CV_8U, 단지의 별칭입니다 CV_8UC1. Python의 모든 피쳐 탐지 알고리즘에 마스크를 전달하는 코드 샘플을 찾을 수 없습니다.

+0

'img1'이 컬러 이미지이면 3 개의 채널을 가지므로 마스크는'[rows, cols, 3]'와 같은'img1.shape'을 사용하기 때문에'CV_8UC3' 타입이됩니다. 단일 채널 마스크를 만들어야합니다. – Miki

+0

또 다른 방법으로 만든 바이너리 마스크를 사용하고 있는데 [행, 열, 1]이라고 가정했지만 답변 덕분에 3 채널 이미지로 변환 된 것을 발견했습니다. 고맙습니다! 문제가 생겨서 죄송합니다 (여전히 Python에서 유형 컨트롤을 찾으려고합니다). 답변으로 의견을 수락 할 수있는 방법이 있습니까? – m3h0w

+0

도움이 되니 기쁩니다. 올바른 코드와 설명을 사용하여 답변을 직접 작성하십시오. – Miki

답변

1

미키 덕분에 나는 버그를 발견했습니다.

임계 값 연산을 사용하여 만든 원래의 마스크는 3 진수로 보았지만 3 채널 이미지 ([rows], [cols], 3)이었습니다. 따라서 그것은 가면으로 받아 들일 수 없습니다.

유형 및 형상을 검사 한 후 (UINT8되어야하며 [행 COLS 1]) :

print(mask.dtype) 
print(mask.shape) 

여전히 3 채널의 경우, 회색 마스크를 변환 :

mask = cv2.cvtColor(mask, cv2.COLOR_BGR2GRAY)