opencv 이미지 윤곽 구현 예제
윤곽:윤곽
윤곽 은 연결 되 지 않 은 가장 자 리 를 연결 하 는 것 이다.
테두리 검출 테두리 검출 테두리 가 연결 되 지 않 았 습 니 다.
문제 에 주의 하 다
1.대상 은 2 치 이미지 이 고 먼저 한도 값 분할 또는 가장자리 검 사 를 실시한다.
2.윤곽 을 찾 으 려 면 원본 그림 을 변경 해 야 합 니 다.보통 원본 그림 의 일부분 을 사용 하여 복사 합 니 다.
3.opencv 에 서 는 검은색 배경 에서 흰색 을 찾 습 니 다.따라서 대상 은 흰색,배경 은 검은색 이 어야 한다.
방법.
contours,hierarchy=cv2.findContours(image,mode,method)
윤곽
hierarchy:이미지 의 토폴로지 정보(윤곽 차원)(이전 윤곽,부모 윤곽 저장...)
이미지:원본 이미지
mode:윤곽 검색 방식
method:윤곽 의 근사 한 방법
r=cv2.drawContours(image, contours, contourIdx, color[, thickness])
r:대상 그림image:원본 이미지
contours:모든 입력 윤곽 가장자리 배열
contourIdx:그 려 야 할 가장자리 색인 입 니 다.모두-1 로 그 려 지면.여러 목표 가 있 으 면 첫 번 째 목표 0,두 번 째 목표 1,세 번 째 목표 2 를 그 릴 수 있 습 니 다.
color:BGR 형식의 SCalar 로 그 려 진 색
thickness:선택 가능,그리 기 밀도,즉 윤곽 의 붓 굵기
import cv2
import numpy as np
o = cv2.imread('lena256.bmp')
gray = cv2.cvtColor(o,cv2.COLOR_BGR2GRAY)#BGR-
ret, binary = cv2.threshold(gray,127,255,cv2.THRESH_BINARY)#
contours, hierarchy = cv2.findContours(binary,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
co=o.copy()#
r=cv2.drawContours(co,contours,-1,(0,127,127),4)#co ,
cv2.imshow("original",o)
cv2.imshow("contours",r)
cv2.waitKey()
cv2.cvtColor(input_image,flag)색상 공간 변환 에 사용 합 니 다.
input_image:변환 할 그림
flag:형식 변환
cv2.COLOR_BGR2GRAY:BGR-그 레이스 케 일
cv2.COLOR_BGR2RGB:BGR-RGB
cv2.COLOR_BGR2HSV:BGR-HSV
최소 외접원
함수 cv2.minEnclosing Circle()은 대상 의 외 접 원 을 찾 을 수 있 습 니 다.그것 은 대상 을 포함 할 수 있 는 모든 원 중 면적 이 가장 작은 것 이다.
사례:현재 다음 그림 은 그림 중심 에 있 는 꽃 을 표시 해 야 합 니 다.
코드:
import numpy as np
import cv2 as cv
img=cv.imread("image.jpg",0)
# ,
x,y=img.shape
img=cv.resize(img,(y//2,x//2))
# , , cv.THRESH_TOZERO_INV
ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
# ,mode=cv.RETR_EXTERNAL,
im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#cv.minEnclosingCircle ndarray ,
# ,
point_list=[]
for i in contour:
for j in i:
point_list.append(j[0])
point_array=np.array(point_list)
# ,
(x,y),radius=cv.minEnclosingCircle(point_array)
# , , int
center=(int(x),int(y))
color=cv.cvtColor(img,cv.COLOR_GRAY2BGR)
color=cv.circle(color,center,radius=int(radius),color=(0,0,255),thickness=2)
#
cv.imshow("color",color)
cv.waitKey(0)
cv.destroyAllWindows()
프로그램 결과:볼록 가방
볼록 가방 은 윤곽 과 비슷 하지만 다른 경우 도 있 지만 결 과 는 같다.함수 cv2.convexHull()은 곡선 이 돌출 성 결함 이 있 는 지 확인 하고 결함 을 바로 잡 을 수 있 습 니 다.일반적으로 볼록 곡선 은 항상 튀 어 나 와 적어도 평평 하 다.opencv 에서 함수 cv.convexhull 을 사용 하여 윤곽 의 볼록 패 키 지 를 찾 습 니 다.이 함수 의 정 의 는:
hull=cv.convexHull( points[, hull[, clockwise[, returnPoints]]])
이 함수 의 매개 변 수 는 다음 과 같다.
Points:들 어 오 는 윤곽 이 필요 합 니 다.
Hull:출력,보통 필요 하지 않 습 니 다.
clockwise:취향 표지,True 라면 볼록 가방 의 방향 은 시계 방향 이 고 그렇지 않 으 면 시계 반대 방향 입 니 다.
returnPoints:기본 값 은 True 입 니 다.돌출 점 의 좌 표를 되 돌려 줍 니 다.False 로 설정 하면 돌출 점 에 대응 하 는 윤곽 의 점 을 되 돌려 줍 니 다.
아니면 위의 이 그림 입 니까?우 리 는 위의 코드 를 약간 수정 하면 돌출 된 가방 의 모양 을 얻 을 수 있 습 니 다.코드 는 다음 과 같 습 니 다.
import numpy as np
import cv2 as cv
img=cv.imread("image.jpg",0)
# ,
x,y=img.shape
img=cv.resize(img,(y//2,x//2))
# , , cv.THRESH_TOZERO_INV
ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
# ,mode=cv.RETR_EXTERNAL,
im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
#cv.minEnclosingCircle ndarray ,
# ,
point_list=[]
for i in contour:
for j in i:
point_list.append(j[0])
point_array=np.array(point_list)
# ,
hull=cv.convexHull(point_array,returnPoints=True)
color=cv.cvtColor(img,cv.COLOR_GRAY2BGR)
# , :
# cv.ploylines,
color=cv.polylines(color,[hull],True,(0,0,255),2)
#
cv.imshow("color",color)
cv.waitKey(0)
cv.destroyAllWindows()
프로그램 실행 결 과 는:그림 마스크 와 픽 셀 점
때때로 우 리 는 대상 을 구성 하 는 모든 픽 셀 점 이 필요 합 니 다.우 리 는 그림 의 모든 윤곽 을 추출 한 다음 함수 cv.draw Contours()를 사용 하여 윤곽 안의 영역 을 지정 한 색 으로 채 울 수 있 습 니 다.그리고 cv.find NonZeros()함 수 를 사용 하여 0 화소 점 이 아 닌 좌 표를 추출 하면 대상 을 구성 하 는 화소 점 을 얻 을 수 있 습 니 다.우 리 는 위의 그림 에서 조작 을 합 니 다.코드 는 다음 과 같 습 니 다.
import numpy as np
import cv2 as cv
img=cv.imread("image.jpg",0)
# ,
x,y=img.shape
img=cv.resize(img,(y//2,x//2))
# , , cv.THRESH_TOZERO_INV
ret,thresh=cv.threshold(img,127,255,cv.THRESH_TOZERO_INV)
# ,mode=cv.RETR_EXTERNAL,
im,contour,hierarchy=cv.findContours(thresh,cv.RETR_EXTERNAL,cv.CHAIN_APPROX_SIMPLE)
# , , numpy
mask=np.zeros(img.shape,dtype=np.uint8)
# thickness -1, cv.drawContours
mask=cv.drawContours(mask,contour,contourIdx=-1,color=(255,255,255),thickness=-1)
# mask , numpy
NonZeroPoints=np.array(cv.findNonZero(mask))
# , ,
NonZeroPoints=NonZeroPoints.reshape((-1,2))
# ,
#column row
column=NonZeroPoints[:,0]
row=NonZeroPoints[:,1]
# , 255
mask1=np.zeros(img.shape)
mask1[row,column]=255
#
cv.imshow("mask",mask)
cv.imshow("mask1",mask1)
cv.waitKey(0)
cv.destroyAllWindows()
프로그램 실행 결과:위의 두 그림 의 비교 결 과 를 통 해 우 리 는 대상 의 구성 픽 셀 점 이 정확하게 추출 되 었 음 을 알 수 있다.
여기 서 opencv 이미지 윤곽 의 실현 예제 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 opencv 이미지 윤곽 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
ip camera android에 액세스하고 java를 사용하여 모니터에 표시그런 다음 PC에서 다운로드 폴더를 추출해야 합니다 그런 다음 프로젝트 폴더에 다운로드한 javacv 라이브러리를 추가해야 합니다. 먼저 라이브러리 폴더를 마우스 오른쪽 버튼으로 클릭한 다음 jar/폴더 추가를 선택...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.