Q&A
前提・実現したいこと
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
回答1件
あなたの回答
tips
プレビュー
下記のような回答は推奨されていません。
このような回答には修正を依頼しましょう。
2019/06/15 04:02
2019/06/15 05:43
2019/06/15 06:57
2019/06/15 08:45
2019/06/15 08:52
2019/06/15 10:37
2019/06/15 11:13
2019/06/15 11:21
2019/06/15 13:52