카메라를 기동시켜 사람의 얼굴에 모자이크 걸자(OpenCV)

12978 단어 파이썬OpenCV

1. 소개



여러분 안녕하세요! 이번에는 파이썬과 OpenCV를 다루고 카메라를 시작하고 실시간으로 사람의 얼굴에 모자이크를 쓸 수있는 프로그램을 만들었습니다.
어쩌면 이미 다른 사람들이 기사를 쓰고 있을지도 모르지만 ... 어쩌면 나왔습니다.
어쨌든 해보자!

2. 절차



프로그램의 흐름은 이쪽이 됩니다.
1. 카메라를 시작합니다.
2. 사람의 얼굴을 인식한다. (Haar-like 특징 분류기)
3. 사람의 얼굴이 있는 곳을 모자이크 처리를 한다.
이상입니다.

3. 카메라를 시작합니다.



OpenCV를 사용하여 카메라를 시작합니다.

kido.py
import cv2
cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    cv2.imshow('video image', img)#'video image'はカメラのウィンドウの名前
    key = cv2.waitKey(10)
    if key == 27:  # ESCキーで終了
        break
cap.release()
cv2.destroyAllWindows()



이것으로 카메라의 궤도는 할 수 있습니다 Esc 키를 누르면 윈도우가 닫아 줍니다.

4. 사람의 얼굴을 인식시킨다(Haar-like 특징 분류기)



OpenCV에서는 Haar-like 특징 분류기가 미리 준비되어 있습니다. 편리합니다!
그러나 파일을 저장하지 않으면 처리할 수 없습니다. 이번에는 사람의 얼굴을 인식하고 싶기 때문에 여기의 haarcascade_frontalface_alt.xml을 다룹니다.

덧붙여서, Haar-like 특징 분류기란 화상의 특징을 취할 수 있는 특징량으로부터 명암차에 주목한 Haar-like 특징과 아다 부스트에 의해 Haar-like 필터의 사이즈를 바꾸면서 특징량을 추출해 얼굴을 검출하고 있다 합니다.
이제 카메라를 시작하여 사람의 얼굴을 인식해 봅시다.

ninsiki.py
import cv2

#Haar-like特徴分類器を扱えるようにする。
face_cascade_path="haarcascade_frontalface_alt.xml" #pathを指定してください。
face_cascade = cv2.CascadeClassifier(face_cascade_path)

cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
    #人の顔を矩形的に囲む
    for x, y, w, h in faces:
        cv2.rectangle(img, (x, y), (x + w, y + h), (255, 0, 0), 2)
        face = img[y: y + h, x: x + w]
        face_gray = gray[y: y + h, x: x + w]
    cv2.imshow('video image', img)
    key = cv2.waitKey(10)
    if key == 27:  # ESCキーで終了
        break

cap.release()
cv2.destroyAllWindows()


이제 사람의 얼굴을 감지할 수 있었습니다.

5. 모자이크를 걸다



모자이크 처리는 어려운 것은 생각하지 않고 얼굴 화상을 일단 축소하고 나서 확대해 얼굴 화상에 붙입니다.

mozaic.py
import cv2

#Haar-like特徴分類器を扱えるようにする。
face_cascade_path="haarcascade_frontalface_alt.xml"
face_cascade = cv2.CascadeClassifier(face_cascade_path)
ratio = 0.07 #ここの値を変えるとモザイクの粗さが変わる。

cap = cv2.VideoCapture(0)
while True:
    ret, img = cap.read()
    gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
    faces = face_cascade.detectMultiScale(gray, scaleFactor=1.3, minNeighbors=5)
    for x, y, w, h in faces:
        #モザイクの処理を個々の二行でしている。
        small = cv2.resize(img[y: y+h, x: x+w], None,fy=ratio, fx=ratio,interpolation=cv2.INTER_NEAREST)
        img[y: y + h, x: x + w] = cv2.resize(small, (w, h), interpolation=cv2.INTER_NEAREST)
    cv2.imshow('video image', img)
    key = cv2.waitKey(10)
    if key == 27:  # ESCキーで終了
        break

cap.release()
cv2.destroyAllWindows()


완성되었습니다.

6. 정리



이번에는 실시간으로 얼굴 인식하고 얼굴에 모자이크 가공을 실시했습니다. 명암 차이로 분류하고 있기 때문에, 풍자 얼굴 그림에서도 반응합니다. (오검지도 상당히 있다)입니다만, 짧은 코드로 얼굴 검출(얼굴 인식)을 시도할 수 있으므로 OpenCV 즐겁습니다.
지금까지 블로그 등의 정보 발신을 한 적이 없기 때문에 이해하기 어려운 문장이 되어 있을지도 모릅니다.
앞으로 정보 발신을 해 가고 문장력을 붙여 가고 싶습니다. 또한 기술로 놀 수있는 인간이되는 것이 내 꿈이므로 따뜻한 눈으로 지켜봐주세요.
앞으로 잘 부탁드립니다.
그럼!

좋은 웹페이지 즐겨찾기