前提・実現したいこと
PythonやOpenCVなどを用い、動画をフレーム間差分法で加工、その動画を画像に分割し、その画像をトリミングして保存しようとしています。トリミングの処理までは完了していますが、そこから次の処理である画像の保存の際に以下のエラーメッセージが発生しました。
該当のソースコード
Python
1import cv2 2import numpy as np 3from PIL import Image 4import os 5import shutil 6 7def video_2_frames(video_file, image_dir, image_file): 8 # Delete the entire directory tree if it exists. 9 if os.path.exists(image_dir): 10 shutil.rmtree(image_dir) 11 12 # Make the directory if it doesn't exist. 13 if not os.path.exists(image_dir): 14 os.makedirs(image_dir) 15 16 # Video to frames 17 global i 18 global j 19 global count 20 i=0 21 j=0 22 count=0 23 cap = cv2.VideoCapture(video_file) 24 fgbg = cv2.bgsegm.createBackgroundSubtractorMOG() 25 while(cap.isOpened()): 26 flag, frame = cap.read() # Capture frame-by-frame 27 if flag == False: # Is a frame left? 28 break 29 if i==30: 30 fgmask = fgbg.apply(frame) 31 cv2.imwrite(image_dir+image_file % str(j), fgmask) # Save a frame 32 print('Save', image_dir+image_file % str(j)) 33 i = 0 34 j += 1 35 i+=1 36 37 cap.release() # When everything done, release the capture 38 39video_2_frames('./movie.mp4','./image_dir/','img_%s.jpg') 40 41def nparray_to_rgb(nparry:np.array): 42 return (int(nparry[0]),int(bg_color[1]),int(bg_color[2])) 43 44def find_edge(img_path:str): 45 img = cv2.imread(img_path,0) 46 blur = cv2.blur(img,(5,5)) 47 print('blur') 48 print(blur) 49 edges = cv2.Canny(blur,100,200) 50 print('edges') 51 print(edges) 52 return edges 53 54def find_target(edges): 55 results = np.where(edges==255) 56 print('results') 57 print(results) 58 top = np.min(results[0]) 59 bottom = np.max(results[0]) - 1 60 left = np.min(results[1]) 61 right = np.max(results[1]) - 1 62 return (left,top,right,bottom) 63 64 65def to_RGB(image:Image): 66 if image.mode != 'RGBA': return image 67 background = Image.new("RGB", image.size, (255, 255, 255)) 68 print('image.mode='+image.mode) 69 background.paste(image, mask=image.split()[3]) # 3 is the alpha channel 70 background.format = image.format 71 return background 72 73def get_crop_img(img_path:str): 74 edges = find_edge(img_path) 75 left,top,right,bottom = find_target(edges) 76 rgb_img = to_RGB(Image.open(img_path)) 77 trim_img = rgb_img.crop((left, top, right, bottom)) 78 cv2.imwrite('./image_dir/img_'+str(count)+'_trim.jpg',trim_img) 79 print('crop_img') 80 81for count_img in range(1,j): 82 print('crop_'+str(count_img)) 83 get_crop_img('./image_dir/img_'+str(count_img)+'.jpg') 84 count_img+=1 85 count+=1
発生している問題・エラーメッセージ
line 78, in get_crop_img cv2.imwrite('./image_dir/img_'+str(count)+'_trim.jpg',trim_img) TypeError: Expected Ptr<cv::UMat> for argument '%s'
このエラーはなぜ発生したのでしょうか?
また、どのように対処したらよいのだしょうか?
教えて頂けると幸いです。
補足情報(FW/ツールのバージョンなど)
開発環境(IDE):Spyder(Python3.7)
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2019/11/26 02:28