opencv 기하학적 형상 추출

5114 단어 화상 처리OpenCv
  • 기하학적 형상 식별(삼각형, 사각형/사각형, 다각형, 원 식별)
  • 기하학적 형상 면적과 둘레, 중심 위치 계산
  • 기하학적 형태의 색상 추출하기


  • 구체적인 코드 실현과 프로그램 시범을 보이기 전에 우리는 먼저 몇 가지 개념을 분명히 해야 한다.

    1. 기본 개념과 함수 소개


    1. 컨투어
    윤곽이란 무엇인지, 간단하게 말하면 윤곽은 일부 열점이 연결되어 모양을 구성하는 것이다. 그들은 같은 색깔을 가지고 있고 윤곽 발견은 이미지의 대상 분석, 대상 검측 등에 매우 유용한 도구이다. OpenCV에서 윤곽을 사용하여 관련 함수를 발견할 때 이미지를 2치 이미지로 입력해야 윤곽 추출, 테두리 추출 등 조작에 편리하다.프로파일에서 발견된 함수와 매개변수는 다음과 같이 설명됩니다.
    findContours(image, mode, method, contours=None, hierarchy=None, offset=None)
    - image / 
    - mode  、 List、Tree、External
    - method  , 
    - contours  
    - hieracrchy  
    - offset  

    2. 다각형이 다각형에 접근하는 것은 윤곽의 외형에 무한히 접근하여 비관건점을 삭제하고 윤곽의 관건점을 얻어 윤곽의 실제 모양에 계속 접근하는 방법이다. OpenCV에서 다각형이 접근하는 함수와 파라미터는 다음과 같이 설명한다.
    approxPolyDP(curve, epsilon, closed, approxCurve=None)
    - curve  
    - epsilon  , 
    - close  

    3. 기하 거리 계산 이미지 기하 거리는 이미지의 기하학적 특징으로 고급 기하 거리 중심화 이후 특징의 불변성이 있어 Hu 거리 출력을 생성하여 형상 일치 등 조작에 사용할 수 있다. 여기서 우리는 1단계 기하 거리를 계산하여 지정된 윤곽의 중심 위치를 얻어 기하 거리의 함수와 파라미터를 계산하여 다음과 같이 설명한다.
    moments(array, binaryImage=None)
    - array 
    - binaryImage None

    2. 코드 실현과 시범


    전체 코드의 실현은 다음과 같은 몇 단계로 나뉜다
  • 이미지 로드
  • 이미지 이치화
  • 프로파일 검색
  • 기하학적 형상 식별
  • 측정 둘레, 면적, 계산 센터
  • 색상 추출의 전체 소스 코드는 다음과 같습니다.
  • ####################################################
    #    :zhigang,
    ####################################################
    import cv2 as cv
    import numpy as np
    
    class ShapeAnalysis:
        def __init__(self):
            self.shapes = {'triangle': 0, 'rectangle': 0, 'polygons': 0, 'circles': 0}
    
        def analysis(self, frame):
            h, w, ch = frame.shape
            result = np.zeros((h, w, ch), dtype=np.uint8)
            #  
            print("start to detect lines...
    ") gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) ret, binary = cv.threshold(gray, 0, 255, cv.THRESH_BINARY_INV | cv.THRESH_OTSU) cv.imshow("input image", frame) out_binary, contours, hierarchy = cv.findContours(binary, cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) for cnt in range(len(contours)): # cv.drawContours(result, contours, cnt, (0, 255, 0), 2) # epsilon = 0.01 * cv.arcLength(contours[cnt], True) approx = cv.approxPolyDP(contours[cnt], epsilon, True) # corners = len(approx) shape_type = "" if corners == 3: count = self.shapes['triangle'] count = count+1 self.shapes['triangle'] = count shape_type = " " if corners == 4: count = self.shapes['rectangle'] count = count + 1 self.shapes['rectangle'] = count shape_type = " " if corners >= 10: count = self.shapes['circles'] count = count + 1 self.shapes['circles'] = count shape_type = " " if 4 < corners < 10: count = self.shapes['polygons'] count = count + 1 self.shapes['polygons'] = count shape_type = " " # mm = cv.moments(contours[cnt]) cx = int(mm['m10'] / mm['m00']) cy = int(mm['m01'] / mm['m00']) cv.circle(result, (cx, cy), 3, (0, 0, 255), -1) # color = frame[cy][cx] color_str = "(" + str(color[0]) + ", " + str(color[1]) + ", " + str(color[2]) + ")" # p = cv.arcLength(contours[cnt], True) area = cv.contourArea(contours[cnt]) print(" : %.3f, : %.3f : %s : %s "% (p, area, color_str, shape_type)) cv.imshow("Analysis Result", self.draw_text_info(result)) cv.imwrite("D:/test-result.png", self.draw_text_info(result)) return self.shapes def draw_text_info(self, image): c1 = self.shapes['triangle'] c2 = self.shapes['rectangle'] c3 = self.shapes['polygons'] c4 = self.shapes['circles'] cv.putText(image, "triangle: "+str(c1), (10, 20), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) cv.putText(image, "rectangle: " + str(c2), (10, 40), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) cv.putText(image, "polygons: " + str(c3), (10, 60), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) cv.putText(image, "circles: " + str(c4), (10, 80), cv.FONT_HERSHEY_PLAIN, 1.2, (255, 0, 0), 1) return image if __name__ == "__main__": src = cv.imread("D:/javaopencv/gem_test.png") ld = ShapeAnalysis() ld.analysis(src) cv.waitKey(0) cv.destroyAllWindows()

    원도
    실행 결과:
    콘솔 출력:

    좋은 웹페이지 즐겨찾기