๐ ๋ฌธ์
์น์บ ์ ์ฌ์ฉํ์ฌ ํ์์กฐ(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()