cv2.drawContours

1.1 윤곽이란 무엇입니까
윤곽은 단순히 동일한 색상 또는 회색조로 연속적인 점 (경계에 연결됨)으로 연결된 곡선으로 간주 될 수 있습니다. 윤곽선은 모양 분석과 물체 감지 및 인식에 유용합니다.

  • 정확성을 위해 이진 이미지가 사용됩니다. 임계 값 처리 또는 Canny 경계 감지를 수행해야합니다.
  • 윤곽선을 찾는 기능은 원본 이미지를 수정합니다. 나중에 원본 이미지를 계속 사용하려면 원본 이미지를 다른 변수에 저장해야합니다.
  • OpenCV에서 윤곽선을 찾는 것은 검정색 배경에 슈퍼 흰색 물체와 같습니다. 찾고있는 물체는 흰색이고 배경은 검은 색이어야합니다.
    이진 이미지에서 윤곽선을 찾는 방법.
    cv2.findContours () 함수에는 세 개의 매개 변수가 있습니다. 첫 번째는 입력 이미지, 두 번째는 윤곽 검색 모드, 세 번째는 윤곽 근사 방법입니다. 세 가지 반환 값이 있습니다. 첫 번째는 이미지, 두 번째는 윤곽선, 세 번째는 (윤곽) 단층 촬영 구조입니다. 윤곽선 (두 번째 반환 값)은 이미지의 모든 윤곽선이 저장되는 Python 목록입니다. 각 윤곽선은 객체의 경계점 (x, y)의 좌표를 포함하는 Numpy 배열입니다.
    1.2 윤곽선을 그리는 방법
    cv2.drawContours () 함수를 사용하여 윤곽선을 그릴 수 있습니다. 제공하는 경계점에 따라 모든 모양을 그릴 수 있습니다. 첫 번째 매개 변수는 원본 이미지이고 두 번째 매개 변수는 윤곽선, 파이썬 목록이며 세 번째 매개 변수는 윤곽선의 색인입니다 (독립 윤곽선을 그릴 때 유용하며 -1로 설정하면 모든 윤곽선이 그려집니다). 다음 매개 변수는 윤곽선의 색상과 두께입니다.
    하나의 이미지에 모든 윤곽을 그립니다.
import numpy as np
import cv2

img = cv2.imread('1024.jpg')
imgray = cv2.cvtColor(img,cv2.COLOR_BGR2GRAY)
ret,thresh = cv2.threshold(imgray,127,255,0)
image ,contours,hierarchy = cv2.findContours(thresh,cv2.RETR_TREE,cv2.CHAIN_APPROX_SIMPLE)
#绘制独立轮廓,如第四个轮廓
#imag = cv2.drawContour(img,contours,-1,(0,255,0),3)
#但是大多数时候,下面方法更有用
imag = cv2.drawContours(img,contours,3,(0,255,0),3)

while(1):
    cv2.imshow('img',img)
    cv2.imshow('imgray',imgray)
    cv2.imshow('image',image)
    cv2.imshow('imag',imag)
    if cv2.waitKey(1) == ord('q'):
        break
cv2.destroyAllWindows()

1.3
윤곽의 근사 방법 앞서 언급했듯이 윤곽은 동일한 회색 값을 가진 모양의 경계로, 모양의 경계에 모든 (x, y) 좌표를 저장합니다. 사실 모든 점이 필요한 것은 아니며 직선이 필요한 경우 두 개의 끝점을 찾으십시오. cv2.CHAIN_APPROX_SIMPLE을 구현할 수 있습니다. 윤곽에서 중복 지점을 제거하고 윤곽을 압축하여 메모리 비용을 절약합니다.
행렬을 사용하여 등고선 목록의 각 좌표에 파란색 원을 그립니다. 첫 번째는 총 734 점인 cv2.CHAIN_APPROX_NONE을 사용한 효과를 보여주고, 두 번째는 4 점만있는 cv2.CHAIN_APPROX_SIMPLE을 사용한 결과입니다.

2. 윤곽 특징
2.1 모멘트
이미지 의 모멘트는 이미지의 중심과 면적을 계산하는 데 도움이 될 수 있습니다.
cv2.moments () 함수는 계산 된 모멘트를 사전 형식으로 반환합니다.

import numpy as np
import cv2

img = cv2.imread('1024.jpg',0)
ret,thresh = cv2.threshold(img,127,255,0)
image,contours,hierarchy=cv2.findContours(thresh,1,2)
cnt=contours[0]
M=cv2.moments(cnt)
print(M)

이 순간의 값을 기반으로 물체의 무게 중심을 계산할 수 있습니다.

cx=int(M['m10']/M['m00'])
cy=int(M['m01']/M['m00'])

2.2 등고선 면적
은 함수 cv2.contourArea () 또는 모멘트 (0 차 모멘트), M [ 'm00']을 사용하여 계산할 수 있습니다.

area=cv2.contourArea(cnt)

2.3 등고선 원주
는 호 길이라고도합니다. cv2.arcLength () 함수를 사용하여 계산할 수 있습니다. 이 함수의 두 번째 매개 변수는 객체의 모양이 닫혀 있는지 (True) 열려 있는지 (곡선) 지정하는 데 사용할 수 있습니다.

perimeter = cv2.arcLength(cnt,True)

