-
이미지 처리-10 json으로 영상 데이터 이미지 추출이미지 처리 2023. 7. 4. 17:26
1. 동영상 프레임 단위로 쪼개기
import cv2 import os video_data_path = 'video_sample_data\\video\\C041_A30_SY32_P07_S06_02DAS.mp4' cap = cv2.VideoCapture(video_data_path) img_count = 0 folder_name = video_data_path.split("\\")[-1] folder_name = folder_name.replace(".mp4", "") os.makedirs(f"./AI_hub_frame_dataset/{folder_name}", exist_ok=True) while True: ret, frame = cap.read() if not ret: break if img_count % 15 == 0: img_filename = f"./AI_hub_frame_dataset/{folder_name}/frame_{img_count:04}.png" cv2.imwrite(img_filename, frame) img_count += 1 cap.release()
동영상을 프레임 단위로 쪼개기 위해서 동영상을 읽어온다. split과 replace를 이용해서 폴더 이름을 지정한다. 동영상을 읽어오고 15 프레임씩 잘라서 count +=1을 하여 리스트에 순서대로 저장한다.
폴더를 확인해 보면 0번부터 3600번까지 순서대로 잘려있는 것을 확인할 수 있다. 240개의 사진이 있으며 이 중에서 택배 상자를 들고 가는 사진을 추출하는 것이 목적이다.
2. json 이용하여 사진 추출
import cv2 import os import json json_path = "raw_data\\json\\Stealing_Courier\\C041_A30_SY32_P07_S06_02DAS.json" folder_name = json_path.split("\\")[2] file_name = json_path.split("\\")[-1] file_name = file_name.replace(".json", "") os.makedirs(f"./AI_hub_final_data/{folder_name}/{file_name}", exist_ok=True) with open(json_path, 'r', encoding='utf-8') as f: json_data = json.load(f) metadata_info = json_data["metadata"] categories_info = json_data["categories"] crime_info = categories_info["crime"] # crime_info = json_data["categories"]["crime"] action_info = categories_info["action"] symptom_info = categories_info["symptom"] cap = cv2.VideoCapture("raw_data\\video\\Stealing_Courier\\C041_A30_SY32_P07_S06_02DAS.mp4") frame_count = int(cap.get(cv2.CAP_PROP_FRAME_COUNT)) fps = int(cap.get(cv2.CAP_PROP_FPS)) file_info = json_data['file'] for item in file_info: videos_info = item["videos"] block_information = videos_info["block_information"] count = 0 for block in block_information: if block["block_detail"] == "A30": start_time = block["start_time"] end_time = block["end_time"] start_frame_index = block["start_frame_index"] end_frame_index = block["end_frame_index"] for frame_idx in range(int(start_frame_index), int(end_frame_index), 30): cap.set(cv2.CAP_PROP_POS_FRAMES, frame_idx) ret, frame = cap.read() if ret: img_name = f"./AI_hub_final_data/{folder_name}/{file_name}/frame_{count:04}.png" cv2.imwrite(img_name, frame) count += 1 cap.release()
위의 동영상에 대해서 정보를 기록한 json 파일을 이용하여 중요한 사진만 뽑아낼 수 있다. json 경로에서 json 파일을 불러오고 파일을 저장할 폴더를 생성한다.
json 파일을 읽어서 metadata, categories, crime, action, symptom의 항목을 저장한다. 동영상을 읽어오고 file 항목을 for문으로 돌려서 정보가 담겨있는 videos와 block_information을 꺼낸다.
마지막으로 block_information에서 택배 훔쳐가기 항목인 a30인 부분만 프레임으로 뽑아낸다. 이후에 저장된 사진을 확인하면 사람이 있는 장면만 프레임으로 추출된 것을 확인할 수 있다.
'이미지 처리' 카테고리의 다른 글
이미지 처리-9 이미지 증강 (0) 2023.06.26 이미지 처리-8 이미지 라벨링 (0) 2023.06.19 이미지 처리-7 객체 추적 (0) 2023.06.19 이미지 처리-6 기본 동영상 처리 (0) 2023.06.19