Counting Circles, Ellipses and Finding Waldo with Template Matching

김성빈·2024년 5월 1일
0

Modern Computer Vision

목록 보기
17/117

목표

Mini Project

1. Counting Circular Blobs

(원형블롭 세는 미니프로젝트)

2. using Template Matching to find Waldo

(Template Matching을 이용한 Waldo 찾기 미니프로젝트)

1. Counting Circular Blobs

이미지에서 내가 원하는 이미지를 찾는 미니 프로젝트이다.

이미지 내에 여러 원들이 있겠지만 그중에 내가 원하는것들은 볼록한것과 높은 관성을 가진 원들을 찾아내는것이 목표이다.

concave, convex, low inertia, high inertia
(오목, 볼록, 낮은 관성, 높은 관성)


해당 이미지에서 High Inertia, Low Inertia 의 원들이 같이 존재한다.

detector = cv2.SimpleBlobDetector_create()
라는 코드를 사용해서 해당 이미지에 기본이 되는 blob들을 생성한다.

여기서 기본 parameter을 사용했을때에는 Low Inertia 에 대한 것도 인식을 한다.

내가 원하는 블롭만 인식하고 싶을때 사용하는 코드 부분이다.

params = cv2.SimpleBlobDetector_Params()

# Set Area filtering parameters
params.filterByArea = True
params.minArea = 100

# Set Circularity filtering parameters
params.filterByCircularity = True 
params.minCircularity = 0.9

# Set Convexity filtering parameters
params.filterByConvexity = False
params.minConvexity = 0.2
    
# Set inertia filtering parameters
params.filterByInertia = True
params.minInertiaRatio = 0.01

# Create a detector with the parameters
detector = cv2.SimpleBlobDetector_create(params)

파라미터를 만들어서 그 파라미터 안에 내가 원하는 블롭 형태의 데이터를 넣어주고 blob을 다시 검색하면

blobs = cv2.drawKeypoints(image, keypoints, blank, (0,255,0),
                                      cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

이미지 내에 내가 원하는 블롭이 8개 존재한다는것을 확인할 수 있다.

import cv2
import numpy as np
from matplotlib import pyplot as plt

# Load image
image = cv2.imread("images/blobs.jpg", 0)
imshow('Original Image',image)

# Intialize the detector using the default parameters
detector = cv2.SimpleBlobDetector_create()
 
# Detect blobs
keypoints = detector.detect(image)
 
# Draw blobs on our image as red circles
blank = np.zeros((1,1)) 
blobs = cv2.drawKeypoints(image, keypoints, blank, (0,0,255),
                                      cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

number_of_blobs = len(keypoints)
text = "Total Number of Blobs: " + str(len(keypoints))
cv2.putText(blobs, text, (20, 550), cv2.FONT_HERSHEY_SIMPLEX, 1, (100, 0, 255), 2)

# Display image with blob keypoints
imshow("Blobs using default parameters", blobs)

# Set our filtering parameters
# Initialize parameter settiing using cv2.SimpleBlobDetector
params = cv2.SimpleBlobDetector_Params()

# Set Area filtering parameters
params.filterByArea = True
params.minArea = 100

# Set Circularity filtering parameters
params.filterByCircularity = True 
params.minCircularity = 0.9

# Set Convexity filtering parameters
params.filterByConvexity = False
params.minConvexity = 0.2
    
# Set inertia filtering parameters
params.filterByInertia = True
params.minInertiaRatio = 0.01

# Create a detector with the parameters
detector = cv2.SimpleBlobDetector_create(params)
    
# Detect blobs
keypoints = detector.detect(image)

# Draw blobs on our image as red circles
blank = np.zeros((1,1)) 
blobs = cv2.drawKeypoints(image, keypoints, blank, (0,255,0),
                                      cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)

number_of_blobs = len(keypoints)
text = "Number of Circular Blobs: " + str(len(keypoints))
cv2.putText(blobs, text, (20, 550), cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 100, 255), 2)

# Show blobs
imshow("Filtering Circular Blobs Only", blobs)

2. using Template Matching to find Waldo

waldo를 찾아라는 어렸을때 복잡한 그림속에서 waldo라는 캐릭터를 찾는 그림게임이다.

실제로 찾는것이 쉽지는 않았는데 Waldo라는 Template를 저장하고 그 Template가 이미지 내에 있는지 찾게하는 프로젝트이다.

template = cv2.imread('./images/waldo.jpg')
imshow('Template', template)

우리가 찾아야할 waldo를 template로 지정해준다.

그리고 저장된 template를 기반으로 cv2.matchTemplate 함수를 사용해서 이미지 내에 waldo를 찾는다.

# Load input image and convert to grayscale
image = cv2.imread('./images/WaldoBeach.jpg')
imshow('Where is Waldo?', image)

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Load Template image
template = cv2.imread('./images/waldo.jpg',0)

result = cv2.matchTemplate(gray, template, cv2.TM_CCOEFF)
min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result)

#Create Bounding Box
top_left = max_loc
bottom_right = (top_left[0] + 50, top_left[1] + 50)
cv2.rectangle(image, top_left, bottom_right, (0,0,255), 5)

imshow('Where is Waldo?', image)


waldo를 찾고 어디있는지 잘 보이게 표현하기 위해 박스를 만드는 함수를 사용했고,

template(waldo)의 크기에서 50만큼 더한 네모 박스를 만들게 설정했다.

#Create Bounding Box
top_left = max_loc
bottom_right = (top_left[0] + 50, top_left[1] + 50)
cv2.rectangle(image, top_left, bottom_right, (0,0,255), 5)

profile
감사합니다. https://www.youtube.com/channel/UCxlkiu9_aWijoD7BannNM7w

0개의 댓글