물체 검출과 오검출 평가

학습 목표

검출 개수가 많다고 좋은 설정은 아닙니다. 알고 있는 원의 위치·크기와 비교해 오검출을 판단합니다.

실행 조건

opencv-python-headless·NumPy·Matplotlib을 사용합니다.

정답이 있는 영상 만들기

시작 조건

160×200 Gray 영상에 중심 (50,50), (140,70), (90,120), 반지름 15,20,12인 원을 그립니다.

진행 방법

  1. 제공된 원 영상에 HoughCircles를 적용하세요.
  2. 검출 결과를 원본 위에 그려 실제 원과 대응시키세요.

남길 결과

import numpy as np
import matplotlib.pyplot as plt
import cv2 as cv
truth=[(50,50,15),(140,70,20),(90,120,12)]
image=np.full((160,200),230,dtype=np.uint8)
for x,y,r in truth:cv.circle(image,(x,y),r,30,-1)
blur=cv.GaussianBlur(image,(5,5),1)
def detect(frame,threshold=20):
    return cv.HoughCircles(frame,cv.HOUGH_GRADIENT,dp=1,minDist=25,param1=100,param2=threshold,minRadius=8,maxRadius=25)
found=detect(blur);print(found)
plt.imshow(image,cmap='gray')
if found is not None:
    for x,y,r in found[0]:plt.gca().add_patch(plt.Circle((x,y),r,fill=False,color='tab:red'))

결과 기록·자가 점검

원:

실제 중심·반지름:

검출 중심·반지름:

오차 [pixel]:

확인할 점

검출 기준 하나 바꾸기

시작 조건

param2=15와 25를 비교합니다. 같은 영상·반지름 범위를 유지합니다.

진행 방법

  1. 검출 수·놓친 원·중복·오검출을 각각 세세요.
  2. 중심 오차 5 pixel 이내이고 반지름 오차 4 pixel 이내인 검출을 대응으로 정하세요.
  3. 어떤 기준이 더 나은지 검출 수가 아니라 오류의 종류로 판단하세요.

남길 결과

for threshold in [15,25]:print(threshold,detect(blur,threshold))
# TODO: 검출을 정답과 일대일 대응해 오류를 세세요.

결과 기록·자가 점검

param2:

대응된 원:

놓친 원:

오검출:

중심 오차:

확인할 점

흐림·잡음에서 실패 찾기

시작 조건

seed=7, 표준편차 15의 영상 잡음을 추가하고 같은 설정을 적용합니다.

진행 방법

  1. 검출 전에 Median 또는 Gaussian Filter 중 하나를 선택하세요.
  2. 필터 전후의 검출과 계산 시간을 비교하세요.
  3. 영상 기반 제어에서 검출을 신뢰할 수 없는 조건을 한 가지 정하세요.

남길 결과

rng=np.random.default_rng(7)
noisy=np.clip(image.astype(float)+rng.normal(0,15,image.shape),0,255).astype(np.uint8)
filtered=cv.medianBlur(noisy,5);print(detect(filtered))
# TODO: 필터 전후의 대응 결과와 시간을 비교하세요.

결과 기록·자가 점검

전처리:

검출 수:

대응 성공:

처리 시간 [ms]:

확인할 점

공식 예제·데이터