-
openCV를 이용한 motion detection 후 이미지 캡쳐 코드Machine Learning 2021. 2. 15. 17:57728x90
def image(ipath,file, spath,name): global cnt,fp path = os.path.join(ipath, file) #file_name = file.split(".", 1)[0] #print(file_name) cap = cv.VideoCapture(path) firstframe = None fps = int(cap.get(5)) # cap.set(cv.CAP_PROP_FRAME_WIDTH, 680) # cap.set(cv.CAP_PROP_FRAME_HEIGHT, 480) print("fps : %s"%fps) if (fp==0): fp=input("crop fps : ") int(fp) # 배경빼기 fgbg = cv.createBackgroundSubtractorMOG2(varThreshold=300, detectShadows=False) kernel = cv.getStructuringElement(cv.MORPH_ELLIPSE, (3, 3)) while (cap.isOpened()): (ret, frame) = cap.read() if not ret: break (ret, frame2) = cap.read() if not ret: break output = frame2.copy() frame = cv.cvtColor(frame, cv.COLOR_BGR2GRAY) frame2 = cv.cvtColor(frame2, cv.COLOR_BGR2GRAY) gray = fgbg.apply(frame) gray2 = fgbg.apply(frame) if firstframe is None: firstframe = gray continue # 프레임 차이 frameDelta = cv.absdiff(firstframe, gray) frameDelta2 = cv.absdiff(gray, gray2) # 임계값 25보다 크면 255 아니면 0 thresh = cv.threshold(frameDelta, 25, 255, cv.THRESH_BINARY)[1] thresh2 = cv.threshold(frameDelta2, 25, 255, cv.THRESH_BINARY)[1] # 모폴로지기법, 필터내부의 가장 밝은(높은)값으로 변환-팽창연산 thresh = cv.dilate(thresh, None, iterations=10) thresh2 = cv.dilate(thresh2, None, iterations=10) diff = cv.bitwise_and(thresh, thresh2) # 흰색 형태개선 diff = cv.morphologyEx(diff, cv.MORPH_OPEN, kernel) # 특성검출 contours = cv.findContours(diff.copy(), cv.RETR_EXTERNAL, cv.CHAIN_APPROX_SIMPLE) contours = imutils.grab_contours(contours) cnt = cnt + 1 if (cnt % fp == 0): for c in contours: if cv.contourArea(c) < 5: continue # (x, y, w, h) = cv.boundingRect(c) # if x < 500 or x > 1000: # continue cv.imwrite("%s/%s_%05d.jpg" % (spath,name, cnt/fp), output) cv.imshow("output", output) k = cv.waitKey(1) & 0xFF if k == ord('q'): break print("finish") cap.release() cv.destroyAllWindows() if __name__ == '__main__': import os import imutils import sys, subprocess import argparse import shutil subprocess.call([sys.executable, '-m', 'pip', 'install', '--upgrade', 'opencv-contrib-python']) import cv2 as cv global cnt,fp cnt = 1 fp=0 parser = argparse.ArgumentParser(description='video crop') parser.add_argument('-i', '--input_dir', default='input', type=str, help='path to input directory') parser.add_argument('-s', '--save_dir', default='save', type=str, help='path to save directory') parser.add_argument('-n', '--file_name', default='name', type=str, help='naming to save file') args = parser.parse_args() INPUT_DIR = args.input_dir FILE_NAME=args.file_name if args.save_dir=='save': SAVE_DIR=INPUT_DIR+'/image' else : SAVE_DIR=args.save_dir files=os.listdir(INPUT_DIR) if (os.path.isdir(SAVE_DIR) == True): shutil.rmtree(SAVE_DIR) os.mkdir("%s" % (SAVE_DIR)) for file in files: print(file) image(INPUT_DIR,file,SAVE_DIR,FILE_NAME)
위 코드를 video_cap.py 라고 저장했을 경우,
python video_cap.py -i <영상 디렉토리> -s <저장할 디렉토리> -n <캡쳐될 사진 이름>
이렇게 실행하면 된다.
728x90'Machine Learning' 카테고리의 다른 글
You Only Look Once: Unified, Real-Time Object Detection (0) 2022.07.01 [Python] 이미지 사이즈 변경 (0) 2021.04.11 window에서 darknet 디버깅/빌드 하는 방법 (0) 2021.04.11 Kaggle 캐글 : 타이타닉으로 입문하기(2) - 여러가지 모델 & 제출 (0) 2020.02.17 Kaggle 캐글 : 타이타닉으로 입문하기(1) - 데이터 탐색 & 전처리 (0) 2020.02.11