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

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

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

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

Tkinter

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

Python

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

Q&A

解決済

1回答

910閲覧

Python: opencvで取得してimageをtkのcanvasに表示させたい

IroIroShiritai

総合スコア20

OpenCV

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

Tkinter

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

Python

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

0グッド

0クリップ

投稿2019/05/01 01:35

編集2019/05/01 01:52

opnecvで取得したimageをtkのcanvasに表示させたいと考えております。googleで色々検索しましたが、tkに貼るには変換が必要であることまでは分かり、変換して貼ってみましたが何も表示されていないです。色々間違えているとは思いますが、ご確認頂ければと思います。
動作は、1.File->Openを押す。2.filedialogで画像ファイルを選ぶ。3.選んだ画像がcanvas上に表示される。と言う流れを期待しております。

python

1import numpy as np 2import tkinter as tk 3import tkinter.filedialog as fd 4from PIL import Image,ImageTk 5import cv2 6 7class mainApp(tk.Frame): 8 def __init__(self,master): 9 super().__init__(master,height=500,width=800) 10 self.pack() 11 self.create_widgets() 12 13 def create_widgets(self): 14 #メニュー 15 menubar = tk.Menu(self) 16 menu1 = tk.Menu(menubar,tearoff=False) 17 menu1.add_command(label="open", command=self.file_open) 18 menubar.add_cascade(label='File',menu=menu1) 19 self.master["menu"] = menubar 20 21 # 画像表示エリア 22 image_frame = tk.Frame(self,width=400,height=400) 23 image_frame.propagate(False) 24 image_frame.place(x=300,y=50) 25 image_yscrollbar = tk.Scrollbar(image_frame) 26 image_yscrollbar.pack(side=tk.RIGHT,fill=tk.Y) 27 image_xscrollbar = tk.Scrollbar(image_frame,orient=tk.HORIZONTAL) 28 image_xscrollbar.pack(side=tk.BOTTOM,fill=tk.X) 29 self.image_canvas = tk.Canvas(image_frame,\ 30 xscrollcommand=image_xscrollbar.set,yscrollcommand=image_yscrollbar.set) 31 self.image_canvas.pack(side=tk.TOP, fill=tk.BOTH) 32 image_xscrollbar["command"] =self.image_canvas.xview 33 image_yscrollbar["command"] =self.image_canvas.yview 34 35 def file_open(self): 36 #fileを選択 37 image_file_path = str(get_file_path("画像ファイルを選択してください")) 38 #imageを読み込む 39 img_cv = imread(image_file_path) 40 img_tk = img_fromCv_toTk(img_cv) 41 self.image_canvas.create_image(0,0,image=img_tk,anchor='nw') 42 43# Fileのdialogを呼び出し、Pathを返す関数 44def get_file_path(stitle): 45 in_path = fd.askopenfilename( 46 title = stitle 47 ) 48 return in_path 49# filePathで指定されたイメージをよみこみimgを返す関数 50def imread(filename, flags=cv2.IMREAD_COLOR, dtype=np.uint8): 51 try: 52 n = np.fromfile(filename, dtype) 53 img = cv2.imdecode(n, flags) 54 return img 55 except Exception as e: 56 print(e) 57 return None 58# OpenCVで読み込まれたイメージをtkフォーマットに変換する関数 59def img_fromCv_toTk(image_cv): 60 image_rgb = cv2.cvtColor(image_cv, cv2.COLOR_BGR2RGB) 61 image_pil = Image.fromarray(image_rgb) 62 image_tk = ImageTk.PhotoImage(image_pil) 63 return image_tk 64 65root = tk.Tk() 66app = mainApp(root) 67app.mainloop()

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

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

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

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

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

guest

回答1

0

ベストアンサー

以下を修正ください。

  • 読み込んだ画像をメンバ変数として保持
  • キャンバスサイズとスクロール領域を設定

Python

1 def __init__(self,master): 2 # 略。以下を追加 3 self.img_tk = None 4 5 def file_open(self): 6 # 略。以下を追加 7 w,h = img_tk.width(), img_tk.height() 8 self.image_canvas.config(width=w, height=h,scrollregion=(0,0,w,h)) 9 self.img_tk = img_tk

投稿2019/05/01 02:57

can110

総合スコア38234

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

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

IroIroShiritai

2019/05/01 04:26

早速ご回答いただきありがとうございます。ご指摘のように変更すると思い通りの動きとなりました。また、スクロールの領域を画像の大きさから決める方法も勉強になりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問