OpenCV-Python 볼록 패키지 획득 실현

5603 단어 OpenCV볼록 가방
머리말
다각형 에 접근 하 는 것 은 어떤 이미지 윤곽 의 높이 가 비슷 한 것 이 고 볼록 가방 의 제 기 는 다각형 에 접근 하 는 것 을 간소화 하기 위 한 것 이다.사실 볼록 가방 은 다각형 에 가 까 운 것 과 비슷 하지만 물체 의 가장 바깥쪽 에 있 는'볼록'다각형 에 불과 하 다.
간단하게 요약 하면 볼록 가방 은 원래 의 윤곽 을 완전히 포함 하고 윤곽 상의 점 으로 만 구 성 된 다각형 을 말한다.볼록 가방 의 특징 은 모든 곳 이 볼록 하 다 는 것 이다.즉,볼록 가방 안에 임의의 두 점 을 연결 하 는 직선 은 볼록 가방 의 내부 에 있 고 임의로 3 개 점 을 연속 하 는 내각 은 180 도보 다 작다.
OpenCV 에서 윤곽 의 볼록 패 키 지 를 얻 기 위해 cv2.convexHull()을 제공 합 니 다.그 전체 정 의 는 다음 과 같다.

def convexHull(points, hull=None, clockwise=None, returnPoints=None): 
points:윤곽
hull:반환 값,돌출 각 점 입 니 다.다각형 의 점 좌표 나 색인 으로 이해 할 수 있 습 니 다.
clockwise:불 유형,True 일 때 볼록 각 점 은 시계 방향 으로 배 열 됩 니 다.false 일 때 는 시계 반대 방향 입 니 다.
returnPoints:불 형식,기본 값 True,함수 가 돌출 각 점 의 x/y 좌 표를 되 돌려 줍 니 다.false 일 때 함 수 는 윤곽 의 볼록 한 각 점 의 색인 을 되 돌려 줍 니 다.
볼록 각 점 획득
볼록 가방 의 역할 을 알 고 OpenCV 가 제공 하 는 함 수 를 이해 했다.다음은 우리 가 마음대로 그림 한 장 을 골 라 서 볼록 한 각 점 을 얻는다.구체 적 인 코드 는 다음 과 같다.

import cv2

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

cv2.imshow("img", img)
#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

hull=cv2.convexHull(contours[0])

print(hull)
여기에서 우 리 는 그림 한 장 을 마음대로 가 져 왔 고,볼록 한 가방 의 각 점 을 가 져 왔 다.실행 후 각 점 좌 표 는 다음 과 같 습 니 다.
凸包角点
인자 returnPoints 를 False 로 변경 하면 해당 하 는 6 개의 색인 값 을 되 돌려 줍 니 다.
여기에 코드 를 한 줄 더 추가 하면 볼록 가방 다각형 을 그 릴 수 있 습 니 다.구체 적 으로 추 가 된 코드 는 다음 과 같 습 니 다.

#  hull  
cv2.polylines(img, [hull], True, (0, 255, 0), 2)
cv2.imshow("img1", img)
실행 후 효 과 는 다음 과 같 습 니 다.
凸包效果
돌출 결함
볼록 가방 과 윤곽 사이 의 부분 을 우 리 는 볼록 결함 이 라 고 부른다.OpenCV 에서 함수 cv2.convexity Defects()를 사용 하여 돌출 된 결함 을 가 져 옵 니 다.전체 정 의 는 다음 과 같 습 니 다.

def convexityDefects(contour, convexhull, convexityDefects=None): 
윤곽
볼록 가방
convexity Defects:반환 값,돌출 결함 집합 입 니 다.그것 은 하나의 배열 로 되 돌아 오 는 것 은[출발점,종점,윤곽 상의 거리 볼록 가방 의 가장 먼 점,가장 먼 점 에서 볼록 가방 의 유사 거리]를 포함한다.
특히 이 함수 로 돌출 결함 을 계산 하기 전에 함수 cv2.convexHull()을 사용 하여 돌출 패 키 지 를 가 져 와 야 하지만 그 매개 변수 returnPoints 는 false 여야 합 니 다.
다음은 이 함 수 를 사용 하여 위의 그림 의 돌출 결함 을 계산 합 니 다.코드 는 다음 과 같 습 니 다:

