728x90
카메라를 활용해서 얼굴 인식하는 프로그램을 만들어보겠습니다. 보통 노트북에는 내장 카메라가 있기 때문에 카메라 번호는 0번으로 설정합니다. (외장 카메라는 1번부터 N번까지 순차적으로 할당합니다.) 혹시 에러가 뜬다면 카메라 또는 녹화 방지 설정이 켜져 있는지 확인합니다. 켜져 있다면 끄고 실행해주세요.
카메라 설정
import cv2 as cv
capture = cv.VideoCapture(0) # 카메라설정
capture.set(cv.CAP_PROP_FRAME_WIDTH, 500) # 창크기
capture.set(cv.CAP_PROP_FRAME_HEIGHT, 500) # 창크기
while True:
ret, frame = capture.read() # 영상을 읽음
cv.imshow("VideoFrame", frame) # 읽은영상 보여줌
key = cv.waitKey(10) # 키입력기다림
if key == ord('s'): # 해당키 눌렀을때 꺼짐
break
capture.release() # 웹캠종료
cv.destroyAllWindows() # 창닫음
- capture = cv.VideoCapture(0) : 객체를 만듭니다. (0) 안에 카메라 번호를 넣습니다. 내장 카메라는 0, 외장 카메라는 1부터 시작합니다.
- capture.set(cv.CAP_PROP_FRAME_WIDTH, 300) : 카메라의 너비를 설정합니다.
- capture.set(cv.CAP_PROP_FRAME_HEIGHT, 300) : 카메라의 높이를 설정합니다.
- ret, frame = capture.read() : 비디오 객체를 읽습니다.
- cv.imshow("VideoFrame", frame) : 읽은 영상을 보여줍니다.
- key = cv.waitKey(10) : 키를 누를 때까지 0.01초를 기다립니다.(1000=1초)
- if key == ord('s'): : 누른 키가 s라면 멈춥니다. (esc키를 눌렀을 때 멈추려면 if key == 27:입니다.)
- break : break는 반복문(while)이 빠져나옵니다.
- capture.release() : 웹캠을 종료합니다.
- cv.destroyAllWindows() : 창을 닫습니다.
영상을 좌우 반전하고, 회색으로 보여줍니다.
while True:
ret, frame = capture.read()
frame = cv.flip(frame, 1)
gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
cv.imshow("VideoFrame", gray)
key = cv.waitKey(10)
if key == ord("s"):
break
- frame = cv.flip(frame,0) :영상을 상하반전으로 보여줍니다.
- frame = cv.flip(frame,1) : 영상을 좌우반전으로 보여줍니다.(거울 모드)
- gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) : 색상을 회색으로 보여줍니다.
얼굴인식
import cv2 as cv
capture = cv.VideoCapture(0) # 객체생성
capture.set(cv.CAP_PROP_FRAME_WIDTH, 500)
capture.set(cv.CAP_PROP_FRAME_HEIGHT, 500)
face_cascade = cv.CascadeClassifier() # 객체생성
face_cascade.load(r'C:\opencv\haarcascade_frontalface_default.xml') # 경로설정
# font = cv.FONT_HERSHEY_DUPLEX # 폰트설정
while True:
ret, frame = capture.read()
frame = cv.flip(frame, 1)
grayframe = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # 회색으로 바꿈
grayframe = cv.equalizeHist(grayframe) # 히스토그램평활화
faces = face_cascade.detectMultiScale(grayframe, 1.1, 3, 0, (30, 30))
print(faces)
for (x,y,w,h) in faces:
cv.rectangle(frame,(x,y),(x+w,y+h),(0,0,255),3)
# cv.putText(frame, "face", (x, y-10), font, 0.5, (255,0,0)) # 글자표시
cv.imshow("Face", frame)
key = cv.waitKey(10)
if key == 27:
break
capture.release()
cv.destroyAllWindows()
- face_cascade = cv.CascadeClassifier() : OpenCV에서 제공하는 객체 검출을 위한 분류기 클래스로 객체 생성
- face_cascade.load(r'C:\opencv\haarcascade_frontalface_default.xml') : 객체 검출을 위한 데이터 경로 설정
- grayframe = cv.equalizeHist(grayframe) : 히스토그램 평활화 (밝기 값이 몰려있는 영상을 좀 더 선명한 영상으로 만듭니다.)
- faces = face_cascade.detectMultiScale(grayframe, 1.1, 3, 0, (30, 30)) : 회색으로 얼굴인식이 조금 더 잘 되도록 합니다.
- print(faces) : faces객체를 프린트합니다.
- for (x, y, w, h) in faces: : 화면에서 읽었기 때문에 좌표와 너비와 높이가 나옵니다.
- cv.rectangle(frame, (x, y), (x+w, y+h), (0,0,255),3) : 사각형으로 표시합니다.
- cv.imshow("Face", frame) : 영상을 보여줍니다.
# 부분을 지우면 얼굴인식 부분에 face라는 글자가 뜹니다.
- cv.putText(이미지, 글씨, (x, y좌표), 폰트, 글씨 크기, 색깔, [두께, 라인타입]) : 글씨를 나타낼 수 있습니다. 폰트, 글자크기는 숫자로 정하고, 색상은 BGR(Blue, Green, Red)로 정합니다. 마지막으로 [두께, 라인타입]은 설정 안 해도 상관없습니다.
- 폰트 종류는 많지만 font = cv.FONT_HERSHEY_DUPLEX을 사용했습니다.
haarcascades데이터를 이용해서 얼굴 인식했습니다. https://github.com/opencv/opencv/tree/master/data/haarcascades에서 데이터 다운 가능합니다.
728x90
'파이썬' 카테고리의 다른 글
파이썬으로 드론 조종하기 (얼굴인식) (0) | 2022.08.04 |
---|---|
파이썬으로 드론 조종하기 (키보드) (0) | 2022.08.03 |
파이썬 Open CV 관련 패키지 사용법 (기초) (0) | 2022.08.01 |
파이썬으로 드론 조종하기 (패턴비행) (0) | 2022.07.30 |
파이썬으로 드론 조종하기 (미세조정과 이동) (0) | 2022.07.29 |
댓글