Image Classification

OpenCV Haar cascade로 2종 object detection 이 가능한가?

coding art 2022. 1. 27. 17:47
728x90

image classification에 관심이 큰 초보자 입장에서 아주 간단하게 OpenCV의 Haar cascade  라이브러리를 사용하여 사람과 고양이의 2종을 포함한 이미지를 classification 해 보도록 하자. 물론 Haar cascade 라이브러리는 object  하나하나씩을 여러개 학습시켜 만든 라이브러리임에도 불구하고 되기는 된다. 별 것 아닌 코드 같겠지만 image classification 을 꽤 오래 해오면서 느꼈던 중요한 의문중의 하나였기에 지금까지 쌓인 일단의 의문이 명쾌하게 해소되었다.

 

한가지 주의할 점은 OpenCV에서 2종류의 classifier 를 함께 사용하여 최종적으로 image에 중첩하여 bounding box를 출력하는 아래 코드는 그다지 정상적이 아니므로 출력은 얻어지나 코드 멈춤이 잘 안됨에 유의하자.

이미지 "mandcat.jpg" 다운로드 하시길.

 

#catface_detect.py

import cv2
import numpy as np
import sys
import time

faceCascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
catfaceCascade = cv2.CascadeClassifier("haarcascade_frontalcatface.xml")
camera = cv2.VideoCapture('mancat.jpg')
#camera = cv2.VideoCapture(0)
time.sleep(0.2)

while True:
 # and occupied/unoccupied text
    ret, image = camera.read()
    gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    graycopy = gray

    #faces = catfaceCascade.detectMultiScale(gray,scaleFactor=1.1,minNeighbors=0 )
    cats = catfaceCascade.detectMultiScale(gray,scaleFactor=1.1, minSize=(60,60) )
    # Draw a circle around the faces
    for (x, y, w, h) in cats:
        cv2.circle(image,(int(x+w/2),int(y+h/2)),int((w+h)/3),(255,255,255),3)
        #cv2.rectangle(image,(x, y), (x+w, y+h),(255,255,255),3)
        
    faces = faceCascade.detectMultiScale(graycopy,scaleFactor=1.1, minNeighbors=5 )
    # Draw a circle around the faces
    for (x, y, w, h) in faces:
        #cv2.circle(image,(int(x+w/2),int(y+h/2)),int((w+h)/3),(255,255,255),3)
        cv2.rectangle(image,(x, y), (x+w, y+h),(255,255,255),3)

    cv2.imshow("Frame", image)
   
    key = cv2.waitKey(1) & 0xFF
    if key == ord("q"):
        break
    
cv2.destroyAllWindows()

 

 

코드 실행이 제대로 될때까지 수정할 예정임.

Under Construction ....