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

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

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

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

Q&A

解決済

1回答

5149閲覧

Tkinter内でのOpenCVを利用した写真撮影

sezaki_H

総合スコア41

OpenCV

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

Python 3.x

Python 3はPythonプログラミング言語の最新バージョンであり、2008年12月3日にリリースされました。

Tkinter

Tkinterは、GUIツールキットである“Tk”をPythonから利用できるようにした標準ライブラリである。

Python

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

0グッド

0クリップ

投稿2019/06/14 17:02

編集2019/06/14 17:13

前提・実現したいこと

Tkinter内にOpenCVのキャプチャ画面を表示させ、ボタンクリックで撮影するプログラムを作成しているのですが、撮影がうまくいきません。
①Labelにキャプチャ画面表示
②ボタンを押すことで撮影
③下のラベルに画像表示

①と③は正常に動作しています。

発生している問題・エラーメッセージ

最初はcv2.imwrite(image_file_path, frame)と書いたのですが、そうすると

cv2.imwrite(image_file_path, label1) TypeError: Expected cv::UMat for argument 'img'

というエラーがボタンを押すたびに表示されました。

調べたところキャストする方法しか見つからなかったため
cv2.imwrite((cv2.UMat(image_file_path)), frame)と書き換えたところ

cv2.imwrite((cv2.UMat(image_file_path)), frame) TypeError: UMat() missing required argument 'ranges' (pos 2)

というエラーが表示されるようになりました。

該当のソースコード

ボタンのイベント部分とコード全体です。

py

1def button1_click(): 2 3 image_file_path = './tmp.jpg' 4 cv2.imwrite((cv2.UMat(image_file_path)), frame)

py

1import numpy as np 2import os 3from PIL import Image,ImageTk 4from keras.models import model_from_json 5import cv2 6 7#TkinterでGUI表示。判定ボタンと判定画像、モデルの写真リストを表示させたい。 8import sys 9import tkinter as tk 10import tkinter.ttk as ttk 11from tkinter import messagebox as tkMessageBox 12from tkinter import filedialog as tkFileDialog 13 14# 実行 15root = tk.Tk() 16root.title("cap_test") # タイトル 17root.geometry("1280x780") # ウィンドウの幅と高さピクセル単位で指定(width x height) 18 19#カメラ 20cap = cv2.VideoCapture(0) 21cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240) 22cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 180) 23 24def button1_click(): 25 26 image_file_path = './tmp.jpg' 27 cv2.imwrite((cv2.UMat(image_file_path)), frame) 28 29 #tmp.jpgを表示 30 image = Image.open("tmp.jpg") 31 image = image.resize((320,240)) 32 tkpi2 = ImageTk.PhotoImage(image) 33 label_image.configure(image = tkpi2) 34 label_image.image = tkpi2 35 36# フレームの作成 37 38frame = tk.Frame(root,bd=2,relief="flat",bg="blue") 39frame.pack(fill=tk.BOTH,side='right',expand=True) 40frame.pack_propagate(0) 41 42# フレームの作成 43frame1 = tk.Frame(root,bd=2,relief="flat",bg="green") 44# フレームを画面に配置し、縦方向に余白を拡張する 45frame1.pack(fill=tk.BOTH,side=None,expand=True) 46frame1.pack_propagate(0) 47 48#カメラ表示 49label1 = tk.Label(frame1,bg="black") 50label1.grid(column=0,row=0) 51# 作成したフレームにボタン1を配置 52button1 = tk.Button(frame1,text="撮影") 53button1["command"] = button1_click 54button1.grid(column=0,row=1) 55 56 57 58#tmp.jpgを表示 59image = Image.open("tmp.jpg") 60image = image.resize((320,240)) 61tkpi = ImageTk.PhotoImage(image) 62label_image = tk.Label(frame1, image=tkpi,width=320,height=240) 63label_image.grid(column=0,row=2) 64 65# 作成したフレームにボタン2を配置 66button2 = tk.Button(frame1,text="判定") 67button2.grid(column=0,row=3) 68 69# 作成したフレームにボタン3を配置 70button3 = tk.Button(frame1,text="終了",command=quit) 71button3.grid(column=0,row=4) 72 73 74def show_frame(): 75 _, frame = cap.read() 76 frame = cv2.flip(frame, 1) 77 cv2image = cv2.cvtColor(frame, cv2.COLOR_BGR2RGBA) 78 img = Image.fromarray(cv2image) 79 imgtk = ImageTk.PhotoImage(image=img) 80 label1.imgtk = imgtk 81 label1.configure(image=imgtk) 82 label1.after(10, show_frame) 83 84show_frame() 85 86 87 88 89 90 91def quit(): 92 root.quit() 93 94 95 96 97 98root.mainloop()

補足情報(FW/ツールのバージョンなど)

Python3.7.3
OpenCV4.10
Tkinter8.6

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

以下のようにcv2imageを書き込むようにすればよいです。

Python

1def button1_click(): 2 image_file_path = './tmp.jpg' 3 cv2.imwrite(image_file_path, cv2image) 4 # 略 5 6cv2image = None 7def show_frame(): 8 global cv2image 9 # 略

投稿2019/06/15 02:41

編集2019/06/15 05:41
can110

総合スコア38280

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

sezaki_H

2019/06/15 04:02

そのコードでも TypeError: UMat() missing required argument 'ranges' (pos 2) が表示されてしまいます。試しにUMatのキャストを外したところ、イメージファイルは生成されますが空のファイルができてしまいエラーになりました、、、。
can110

2019/06/15 05:43

失礼しました。不要なキャストが残っていましたのでコード修正しました。 キャプチャ画像は画面に表示されているでしょうか? 当方環境では正常に画像表示され「撮影」ボタンにてtmp.jpgファイル保存できています。
sezaki_H

2019/06/15 06:57

ありがとうございます。 撮影はできたのですが、保存された画像のRGBが入れ替わってしまいます。 show_frame()内の変換を無効にするとキャプチャのRGBが入れ替わり、保存される画像は正常なRGBで保存されます。 cv2.imwriteの手前でRGBの変換を入れると TypeError: Expected cv::UMat for argument 'src' というエラーが出てしまいます。どうしたらよいでしょうか?
can110

2019/06/15 08:45

画像は正常に保存され問題は解決された思うのですが >cv2.imwriteの手前でRGBの変換を入れると この変換の意図は何でしょうか。
sezaki_H

2019/06/15 08:52

キャプチャ画面の表示部分でcv2imageにcv2.COLOR_BGR2RGBAをかけており、それを外すとキャプチャ画面が正常に表示されないためそのまま残しているのですが、そうすると保存される画像のRGBがおかしくなるためcv2.imwriteの前で再変換を行おうと考えました。 そもそもキャプチャ画面をframeに代入する際に変換を行わなければいけないのはなぜなのでしょうか。
can110

2019/06/15 10:37

うーん。当方環境では保存画像のRGB値は正常です。。。
sezaki_H

2019/06/15 11:13

そうですか、また色々試してみます。。。 コードは私のものをそのまま使いましたか?
can110

2019/06/15 11:21

cap.set(cv2.CAP_PROP_FRAME_WIDTH, 240) cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 180) を当方カメラに合わせ640x480に修正したのみです。
sezaki_H

2019/06/15 13:52

cv2.COLOR_BGR2RGBAの最後のAが不要でした(汗) ありがとうございます<(_ _)>
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問