OpenCV-Python 윤곽 적합 실현

11700 단어 OpenCV윤곽 적합
머리말
윤곽 이 뭐 예요?
윤곽 은 연속 적 인 점(경계 연결)을 연결 하 는 곡선 으로 간단하게 볼 수 있 으 며 같은 색깔 이나 그 레이스 케 일 을 가지 고 있다.윤곽 은 형상 분석 과 물체 의 검 측 과 식별 에 매우 유용 하 다.
4.567917.더욱 정확 하기 위해 이치 화 이미 지 를 사용 해 야 한다.윤곽 을 찾기 전에 한도 값 화 처리 나 Canny 경계 검 사 를 해 야 합 니 다4.567917.윤곽 을 찾 는 함수 가 원본 그림 을 수정 합 니 다.윤곽 을 찾 은 후에 도 원본 그림 을 사용 하려 면 원본 그림 을 다른 변수 에 저장 해 야 합 니 다
  • OpenCV 에서 윤곽 을 찾 는 것 은 검은색 배경 에서 초백색 물체 와 같다.찾 는 물 체 는 흰색 이 어야 하고 배경 은 검은색 이 어야 한 다 는 것 을 기억 해 야 한다
  • 윤곽 을 계산 할 때 실제 윤곽 이 필요 하지 않 고 윤곽 에 가 까 운 근사 다각형 만 필요 할 수도 있다.예 를 들 어 사각형 은 모두 차이 가 많 지 않 은 윤곽 이 고 모두 길이 가 같 지 않 으 며 평행 한 사각형 이다.그러면 비슷 한 윤곽 을 제공 하면 우 리 는 모양 을 구분 할 수 있다.
    OpenCV 에서,이것 은 우리 에 게 cv2.boundingRect()함 수 를 제공 하여 윤곽 의 직사각형 경 계 를 그립 니 다.그 완전한 정 의 는 다음 과 같 습 니 다.
    
    def boundingRect(array):
    array:앞에서 소개 한 바 와 같이 array 는 그 레이스 케 일 이미지 나 윤곽 입 니 다.
    이 함수 가 3 개의 값 을 되 돌려 줄 때 사각형 경계 의 왼쪽 상단 정점 의 좌표 값 과 사각형 경계 의 너비 와 높이 입 니 다.4 개의 값 을 되 돌 릴 때 직사각형 왼쪽 상단 의 x 좌표,y 좌표,그리고 너비 입 니 다.
    타원 의 사각형 경계 그리 기
    지금도 우 리 는 앞의 타원 도형 을 사용 합 니 다.아래 그림 과 같 습 니 다.
    椭圆
    도형 을 얻 은 후에 우 리 는 위의 함 수 를 사용 하여 이 이미지 윤곽 의 4 값 을 계산 합 니 다.코드 는 다음 과 같 습 니 다.
    
    import cv2
    
    img = cv2.imread("26_1.jpg")
    
    #        
    gray = cv2.cvtColor(img1, 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)
    x, y, w, h = cv2.boundingRect(contours[0])
    print(x, y, w, h)
    
    실행 후 콘 솔 출력 은 다음 과 같 습 니 다.
    输出值
    여기 서 우 리 는 타원 의 직사각형 왼쪽 상단 좌 표를(53,120)얻 었 는데 그 너비 와 높이 는 각각 272 와 84 이다.
    우 리 는 사각형 경계 의 좌표 와 너비 가 높 은 것 을 얻 었 으 니 사각형 경 계 를 그리 기 시작 할 수 있다.앞에서 윤곽 을 추출 하여 그 리 는 것 은 cv2.draw Contours()함수 입 니 다.여기 도 마찬가지 입 니 다.
    코드 는 다음 과 같 습 니 다:
    
    import cv2
    import numpy as np
    
    img = cv2.imread("26_1.jpg")
    cv2.imshow("img1",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)
    x, y, w, h = cv2.boundingRect(contours[0])
    rect=np.array([[[x,y],[x+w,y],[x+w,y+h],[x,y+h]]])#1
    cv2.drawContours(img,[rect],-1,(255,255,255),2)#1
    
    cv2.imshow("img2",img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 한 후에 타원 의 사각형 경 계 는 우리 에 게 표시 되 었 습 니 다.효 과 는 다음 과 같 습 니 다.
    矩形边界
    물론,여기 서 우 리 는 또 다른 함수 cv2.rectangle()을 사용 하여 사각형 경 계 를 그 릴 수 있 습 니 다.값 은 위의 코드 에서 주석 1 의 두 코드 를 바 꿔 야 합 니 다.구체 적 으로 다음 과 같 습 니 다.
    
    cv2.rectangle(img, (x, y), (x + w, y + h), (255, 255,255),2)
    
    최소 포위 사각형 상자
    OpenCV 에 서 는 cv2.minareaRect()를 제공 하여 최소 포위 사각형 상 자 를 그립 니 다.전체 정 의 는 다음 과 같 습 니 다.
    
    def minAreaRect(points):
    
    그 중에서 points 매개 변 수 는 윤곽 이 고 반환 값 은 사각형 특징 정보 로 사각형 의 중심(x,y),너비 와 회전 각 도 를 포함한다.
    특히 minareaRect 함수 의 반환 값 은 drawContours()함수 에 직접 대 입 할 수 없습니다.따라서 우 리 는 이 를 요구 에 부 합 된 구조 로 바 꿔 야 계속 조작 할 수 있다.cv2.boxPoint()함 수 를 통 해 drawContours()에 맞 는 구조 적 매개 변수 로 변환 할 수 있 습 니 다.
    아니면 위의 그 그림 입 니까?그러나 우 리 는 회전 후의 타원 원 도 를 사용 합 니 다.코드 는 다음 과 같 습 니 다.
    
    import cv2
    import numpy as np
    
    img = cv2.imread("26_4.jpg")
    
    cv2.imshow("img1",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)
    rect= cv2.minAreaRect(contours[0])
    print(rect)
    points=cv2.boxPoints(rect)
    print(points)
    points=np.int0(points)
    print(points)
    cv2.drawContours(img,[points],0,(255,255,255),2)
    
    cv2.imshow("img2",img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 후 이미지 효과 및 콘 솔 의 출력 정 보 는 다음 과 같 습 니 다.
    最小轮廓
    值的转换过程
    여기 서 우 리 는 minareaRect()함수 가 값 을 되 돌려 주 는 전환 과정 을 똑똑히 볼 수 있다.먼저 box Points()함 수 를 통 해 drawContours()함수 가 받 아들 일 수 있 는 매개 변수 형식 으로 변환 한 다음 에 취 정 을 통 해 구체 적 인 픽 셀 좌표 값 으로 변환 합 니 다.
    최소 포위 원형 틀
    최소 포위 직사각형 틀 이 있 는 이상 최소 포위 원형 틀 이 있 을 것 이다.OpenCV 에 서 는 cv2.minEnclosing Circle()함 수 를 제공 하여 최소 포위 원형 상 자 를 그립 니 다.
    함수 의 전체 정 의 는 다음 과 같다.
    
    def minEnclosingCircle(points): 
    
    이 매개 변 수 는 위의 points 매개 변수 와 일치 하지만 반환 값 은 같 지 않 습 니 다.원형 을 그 리 는 것 은 사각형 을 그 리 는 매개 변수 와 다 를 것 입 니 다.
    그것 은 두 개의 반환 값 이 있 는데 하 나 는 원형의 중심 좌표(x,y)이 고 하 나 는 원형의 반지름 r 이다.다음은 위 타원 의 최소 포위 원형 상 자 를 직접 그립 니 다.구체 적 인 코드 는 다음 과 같다.
    
    import cv2
    import numpy as np
    
    img = cv2.imread("26_4.jpg")
    
    cv2.imshow("img1", 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)
    (x, y), r = cv2.minEnclosingCircle(contours[0])
    center = (int(x), int(y))
    r = int(r)
    cv2.circle(img, center, r, (255, 255, 255), 2)
    
    cv2.imshow("img2", img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 후 효 과 는 다음 과 같 습 니 다.
    最小圆形框
    타원
    OpenCV 에서,이것 은 우리 에 게 cv2.fitEllipe()함수 가 가장 적합 한 타원 을 그 리 는 것 을 제공 합 니 다.그 완전한 정 의 는 다음 과 같다.
    
    def fitEllipse(points):
    그 중에서 points 매개 변 수 는 앞에서 말 한 것 과 일치 하고 그의 반환 값 은 RotatedRect 유형 입 니 다.이것 은 이 함수 가 타원 에 적합 한 외 접 사각형 으로 돌아 가기 때 문 입 니 다.사각형 의 질량 심,너비,회전 각도 등 정 보 를 포함 합 니 다.이런 정 보 는 타원 의 중심 점,축 길이,회전 각도 와 일치 하기 때 문 입 니 다.
    다음은 이 함 수 를 사용 하여 타원 에 가장 적합 하 게 그립 니 다.여기 서 우 리 는 위의 그림 과 같은 사각형 그림 을 선택 합 니 다.구체 적 인 코드 는 다음 과 같다.
    
    import cv2
    
    img = cv2.imread("27.jpg")
    
    cv2.imshow("img1", 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)
    ellipse = cv2.fitEllipse(contours[0])
    
    cv2.ellipse(img, ellipse, (0, 0, 255), 3)
    
    cv2.imshow("img2", img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 후 효 과 는 다음 과 같 습 니 다.
    最优拟合椭圆
    최 적 의합 직선
    OpenCV 에서 cv2.fitLine()함수 가 가장 적합 한 직선 을 그립 니 다.전체 정 의 는 다음 과 같 습 니 다.
    
    def fitEllipse(points):
    points:앞에서 말 했 듯 이 윤곽 입 니 다.
    distType:거리 유형.직선 을 맞 출 때 는 입력 점 을 직선 을 맞 추 는 거리 와 최소 로 해 야 한다.상세 한 매개 변수 정 의 는 개발 문 서 를 참고 합 니 다.여 기 는 군말 이 아 닙 니 다.
    param:거리 매개 변수,선택 한 거리 유형 과 관계 가 있 습 니 다.이 매개 변수 가 0 일 때 자동 으로 최 적 화 된 값 을 선택 합 니 다.
    reps:의합 직선 에 필요 한 직경 방향 정 도 를 나타 내 는 데 사 용 됩 니 다.보통 이 값 은 0.01 로 설정 되 어 있 습 니 다.
    aeps:의합 직선 에 필요 한 각도 정 도 를 나타 내 는 데 사 용 됩 니 다.보통 이 값 은 0.01 로 설정 되 어 있 습 니 다.
    2 차원 직선 에 대해 반환 값 line 은 4 차원 이 고 앞의 2 차원 은 의합 한 직선 방향 을 대표 하 며 뒤의 두 사람 은 직선 상의 한 점 을 대표 한다.
    다음은 코드 를 직접 사용 하여 가장 적합 한 직선 을 그립 니 다.
    
    import cv2
    
    img = cv2.imread("27.jpg")
    
    cv2.imshow("img1", 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)
    ellipse = cv2.fitEllipse(contours[0])
    
    cv2.ellipse(img, ellipse, (0, 0, 255), 3)
    
    cv2.imshow("img2", img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 후 효 과 는 다음 과 같 습 니 다.
    直线拟合
    직선 을 그 리 는 데 있어 서 직선 을 그 리 는 출발점 과 종점 을 가 져 와 야 합 니 다.여기 서 lefty 는 출발점 이 고 righty 는 종점 입 니 다.
    최소 아웃 소 싱 삼각형
    OpenCV 에 서 는 cv2.minEnclosing Triangle()함수 로 최소 아웃 소 싱 삼각형 을 그립 니 다.그 전체 정 의 는 다음 과 같다.
    
    def minEnclosingTriangle(points, triangle=None):
    
    그 중에서 points 는 앞에서 말 한 것 과 유사 하 며 반환 값 triangle 은 아웃 소 싱 삼각형 의 세 개의 정점 집합 이다.
    다음 에 우 리 는 최소 아웃 소 싱 삼각형 을 직접 구축 하고 구체 적 인 코드 는 다음 과 같다.
    
    import cv2
    
    img = cv2.imread("27.jpg")
    
    cv2.imshow("img1", 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)
    
    area, trg1 = cv2.minEnclosingTriangle(contours[0])
    print(area)
    print(trg1)
    for i in range(0, 3):
        cv2.line(img, tuple(trg1[i][0]), tuple(trg1[(i + 1) % 3][0]), (0, 255, 0), 2)
    
    cv2.imshow("img2", img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 후 효 과 는 다음 과 같 습 니 다.
    三角形
    주의해 야 할 것 은 cv2 에서 삼각형 을 직접 그 리 는 함수 가 없 기 때문에 우 리 는 세 개의 직선 을 그 려 삼각형 을 그립 니 다.minEnclosing Triangle()함수 의 첫 번 째 반환 값 은 삼각형 면적 이 고 두 번 째 반환 값 은 세 개의 좌표 입 니 다.
    접근 다각형
    OpenCV 에 서 는 cv2.approx PolyDP()함수 가 지정 한 변 수 를 구축 하 는 근접 다각형 도 제공 합 니 다.그 전체 정 의 는 다음 과 같다.
    
    def approxPolyDP(curve, epsilon, closed, approxCurve=None): 
    
    curve:윤곽
    epsilon:정밀도,원시 윤곽 의 경계 점 과 다각형 경계 에 가 까 운 최대 거리
    closed:불 타 입.트 루 를 위해 다각형 에 접근 하 는 것 은 폐쇄 적 이라는 뜻 이다.false 를 위해 서,biao 는 다각형 이 폐쇄 되 지 않 기 때 문 이 라 고 말 했다.
    approx Curve 는 이 함수 의 반환 값 으로 다각형 에 가 까 운 점 집합 입 니 다.
    다음은 다각형 에 가 까 운 여러 가지 그림 을 그 려 보 겠 습 니 다.코드 는 다음 과 같 습 니 다.
    
    import cv2
    
    img = cv2.imread("24.jpg")
    
    list=[0.1,0.09,0.055,0.05,0.02]
    
    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)
    
    for i, val in enumerate(list):
        epsilon = val * cv2.arcLength(contours[0], True)
        approx = cv2.approxPolyDP(contours[0], epsilon, True)
        cv2.drawContours(img, [approx], 0, (0, 255, 0), 2)
    
        cv2.imshow("img"+str(i), img)
    
    cv2.waitKey()
    cv2.destroyAllWindows()
    
    실행 후 효 과 는 다음 과 같 습 니 다.
    逼近多边形
    cv2.approx PolyDP()함 수 는 Douglas-Peucker 알고리즘 을 사용 합 니 다.이 알고리즘 은 먼저 윤곽 에서 가장 먼 두 점 을 찾 아 두 점 을 연결 하 는 원리 입 니 다.그 다음 에 윤곽 에서 현재 직선 에서 가장 먼 점 을 찾 고 이 점 을 원래 의 직선 과 폐쇄 된 다각형 으로 연결 하면 삼각형 을 얻 을 수 있다.이 를 통 해 사각형,오각형,육각형 등 을 유추 할 수 있다.현재 다각형 의 거 리 는 함수 cv2.approx PolyDP()의 인자 epsilon 의 값 보다 작 을 때 교 체 를 중단 합 니 다.
    여기 서 OpenCV-Python 의 윤곽 적합 실현 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 관련 OpenCV 윤곽 적합 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 많은 응원 바 랍 니 다!

    좋은 웹페이지 즐겨찾기