[라즈베리파이 강좌] OpenCV 예제 1. 얼굴 인식 예제

알도 2017-11-15 (수) 17:54 7년전 25115  

 

 

라즈베리파이 강좌

  OpenCV 예제 1. 얼굴 인식 예제

 

 

 

  안녕하세요. 메카솔루션 알도입니다.

  지난 번에 힘겹게 라즈베리파이에 OpenCV를 설치해보았는데요. 이번 주에는 OpenCV를 어떻게 사용하는지 알 수 있도록 제공한 샘플들을 살펴보도록 하겠습니다.

 

 

 

  세상에는 좋은 라이브러리들이 참 많은데요. 사실 라이브러리를 만드는 것도 고되지만, 만든 후에 사용 방법을 정리하는 것도 만만치 않게 힘든 일입니다. 그래서 이런 사용 방법이 잘 정리되어 있지 않아 코 앞에 두고도 사용하지 못하는 라이브러리들이 참 많습니다. 다행이 OpenCV는 사용 방법이 매우 잘 정리되어 있고, 다양한 예제까지 제공하고 있습니다.

 

 

 

     OpenCV Samples

 

 

  시작하기 전

  아직 OpenCV를 설치하지 않으신 분들은 아래 링크를 참조하시기 바랍니다.

http://blog.naver.com/roboholic84/221139256044


  설치하는데에는 상당한 시간과 노력이 소요됩니다. 거의 저녁 혹은 퇴근 1시간 전 쯤에 시작하고 다음 날 확인하는 것이 가장 현명한 선택이라고 할 수 있겠습니다.

  만약 아직 라즈베리파이와 SD카드를 준비하지 않으셨거나, 여유가 안되시는 분들은 저희 메카솔루션에서 라즈비안 최신 버전에 OpenCV 3.3.0이 설치완료되어있는 SD카드를 판매 중이오니 관심 가져주시면 감사하겠습니다.

 

http://mechasolution.com/shop/goods/goods_view.php?goodsno=543841&category=046

 

 

 OpenCV 예제

  OpenCV의 예제 파일들은 아래와 같은 위치에 있습니다.

 



  OpenCV에서는 보시는 바와 같이 다양한 형태로 예제들을 지원합니다. C++, Java, Python 등의 언어를 사용하는 법부터, 안드로이드에 적용하거나, dnn(Deep Learning Network)나 gpu(그래픽 카드 핵심 칩) 같이 고급 영상처리의 필수인 기계학습, 연산 등의 기능도 지원합니다.

  여기서 python 폴더로 들어가면 아래와 같이 다양한 예제들을 볼 수 있습니다.

 

 

 

 

 얼굴 인식

  영상처리 기술이 많이 발전해서 일상 생활에서도 다양한 어플리케이션을 접할 수 있는데요. 그 중에 가장 많이 볼 수 있는 것이 얼굴 인식이 아닌가 싶습니다. 여기에 표정 인식까지 더해져서 자신의 얼굴도 재미있는 동영상을 만들 수 있는 스마트 폰 앱들이 많이 유행하고 있죠. 오늘은 이 얼굴 인식을 직접 OpenCV를 이용해서 만들어 보겠습니다. 먼저 OpenCV를 가상환경에 설치했기 때문에 가상환경에 먼저 들어가야 합니다.

 

 (cv) $ source ~/.profile

 (cv) $ workon cv

 

 위의 폴더의 위치에서 facedetection.py를 실행하면 아래와 같은 내용을 볼 수 있습니다.

 

 (cv) $ python facedetection.py

 

 

 

  보시는 바와 같이 얼굴과 눈의 위치를 인식할 수 있고, 이러한 크기의 이미지에서 얼굴을 찾는데 보통 150ms 전후의 시간이 걸립니다. 이제 예제 파일의 내용을 한번 살펴보도록 하겠습니다. 터미널에서 Ctrl+C를 눌러 프로그램을 정지합니다.

 

 (cv) $ nano facedetection.py

 

  내용이 좀 많은데 핵심만 살펴보도록 하겠습니다. 예제는 크게 얼굴을 인식하는 detect 함수와 인식한 얼굴에 사각형 표시를 해주는 draws_rects 그리고 메인으로 구성되어 있습니다. 여러분들이 자신의 어플리케이션에 얼굴 인식 기능을 사용하고자 한다면 이 상단에 import되는 라이브러리들과 이 두 함수를 사용하면 됩니다.

 

