๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ
์นดํ…Œ๊ณ ๋ฆฌ ์—†์Œ

[Python][OpenCV] ์›น์บ ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ๊ธฐ ๋ณ€ํ™” ์‹œ 3์ดˆ๊ฐ„ ๋ฐ˜์ „ํ•ด์„œ ๋™์˜์ƒ ์ €์žฅํ•˜๊ธฐ - ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋กœ ์ €์žฅ

by miiinn 2022. 10. 13.

๐Ÿ”Ž ๋ฌธ์ œ

์›น์บ ์„ ์‚ฌ์šฉํ•˜์—ฌ ํšŒ์ƒ‰์กฐ(grayscale)๋กœ ๋™์˜์ƒ์„ ์ €์žฅํ•˜๋˜, ์นด๋ฉ”๋ผ๋กœ๋ถ€ํ„ฐ ๋“ค์–ด์˜ค๋Š” ํ˜„์žฌ ํ”„๋ ˆ์ž„์ด ์ง์ „ ํ”„๋ ˆ์ž„๋ณด๋‹ค ์ด๋ฏธ์ง€ ์ „์ฒด์˜ ํ‰๊ท  ๋ฐ๊ธฐ๊ฐ€ 30 ๋„˜๊ฒŒ ๋ฐ”๋€” ๊ฒฝ์šฐ, ๊ทธ ์‹œ์ ๋ถ€ํ„ฐ ๋‹ค์Œ 3์ดˆ๊ฐ„ ๋ฐ˜์ „์‹œ์ผœ์„œ output.avi๋กœ ์ €์žฅํ•ด์ฃผ์„ธ์š”.

* ๋ฐ˜์ „๋œ ๋ถ€๋ถ„์ด ํ™•์ธ๋  ์ˆ˜ ์žˆ๋„๋ก ์˜์ƒ์„ ์ดฌ์˜ํ•ด์ฃผ์„ธ์š”.
* ์›น์บ  ์‚ฌ์šฉ์ด ์–ด๋ ค์šธ ๊ฒฝ์šฐ ์Šค๋งˆํŠธํฐ์œผ๋กœ ์ดฌ์˜ํ•œ ์˜์ƒ์„ ์‚ฌ์šฉํ•˜์…”๋„ ์ข‹์Šต๋‹ˆ๋‹ค.
* ์ „์ฒด ์˜์ƒ์˜ ๊ธธ์ด๋Š” ์ตœ์†Œ 5์ดˆ๋ฅผ ๋„˜๊ธฐ๊ณ , ์ตœ๋Œ€ 15์ดˆ๋Š” ๋„˜์ง€ ์•Š๋„๋ก ์กฐ์ ˆํ•ด์ฃผ์„ธ์š”.

 

import cv2 as cv

def invert():
    cap = cv.VideoCapture(0) # ์›น์บ ์—์„œ ๋ฐ›์•„์˜ค๊ธฐ
    if not cap.isOpened():
        print("Camera open failed!")
        return

    # output.avi ๋™์˜์ƒ ํŒŒ์ผ ์ €์žฅ
    w = round(cap.get(cv.CAP_PROP_FRAME_WIDTH))
    h = round(cap.get(cv.CAP_PROP_FRAME_HEIGHT))
    fps = cap.get(cv.CAP_PROP_FPS) # ์ €์žฅ์— ํ•„์š”ํ•œ ์ •๋ณด๋“ค
    # fps๋Š” 1์ดˆ ๋‹น ํ”„๋ ˆ์ž„ ๊ฐœ์ˆ˜

    fourcc = cv.VideoWriter_fourcc(*'DIVX')
    delay = round(1000 / fps)

    outputVideo = cv.VideoWriter('output.avi', fourcc, fps, (w, h), isColor=False) # VideoWriter ๊ฐ์ฒด์ดˆ๊ธฐํ™”
    if not outputVideo.isOpened():
        print('File open failed!')
        return

    previous = None
    pre_frame = None
    frame_cnt = -1

    # ํ”„๋ ˆ์ž„์ •๋ณด ๊ฐ€์ ธ์™€์„œ ์ €์žฅ
    while True:
        ret, frame = cap.read() # ๊ฐ ํ”„๋ ˆ์ž„ ์ฝ๊ธฐ
        if not ret:
            break

        if pre_frame is not None:
            previous = pre_frame.mean() # ์ง์ „ ํ”„๋ ˆ์ž„์˜ ํ‰๊ท  ๋ฐ๊ธฐ
        current = frame.mean() # ํ˜„์žฌ ํ”„๋ ˆ์ž„์˜ ํ‰๊ท  ๋ฐ๊ธฐ

        gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) # ๊ทธ๋ ˆ์ด์Šค์ผ€์ผ๋กœ ๋ณ€ํ™˜
        inversed = ~gray

        # ํ˜„์žฌ ํ”„๋ ˆ์ž„์ด ์ง์ „ ํ”„๋ ˆ์ž„๋ณด๋‹ค ํ‰๊ท  ๋ฐ๊ธฐ๊ฐ€ 30์ด์ƒ ๋ฐ”๋€”๊ฒฝ์šฐ 3์ดˆ๊ฐ„ ๋ฐ˜์ „
        if previous is not None and ((previous+30 <= current)or(previous-30 >= current)):
            frame_cnt = 0 # ๋ฐ๊ธฐ 30 ๋ณ€ํ™”์‹œ frame_cnt๋ฅผ 0์œผ๋กœ

        # 3์ดˆ๊ฐ„ ๋ฐ˜์ „ -> 3 * fps ๊ฐœ์˜ ํ”„๋ ˆ์ž„์„ ๋ฐ˜์ „ํ•˜๊ธฐ (fps๊ฐ€ 1์ดˆ๋‹น ํ”„๋ ˆ์ž„ ์ˆ˜ ์ด๋ฏ€๋กœ)
        if frame_cnt == 3 * fps: # 3์ดˆ๊ฐ„ ๋ฐ˜์ „ ์™„๋ฃŒ ์‹œ frame_cnt๋ฅผ ๋‹ค์‹œ -1๋กœ ํ•ด๋†“๊ธฐ
            frame_cnt = -1

        if frame_cnt != -1: # ๋ฐ๊ธฐ๊ฐ€ 30์ด์ƒ ์ฐจ์ด๋‚˜๋Š” ๊ฒฝ์šฐ
            outputVideo.write(inversed) # ๋ฐ˜์ „๋œ ์˜์ƒ ์ €์žฅ
            cv.imshow('frame', inversed)
            frame_cnt += 1
        else:
            outputVideo.write(gray) # ์›๋ณธ ์ €์žฅ
            cv.imshow('frame', gray)

        # cv.imshow('gray frame', gray)  # ์›๋ณธ ํ™”๋ฉด์— ์ถœ๋ ฅ
        # cv.imshow('inversed', inversed)  # ๋ฐ˜์ „ ํ™”๋ฉด์— ์ถœ๋ ฅ

        if cv.waitKey(delay) == 27:
            break

        pre_frame = frame # ์ง์ „ ํ”„๋ ˆ์ž„ ์ •๋ณด ์ €์žฅ

    cv.destroyAllWindows()

invert()

 

output.avi