파이썬(Python)/opencv

[Python]OpenCV 카메라 모션 감지(Motion Sensor)(countNonZero, bitwise_and, threshold, absdiff)

끄적끄적아무거나 2022. 6. 13. 18:10
반응형

 

목차

     

    파이썬 OpenCV 움직임 감지 카메라 구현 방법

     

    이번 시간에는 파이썬 OpenCV를 사용해서 컴퓨터의 내장 카메라를 구현하고 카메라에서 촬영하고 있는 화면의 움직임(Motion)을 감지하고 출력하는 코드를 작성할 예정입니다.

     

     

    해당 프로젝트를 진행하기 위해서는 아래와 같은 절차가 필요 합니다.

     

    1. PC 카메라 동작

    2. 카메라에서 읽은 이미지(Image) Delay 줘서 Capture 하기

    3. 이미지 파일을 회색으로 반전하기

    4. 회색으로 반전된 이미지 간에 값 차이 구하기 : 움직임이 있을 경우 값 차이 발생

    5. 무의미한 움직임 제거를 위해 문턱값(Therhold)으로 필터링(Filtering)

    6. 카운팅 함수를 사용해서 움직임이 발생한 픽셀 값을 카운트함

    7. 모션을 출력

     

    모션 센싱은 위의 절차에 의해 구현 될 것 입니다.

     

     

     

    그리고 코드 구현을 위해 OpenCV의 아래 함수들이 사용 됩니다. 사용 방법을 간단하게 같이 표기하겠습니다.

     

     

    아래 실제 코드를 통해 쉽게 이해해보도록 하겠습니다. 

     

     

     

     

    파이썬 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번 라인: 변화가 생긴 부분 화면에 출력

     

     

     

    결과>>

    카메라에 손을 흔들고 카운팅 값이 왼쪽에서 출력됨을 알 수 있습니다.

     

     

     

     

    반응형