import cv2

img = cv2.imread("24.jpg")
cv2.imshow("img", img)

#        
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

ret, binary = cv2.threshold(gray, 127, 255, cv2.THRESH_BINARY)
contours, hierarchy = cv2.findContours(binary, cv2.RETR_LIST, cv2.CHAIN_APPROX_SIMPLE)

hull = cv2.convexHull(contours[0], returnPoints=False)

defects = cv2.convexityDefects(contours[0], hull)
print(defects)

for i in range(defects.shape[0]):
    s, e, f, d = defects[i, 0]
    start = tuple(contours[0][s][0])
    end = tuple(contours[0][e][0])
    far = tuple(contours[0][f][0])
    cv2.line(img, start, end, [0, 255, 0], 2)
    cv2.circle(img, far, 5, [0, 0, 255], -1)

cv2.imshow("img1", img)

cv2.waitKey()
cv2.destroyAllWindows()
실행 후 효 과 는 다음 과 같 습 니 다.
控制台与图像
위의 그림 에서 보 듯 이 우 리 는 점 으로 표 시 된 돌출 결함 으로 오각별 의 모든 오목 어깨 가 돌출 된 결함 임 을 볼 수 있다.
마지막 으로 다음 과 같이 확장 할 수 있 습 니 다.그 중에서 OpenCV 는 함수 cv2.isContourConvex()를 제공 하여 윤곽 이 볼록 한 지 여 부 를 판단 할 수 있 습 니 다.또한 cv2.point PolygonTest()함 수 를 제공 하여 점 에서 다각형(윤곽)까지 의 최 단 거리,즉 수직선 거 리 를 계산 합 니 다.이 계산 은 점 과 다각형 의 관계 테스트 라 고 합 니 다.흥미 있 는 독 자 는 스스로 이 두 개의 방 함 수 를 실험 할 수 있다.
단순 예 제스처 그림
다음은 조금 어 려 운 그림 인 제스처 그림(finger.jpg)을 소개 하 겠 습 니 다.다음 과 같 습 니 다.

우 리 는 이 손짓 의 볼록 가방 을 찾 으 러 올 것 이다.기본 적 인 처리 방향 은 예전 과 일치 합 니 다.다만 이치 화 와 돌출 점 집합 크기 에 대해 처 리 를 해 야 합 니 다.이치 화 된 한도 값 은 235 이 고 돌출 점 집중 의 점 개 수 는 5 보다 많 으 며 완전한 Python 코드 는 다음 과 같 습 니 다.

import cv2

#            
imagepath = 'F://finger.jpg'
img = cv2.imread(imagepath, 1)
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

#    ,    235
ret, thresh = cv2.threshold(gray, 235, 255, cv2.THRESH_BINARY)

#         
image, contours, hierarchy = cv2.findContours(thresh, 2, 1)

#                
for cnt in contours:
    hull = cv2.convexHull(cnt)
    length = len(hull)
    #              5
    if length > 5:
        #          
        for i in range(length):
            cv2.line(img, tuple(hull[i][0]), tuple(hull[(i+1)%length][0]), (0,0,255), 2)

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

검 측 된 볼록 패 키 지 는 다음 그림 과 같다.

이 를 통 해 알 수 있 듯 이 모두 2 개의 돌출 가방 이 검출 되 었 다.하 나 는 전체 제스처 외곽 의 돌출 가방 으로 손 전 체 를 둘러싸 고 다른 하 나 는 두 손가락 으로 형 성 된 내부 도형 으로 O 의 돌출 가방 과 유사 하 다.이것 은 우리 의 기대 에 부합된다.
여기 서 OpenCV-Python 이 볼록 패 키 지 를 실현 하 는 데 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 OpenCV-Python 볼록 패 키 지 는 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

좋은 웹페이지 즐겨찾기