OpenCV

: 실시간 이미지/영상 처리에 사용하는 오픈 소스 라이브러리 

: Python, C++, Java 와 같은 다양한 개발 환경을 지원

: Windows, Linux, Mac OS, iOS Android같은 다양한 OS를 지원하는 크로스 플랫폼

 

 

Cascade Classifier : 다단계 분류

- Haar Cascade Object Detection 모듈

     : 머신러닝 기반 Object Detection 알고리즘. OpenCV의 대표적인 API

     : 다수의 객체 이미지와 객체가 아닌 이미지를 cascade 함수로 트레이닝 시켜 객체 검출

     : 미리 정해진 방식으로 인식(xml 파일에 학습데이터 저장되어 있음)

       ↔ Machine Learning : data training 방식

     : 빠른 Object Detection 가능, 간단, 가벼움

     : 정확도가 낮아 예외 사항에 약함

 

import cv2
import numpy as np
from tkinter import *
from PIL import Image
from PIL import ImageTk
from tkinter import filedialog

#xml에 있는 얼굴인식 파일정보를 기반으로 detection
face_cascade_name = './opencv/data/haarcascades/haarcascade_frontalface_alt.xml'
eyes_cascade_name = './opencv/data/haarcascades/haarcascade_eye_tree_eyeglasses.xml'

file_name = 'soccer.jpg'
title_name = 'Haar cascade object detection'
frame_width = 500 #사이즈가 크면 인식하는게 더 많기도 함(Haar cascade의 경우)

def selectFile():
    file_name=filedialog.askopenfilename(initialdir="./", title="Select file",filetypes = (("jpeg files","*.jpg"),("all files","*.*")))
    print('File name: ', file_name)

    read_image = cv2.imread(file_name)
    (height, width) = read_image.shape[:2]
    frameSize = int(sizeSpin.get())
    ratio = frameSize / width
    dimension = (frameSize, int(height * ratio))
    read_image = cv2.resize(read_image, dimension, interpolation = cv2.INTER_AREA)
    image = cv2.cvtColor(read_image, cv2.COLOR_BGR2RGB)
    image = Image.fromarray(image)
    imgtk = ImageTk.PhotoImage(image=image)
    detectAndDisplay(read_image)

def detectAndDisplay(frame):
    frame_gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)#Gray scale로 바꿔줌
    frame_gray = cv2.equalizeHist(frame_gray) #히스토그램 이용 -> 디지털 이미지
    #-- Detect faces
    faces = face_cascade.detectMultiScale(frame_gray) #MultiScale 특정 영역.. 얼굴정보

    for(x,y,w,h) in faces:
        center = (x+w//2, y+h//2) #사각형(얼굴) 중간
        frame = cv2.rectangle(frame, (x,y), (x+w, y+h), (0,255,0), 4) #녹색 사각형(두께4)그리기
        faceROI = frame_gray[y:y+h, x:x+w] #관심영역 = 금방 선택한 얼굴
        #-- In each face, detect eyes
        eyes = eyes_cascade.detectMultiScale(faceROI)
        for (x2,y2,w2,h2) in eyes:
            eye_center = (x + x2 + w2//2, y + y2 + h2//2)
            radius = int(round((w2 + h2)*0.25)) #반지금 구하기 : 정사각형모양에 0.25곱해서(4분의 1)실수, 반올림
            frame = cv2.circle(frame, eye_center, radius, (255,0,0),4)

    #cv2.imshow("Capture - Face detection", frame)
    #버튼을 눌러 새로운 화면 보여줌
    image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGB)
    image= Image.fromarray(image)
    imgtk = ImageTk.PhotoImage(image = image)
    detection.config(image=imgtk)
    detection.image = imgtk


#main
main = Tk()
main.title(title_name)
main.geometry()

read_img = cv2.imread(file_name)
(height, width) = read_img.shape[:2]
ratio = frame_width / width
dimension = (frame_width, int(height * ratio))
read_img = cv2.resize(read_img, dimension, interpolation = cv2.INTER_AREA)

image = cv2.cvtColor(read_img, cv2.COLOR_BGR2RGB) #이걸 안하면 색이 좀 빛바랜 것처럼 나옴
image = Image.fromarray(image)
imgtk = ImageTk.PhotoImage(image = image) #Tk Pillow 위에 그리기 위한 과정

#cv2.imshow("Original Image", image)

face_cascade = cv2.CascadeClassifier()
eyes_cascade = cv2.CascadeClassifier()

#-- 1. Load the cascades
if not face_cascade.load(cv2.samples.findFile(face_cascade_name)):
    print("--(!) Error Loading face cascade")
    exit(0)
if not eyes_cascade.load(cv2.samples.findFile(eyes_cascade_name)):
    print("--(!) Error Loading eyes cascade")
    exit(0)
    

label = Label(main, text=title_name) #타이틀
label.config(font=("Courier", 18))
label.grid(row=0, column=0, columnspan=4)

sizeLabel = Label(main, text='Frame Width : ')
sizeLabel.grid(row=1, column=0)

sizeVal = IntVar(value = frame_width)
sizeSpin = Spinbox(main, textvariable = sizeVal, from_=0, to=2000, increment=100, justify=RIGHT) #부모 윈도우 안에,,,
sizeSpin.grid(row=1, column=1)

Button(main, text="File Select", height=2, command=lambda:selectFile()).grid(row=1,column=2, columnspan=2)
detection = Label(main, image=imgtk)
detection.grid(row=2, column=0, columnspan=4)
detectAndDisplay(read_img)

사진 크기에 따라 인식률이 달라지는 것을 확인할 수 있다

'Study > Deep Learning' 카테고리의 다른 글

Gradient Clipping  (0) 2021.10.20
TensorFlow 2.0을 이용한 Char-RNN 구현  (0) 2021.10.20
Embedding  (0) 2021.10.20
순환신경망(RNN)  (0) 2021.10.19
Pre-Trained CNN 모델을 이용한 Image Classification  (0) 2021.10.18

+ Recent posts