前提
動画の全てのフレームのハッシュ値を取得し,hash_dict ={}にhash_dict[i] = ハッシュ値(iはフレーム番号)を入れるプログラムを書きました.
実現したいこと
この処理を並列化したいです.
発生している問題・エラーメッセージ
エラーは出てきませんが,全フレームの処理が終わってないのにプログラムが完了してしまいます.
例:8415フレームのうち3000フレームしか処理されない,5430フレームのうち1079フレームしか処理されない.
該当のソースコード
python
1import cv2 2import numpy as np 3import imagehash 4from PIL import Image 5from concurrent.futures import ProcessPoolExecutor 6 7def cv2pil(image): 8 ''' OpenCV型 -> PIL型 ''' 9 new_image = image.copy() 10 if new_image.ndim == 2: # モノクロ 11 pass 12 elif new_image.shape[2] == 3: # カラー 13 new_image = cv2.cvtColor(new_image, cv2.COLOR_BGR2RGB) 14 elif new_image.shape[2] == 4: # 透過 15 new_image = cv2.cvtColor(new_image, cv2.COLOR_BGRA2RGBA) 16 new_image = Image.fromarray(new_image) 17 return new_image 18 19def hash_image(image): 20 return imagehash.phash(cv2pil(image)) 21 # compute the hash of the image 22 23def main(): 24 # open the video 25 VIDEO_PATH = *** 26 video = cv2.VideoCapture(VIDEO_PATH) 27 28 # get the number of frames 29 num_frames = int(video.get(cv2.CAP_PROP_FRAME_COUNT)) 30 hash_dict = {} 31 32 # create a pool of processes 33 with ProcessPoolExecutor() as executor: 34 # process the frames in parallel 35 for i, frame_hash in enumerate(executor.map(hash_image, video.read()[1])): 36 print('Frame {} of {} has hash {}'.format(i, num_frames, frame_hash)) 37 hash_dict[i] = frame_hash 38 39 40 41if __name__ == '__main__': 42 main()
追加質問(答えていただけたら幸いです)
このコードを
def main():
if name == 'main':
main()
なしで実行するとなぜか実行できません.なぜですか