質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.02%
NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

Q&A

解決済

TypeError:Expected Ptr<cv::UMat> for argument '%s'の対処法

hamasaki
hamasaki

総合スコア6

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。

1回答

0グッド

0クリップ

18905閲覧

投稿2019/11/26 00:51

前提・実現したいこと

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)

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

回答1

1

ベストアンサー

trim_img はPILデータで、単に保存するのであれば、PIL.saveを利用すれば良いのではないでしょうか。

cv2.imwrite('./image_dir/img_'+str(count)+'trim.jpg',trim_img)
ではなく
trim_img.save('./image_dir/img
'+str(count)+'_trim.jpg')

どうしてもimwriteで保存したいのであれば、PILデータをOpenCVで扱うデータフォーマットに変換する必要があるかと。
その場合は、以下あたりが参考になるのではないかと。
https://qiita.com/derodero24/items/f22c22b22451609908ee

投稿2019/11/26 02:07

t_obara

総合スコア5488

hamasaki👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

回答へのコメント

hamasaki

2019/11/26 02:28

画像処理を行うライブラリが混じったがために起きたエラーだったんですね…保存する際、回答してくださったようにPillowに準拠したら出来ました…! ありがとうございました。

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.02%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

NumPy

NumPyはPythonのプログラミング言語の科学的と数学的なコンピューティングに関する拡張モジュールです。

OpenCV

OpenCV(オープンソースコンピュータービジョン)は、1999年にインテルが開発・公開したオープンソースのコンピュータビジョン向けのクロスプラットフォームライブラリです。

Python

Pythonは、コードの読みやすさが特徴的なプログラミング言語の1つです。 強い型付け、動的型付けに対応しており、後方互換性がないバージョン2系とバージョン3系が使用されています。 商用製品の開発にも無料で使用でき、OSだけでなく仮想環境にも対応。Unicodeによる文字列操作をサポートしているため、日本語処理も標準で可能です。