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()
원도
실행 결과:
콘솔 출력:
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
opencv 기하학적 형상 추출기하학적 형상 식별(삼각형, 사각형/사각형, 다각형, 원 식별) 기하학적 형상 면적과 둘레, 중심 위치 계산 구체적인 코드 실현과 프로그램 시범을 보이기 전에 우리는 먼저 몇 가지 개념을 분명히 해야 한다. 1. 기...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.