#!/usr/bin/env python


'''

face detection using haar cascades


USAGE:

    facedetect.py [--cascade <cascade_fn>] [--nested-cascade <cascade_fn>] [<video_source>]

'''


# Python 2/3 compatibility

from __future__ import print_function


import numpy as np

import cv2


# local modules

from video import create_capture

from common import clock, draw_str


def detect(img, cascade):

    rects = cascade.detectMultiScale(img, scaleFactor=1.3, minNeighbors=4, minSize=(30, 30),

                                     flags=cv2.CASCADE_SCALE_IMAGE)

    if len(rects) == 0:

        return []

    rects[:,2:] += rects[:,:2]

    return rects


def draw_rects(img, rects, color):

    for x1, y1, x2, y2 in rects:

        cv2.rectangle(img, (x1, y1), (x2, y2), color, 2)


if __name__ == '__main__':

    # 파일 옵션을 입력 받는 부분입니다. 옵션을 사용하지 않으니 넘어가도록 하겠습니다.

    import sys, getopt

    print(__doc__)


    args, video_src = getopt.getopt(sys.argv[1:], '', ['cascade=', 'nested-cascade='])

    try:

        video_src = video_src[0]

    except:

        video_src = 0

    args = dict(args)


    # 옵션에서 특별한 요구사항이 없으면 기본 옵션으로 진행합니다.

    # 얼굴 인식과 눈 인식 2개의 학습된 뉴럴넷을 가져옵니다.

    cascade_fn = args.get('--cascade', "../../data/haarcascades/haarcascade_frontalface_alt.xml")

    nested_fn  = args.get('--nested-cascade', "../../data/haarcascades/haarcascade_eye.xml")


    cascade = cv2.CascadeClassifier(cascade_fn)

    nested = cv2.CascadeClassifier(nested_fn)


   // 별도의 이미지를 옵션으로 입력하지 않았다면 기본값으로 lena를 가져옵니다.

    cam = create_capture(video_src, fallback='synth:bg=../data/lena.jpg:noise=0.05')


    while True:

        #이미지 파일을 읽어옵니다.

        ret, img = cam.read()

        # 흑백이미지로 변환합니다.

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

        # 히스토그램을 이퀄라이즈 합니다.

        gray = cv2.equalizeHist(gray)


        # 시작한 시간을 측정합니다. 

        t = clock()

        # 얼굴 인식을 실행합니다.

        rects = detect(gray, cascade)

        # 원본이미지를 복사합니다.

        vis = img.copy()

        # 얼굴이 인식된 부분에 사각형을 그려줍니다.

        draw_rects(vis, rects, (0, 255, 0))

        # 같은 식으로 눈을 인식하고 눈 부분에 사각형을 그려줍니다.

        if not nested.empty():

            for x1, y1, x2, y2 in rects:

                roi = gray[y1:y2, x1:x2]

                vis_roi = vis[y1:y2, x1:x2]

                subrects = detect(roi.copy(), nested)

                draw_rects(vis_roi, subrects, (255, 0, 0))

        # 처리를 시작한 시점과 마친 시점의 시간 차이를 이용하여 소요된 시간을 계산합니다.

        dt = clock() - t


        draw_str(vis, (20, 20), 'time: %.1f ms' % (dt*1000))

        cv2.imshow('facedetect', vis)

 

        if cv2.waitKey(5) == 27:

            break

    cv2.destroyAllWindows()


 

  오늘은 간단하게 예제 코드 분석만 해보았는데요. 다음 번에는 이 코드를 이용해서 직접 프로그램을 작성해보도록 하겠습니다.

 

 

 

라즈베리파이 저렴한 사이트 바로가기

1. 메카솔루션 (가장 저렴한 B+)

2. 키트 정리와 메뉴얼이 제공되는 사이트 

3. 초소형 라즈베리파이 구매 사이트 

메카리워즈 Image Map

토란사랑 2018-01-12 (금) 10:59 6년전
* 비밀글 입니다.
주소
누렁이음머어어 2018-03-28 (수) 19:39 6년전
안녕하세요  질문이 간절히 있습니다... ㅠㅠ
눈을 인식하는데, 눈사이 중점과  카메라사이  연장선의 지평면에 대한 각도를 측정하는것이 가능할까요?
주소

모바일 버전으로 보기