반응형
목차
파이썬 OpenCV 움직임 감지 카메라 구현 방법
이번 시간에는 파이썬 OpenCV를 사용해서 컴퓨터의 내장 카메라를 구현하고 카메라에서 촬영하고 있는 화면의 움직임(Motion)을 감지하고 출력하는 코드를 작성할 예정입니다.
해당 프로젝트를 진행하기 위해서는 아래와 같은 절차가 필요 합니다.
1. PC 카메라 동작
2. 카메라에서 읽은 이미지(Image) Delay 줘서 Capture 하기
3. 이미지 파일을 회색으로 반전하기
4. 회색으로 반전된 이미지 간에 값 차이 구하기 : 움직임이 있을 경우 값 차이 발생
5. 무의미한 움직임 제거를 위해 문턱값(Therhold)으로 필터링(Filtering)
6. 카운팅 함수를 사용해서 움직임이 발생한 픽셀 값을 카운트함
7. 모션을 출력
모션 센싱은 위의 절차에 의해 구현 될 것 입니다.
그리고 코드 구현을 위해 OpenCV의 아래 함수들이 사용 됩니다. 사용 방법을 간단하게 같이 표기하겠습니다.
- read() : 이미지 불러오기
- cvtColor() : 이미지 변환하기(https://scribblinganything.tistory.com/494)
- absdiff() : 픽셀 값의 차이를 절대값으로 전달하기
- threshold() : 문턱값 사이 값만 출력(https://scribblinganything.tistory.com/510)
- bitwise_and() : 비트값(bits)을 AND로 처리하기
- countNonZero() : 0이 아닌 값만 개수를 세기
- imshow() : 출력 하기
아래 실제 코드를 통해 쉽게 이해해보도록 하겠습니다.
파이썬 OpenCV 움직임 감지 카메라 예제 실행
예제 코드>>
import cv2
cap = cv2.VideoCapture(0)
cap.set(cv2.CAP_PROP_FRAME_WIDTH,320)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT,240)
if not cap.isOpened():
print("cap open failed")
exit()
while True:
ret, img01 = cap.read()
ret, img02 = cap.read()
ret, img03 = cap.read()
if not ret:
print("Can't read cap")
break
gray_img01 = cv2.cvtColor(img01, cv2.COLOR_BGR2GRAY)
gray_img02 = cv2.cvtColor(img02, cv2.COLOR_BGR2GRAY)
gray_img03 = cv2.cvtColor(img03, cv2.COLOR_BGR2GRAY)
difference_01 = cv2.absdiff(gray_img01, gray_img02)
difference_02 = cv2.absdiff(gray_img02, gray_img03)
ret, difference_01 = cv2.threshold(difference_01, 20, 255, cv2.THRESH_BINARY)
ret, difference_02 = cv2.threshold(difference_02, 20, 255, cv2.THRESH_BINARY)
diff = cv2.bitwise_and(difference_01, difference_02)
diff_cnt = cv2.countNonZero(diff)
cv2.imshow("Motion Sensing", diff)
print(diff_cnt)
if cv2.waitKey(1) == ord('q'):
break
cv2.destroyAllWindows()
3~10번 라인: Camera 구현
11~13번 라인: 이미지(Image) 캡쳐
18~20번 라인: Gray로 이미지 반전
22~23번 라인: 이미지간에 값 차이 출력
25~26번 라인: Threshold로 20이하의 값은 삭제
28번 라인: AND로 남는 비트만 출력
29번 라인: 차이가 발생한 비트 값 갯수 출력
31번 라인: 변화가 생긴 부분 화면에 출력
결과>>
카메라에 손을 흔들고 카운팅 값이 왼쪽에서 출력됨을 알 수 있습니다.
반응형
'파이썬(Python) > opencv' 카테고리의 다른 글
[Python]OpenCV 카메라로 얼굴, 눈 인식하고 모자이크 하기#2(CascadeClassifier) (0) | 2022.06.22 |
---|---|
[Python]OpenCV 카메라로 얼굴, 눈 인식하고 모자이크 하기#1(CascadeClassifier) (0) | 2022.06.21 |
[Python] OpenCV PC 카메라 특정 색상만 출력하기 (Camera, BGR, HSV, inRange, bitwise_and) (0) | 2022.06.04 |
[Python]OpenCV 임계값 비교하기 threshold (0) | 2022.04.22 |
[Python]OpenCV 픽셀 처리 함수: add, subtract, multiply, divide (0) | 2022.04.21 |