Python Opencv 단일 목표 검출 을 위 한 예제 코드
목표 검 측 은 이미지 에서 자신 이 관심 이 있 는 부분 을 찾기 위해 다음 작업 을 나 누 어 배경 에 대한 방 해 를 피 할 수 있 습 니 다.다음은 opencv 를 바탕 으로 하 는 단일 목표 검출 알고리즘 을 소개 합 니 다.알고리즘 의 전체적인 사상 은 목표 구역 의 픽 셀 값 을 1 로 설정 하고 배경 구역 을 모두 0 으로 설정 한 다음 에 다른 방법 으로 목표 의 외 접 사각형 을 찾 아 분할 합 니 다.여기 서 전망 과 배경 차이 가 비교적 큰 그림 을 예 로 들 겠 습 니 다.
환경:python 3.7 opencv 4.4.0
2 배경 전경 분리
1 그 레이스 케 일+2 값+형태학 윤곽 특징 과 연결 구성 요소
그림 의 전경 과 배경의 차이 에 따라 이치 화 를 한다.예 를 들 어 뚜렷 한 색채 차이 가 있 는 경우 HSV 색채 공간 으로 전환 하여 분할한다.
원 도
2 그 레이스 케 일
3 이치 화
4 형태학 적 처리
5 윤곽 추출 및 목표 외 접 사각형 찾기
코드 패키지:
def get_roi_contours(image_path, morph_size, num_morph):
'''
:
image_path:
morph_size:
num_morph:
'''
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
#
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#
threhold, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#
kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=morph_size)
morph_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)
for i in range(num_morph-1):
morph_image = cv2.morphologyEx(morph_image, cv2.MORPH_CLOSE, kernel)
#
contours, hierarchy = cv2.findContours(morph_image, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#
area = 0
max_area_index = 0
for j in range(len(contours)):
if area < cv2.contourArea(contours[j]):
max_area_index = j
area = cv2.contourArea(contours[j])
rect = cv2.boundingRect(contours[max_area_index])
return rect
6.연결 구성 요 소 를 통 해 외 접 사각형 을 찾 습 니 다.코드 패키지:
def get_roi_ConCom(image_path, morph_size, num_morph):
'''
:
image_path:
morph_size:
num_morph:
'''
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
#
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
#
threhold, binary_image = cv2.threshold(gray_image, 0, 255, cv2.THRESH_BINARY_INV+cv2.THRESH_OTSU)
#
kernel = cv2.getStructuringElement(shape=cv2.MORPH_RECT, ksize=morph_size)
morph_image = cv2.morphologyEx(binary_image, cv2.MORPH_CLOSE, kernel)
for i in range(num_morph-1):
morph_image = cv2.morphologyEx(morph_image, cv2.MORPH_CLOSE, kernel)
#
numlabels, components_img, stats, centers = cv2.connectedComponentsWithStats(morph_image, 8)
#
stats_without_back = stats[1:]
#
max_area = np.max(stats_without_back, axis=0)[-1]
# index
max_area_index = stats_without_back[:, -1]==max_area
rect = stats_without_back[max_area_index]
return np.squeeze(rect)[0:4]
2.Kmeans 집합 은 전망 과 배경의 분 리 를 실현 합 니 다.1 kmeans 집합 후의 그림 은 클 러 스 터 의 중심 이 무 작위 로 초기 화 되 었 기 때문에 목표 의 픽 셀 값 은 0 일 수도 있 고 1 일 수도 있 습 니 다.opencv 의 find Contours 를 사용 하면 전경 픽 셀 값 을 1 로 요구 합 니 다.
2 윤곽 특징 을 이용 하여 외 접 직사각형 찾기
KMeans 가 클 러 스 터 중심 을 무 작위 로 초기 화하 여 전경 대상 픽 셀 이 불확실 하 므 로 가장자리 추출 방법 으로 윤곽 을 찾 습 니 다.
테두리 그림:
코드 패키지:
def get_roi_Kmeans(image_path):
image = cv2.imread(image_path, cv2.IMREAD_COLOR)
image_data = image.reshape(-1, 3).astype(np.float32) #
# ,
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_COUNT, 10, 1)
interia, label, centers = cv2.kmeans(image_data, 2, None, criteria, 5, cv2.KMEANS_RANDOM_CENTERS)
# , 0 255,
label[label==0] = 255
label[label==1] = 0
# , uint8
thresh_img = label.reshape(image.shape[0:2]).astype(np.uint8)
x_grad = cv2.Sobel(thresh_img, cv2.CV_32F, 1, 0)
y_grad = cv2.Sobel(thresh_img, cv2.CV_32F, 0, 1)
x_grad = cv2.convertScaleAbs(x_grad) #ax + b
y_grad = cv2.convertScaleAbs(y_grad)
dst = cv2.add(x_grad, y_grad, dtype=cv2.CV_16S) # sobel
dst = cv2.convertScaleAbs(dst)
plt.imshow(dst, cmap='gray')
# 1
contours, hierarchy = cv2.findContours(dst, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)
#
rect = cv2.boundingRect(contours[0])
return rect
삼 총 결단일 목표 검 측 은 비교적 간단 하 며 목표 와 배경의 차 이 를 합 리 적 으로 이용 하면 분리 할 수 있다.물론 단일 목표 검 측 방법 도 많 습 니 다.예 를 들 어 목표 템 플 릿 이 있 을 때 템 플 릿 이 일치 하거나 평균 값 으로 이동 할 수 있 고 충분 한 데이터 세트 가 있 을 때 기계 학습 과 깊이 있 는 학습 방법 을 사용 할 수 있 습 니 다.
Python Opencv 가 단일 목표 검출 을 실현 하 는 예제 코드 에 관 한 이 글 은 여기까지 소개 되 었 습 니 다.더 많은 Opencv 단일 목표 검출 내용 은 우리 의 이전 글 을 검색 하거나 아래 의 관련 글 을 계속 찾 아 보 세 요.앞으로 많은 응원 바 랍 니 다!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
Opencv 학습 노트 (2): Opencv 의 기본 데이터 형식 과 데이터 구조매트릭스 데이터 형식: C 언어 에서 2 차원 데이터 중의 데이터 형식, 예 를 들 어 int, float, char 등 과 같다.Opencv 에서 행렬 의 데이터 형식 ...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.