2.4 윤곽 근사
윤곽 모양을 더 적은 수의 포인트로 구성된 다른 윤곽 모양으로 대략적으로 계산 합니다. 새 윤곽의 포인트 수는 우리가 설정 한 정확도에 따라 결정됩니다. 사용 된 Douglas-Peucker 알고리즘은 Google에서 직접 검색 할 수 있습니다.
이미지에서 직사각형을 찾고 싶지만 이미지의 여러 이유 때문에 완벽한 직사각형을 얻을 수없고 "나쁜 모양"을 얻을 수 있다고 가정합니다. 이제이 함수를 사용하여이 모양을 근사 할 수 있습니다. 두 번째 매개 변수는 엡실론입니다. , 원래 윤곽에서 대략적인 윤곽까지의 최대 거리이며 정확도 매개 변수입니다.

epsilon=0.1*cv2.arcLength(cnt,True)
approx = cv2.approxPolyDP(cnt,epsilon,True)

2.5 볼록 껍질
볼록 껍질은 윤곽과 비슷하지만 일부 경우에는 동일한 결과를 제공하지만 다릅니다. cv2.convexHull () 함수를 사용하여 곡선에 볼록성 결함이 있는지 여부를 감지하고 결함을 수정할 수 있습니다. 일반적으로 볼록 곡선은 항상 볼록하고 적어도 평평합니다. 오목한 부분이 있으면 볼록 결함이라고합니다. 예를 들어, 아래 그림의 손에서 빨간색 곡선은 손의 볼록 껍질을 나타내고 볼록 결함은 이중 화살표로 표시됩니다.

hull = cv2.convexHull(points,hull,clockwise,returnPoints)

매개 변수 :

  • 전달하려는 윤곽을 가리 킵니다.
  • 일반적으로 필요하지 않은 선체 출력
  • 시계 방향 플래그, True로 설정하면 출력 볼록 껍질은 시계 방향이고 그렇지 않으면 시계 반대 방향입니다.
  • returnPoints의 기본값은 True입니다. 볼록 껍질에있는 지점의 좌표를 반환하고 False로 설정하면 볼록 껍질 지점에 해당하는 윤곽선의 지점을 반환합니다.
    위 그림의 볼록 껍질을 얻으려면 다음 명령을 사용할 수 있습니다.
hull=cv2.convexHull(cnt)

그러나 볼록성 결함을 얻으려면 returnPoints를 False로 설정해야합니다. 위의 직사각형을 예로 들어 먼저 cnt에서 윤곽선을 찾습니다. 이제 returnPoints를 True로 설정하여 볼록 껍질을 찾으면 직사각형의 네 모서리 점이 표시됩니다. 윤곽 점의 인덱스를 얻으려면 returnPoints를 False로 설정하십시오.
2.6 볼록성 감지
cv2.isContourConvex () 함수는 곡선이 볼록한지 여부를 감지 할 수 있습니다. True 또는 False 만 반환 할 수 있습니다.

k=cv2.isContourConvex(cnt)

2.7 경계 직사각형
직선 경계 직사각형, 회전하지 않는 직선 직사각형. 개체의 회전 여부를 고려하지 않습니다. 따라서 경계 사각형의 면적은 가장 작지 않습니다. cv2.boundingRect () 함수를 사용하여

#(x,y)为矩形左上角的坐标,(w,h)是矩形的宽和高
x,y,w,h=cv2.boundingRect(cnt)
img=cv2.rectangle(img,(x,y),(x+w,y+h),(0,255,0),2)

회전 경계 사각형 :이 경계 사각형은 개체의 회전을 고려하므로 면적이 가장 작습니다. cv2.minAreaRect () 함수를 사용합니다. 반환되는 것은 Box2D 구조로, 사각형 상단 모서리의 좌표 (x, y)와 사각형의 너비 및 높이 (w, h) 및 회전 각도를 포함합니다. 그러나이 사각형을 그리려면 사각형의 4 개의 모서리 점이 필요하며, 이는 cv2.boxPoints () 함수로 얻을 수 있습니다.
녹색은 직선 직사각형이고 빨간색은 회전하는 직사각형입니다.

2.8 최소 외접 원
cv2.minEnclosingCircle () 함수는 객체의 외접 원을 찾는 데 도움이 될 수 있습니다. 개체를 포함 할 수있는 모든 원의 가장 작은 영역입니다.

(x,y),radius = cv2.minEnclosingCircle(cnt)
center = (int(x),int(y))
radius = int(radius)
img = cv2.circle(img,center,radius,(0,255,0),2)

2.9 타원 피팅
cv2.ellipse () 함수를 사용하면 반환 값은 실제로 회전하는 경계 사각형의 내접 원입니다.

ellipse = cv2.fitEllipse(cnt)
img = cv2.ellipse(img,ellipse,(0,255,0),2)

2.10 직선 맞춤
점 집합에 따라 직선을 맞출 수 있으며 이미지의 흰색 점에 직선을 맞출 수도 있습니다.

rows,cols = img.shape[:2]
[vx,vy,x,y]=cv2.fitLine(cnt,cv2.DIST_L2,0,0.01,0.01)
lefty=int((x*vy/vx)+y)
righty=int(((cols-x)*vy/vx)+y)
img = cv2.line(img,(cols-1,righty),(0,lefty),(0,255,0),2)

 

 

Matlab, Python 및 C ++ 프로그래밍, 머신 러닝, 컴퓨터 비전 이론 구현 및지도, 학부 및 석사 학위, 소금에 절인 생선 거래, 전문 답변을 알아보십시오. QQ 번호 757160542에 문의하십시오.

 

추천

출처blog.csdn.net/weixin_36670529/article/details/113927254