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

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

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

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

Tkinter

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

解決済

Tkinterのウインドウ内にwebカメラから取得した動画を表示したい

2ckD
2ckD

総合スコア197

OpenCV

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

Tkinter

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

1回答

0評価

4クリップ

12738閲覧

投稿2019/05/04 14:37

編集2019/05/05 19:37

前提

  • Python
  • Tkinter
  • OpenCV
  • webカメラ

###実現したいこと
OpenCVでwebカメラから取得した画像(動画)をウインドウ内に表示したいです。

発生している問題

  1. 番号リストcv2.imshowならスムーズに画像が切り替わりますが、

別ウインドウを開く必要があります。そうすることなく動画を表示したいです。
0. canvas.itemconfig()で画像を切り替えようとすると、
画像が消える(一瞬canvasの背景色のみが表示される)→画像が表示される
というプロセスを経るためにスムーズに画像を切り替えることができません。

該当のソースコード

Python

import tkinter as tk import threading as th import cv2 from PIL import Image,ImageTk import numpy as np root=tk.Tk() root.title("camera") root.geometry("720x480") canvas=tk.Canvas(root, width=640, height=480) canvas.pack() def camera(): try: c=cv2.VideoCapture(0) h=c.get(cv2.CAP_PROP_FRAME_HEIGHT) w=c.get(cv2.CAP_PROP_FRAME_WIDTH) i=0 while(True): ret, frame =c.read() if (not ret): break if cv2.waitKey(1)&0xFF==ord('q'): canvas.delete("all") break cv2.imshow('camera', frame) image=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) if not i:#初回起動時の処理 i=1 canvas.create_image(w/2,h/2,image=image,tag="img") continue canvas.itemconfig("img", image=image) c.release() cv2.destroyAllWindows() except: import sys print(sys.exec_info()[0]) print(sys.exec_info()[1]) t1=th.Thread(target=camera) t1.start() root.mainloop()

試したこと

labelで画像を表示する場合も同じ結果に終わりました。

label.configure(image=image)

###回答をもとにできたもの
aaaa

python

import tkinter as tk import cv2 from PIL import Image,ImageTk import numpy as np root=tk.Tk() root.title("camera") root.geometry("720x480") root.resizable(width=False, height=False) canvas=tk.Canvas(root, width=640, height=480, bg="white") canvas.pack() def capStart(): print('camera-ON') try: global c, w, h, img c=cv2.VideoCapture(0) w, h= c.get(cv2.CAP_PROP_FRAME_WIDTH), c.get(cv2.CAP_PROP_FRAME_HEIGHT) print('w:'+str(w)+'px+h:'+str(h)+'px') except: import sys print("error-----") print(sys.exec_info()[0]) print(sys.exec_info()[1]) '''終了時の処理はここでは省略します。 c.release() cv2.destroyAllWindows()''' def u():#update global img ret, frame =c.read() if ret: img=ImageTk.PhotoImage(Image.fromarray(cv2.cvtColor(frame, cv2.COLOR_BGR2RGB))) canvas.create_image(w/2,h/2,image=img) else: print("u-Fail") root.after(1,u) capStart() u() root.mainloop()

良い質問の評価を上げる

以下のような質問は評価を上げましょう

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

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

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

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

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

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

まだ回答がついていません

会員登録して回答してみよう

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

ただいまの回答率
87.20%

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

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

質問する

関連した質問

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

OpenCV

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

Tkinter

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