前提・実現したいこと
初心者&独学ですが...
Python tkinterを使って画像ビュワーを製作しております。
この時、画像にあるように画像内の白点をラベリングします。実際は2000×2000pixelの画像を適度に縮小させてCanvasに表示させており
現在表示させている範囲以外の見えていないエリアをマウスドラッグし平行移動させて表示させたいです。
Canvasに表示させる為、OpenCVで処理した画像をPillow に変換しアフィン変換しているせいか下記エラーが発生し上手く行きません。
シンプルに画像の移動を行う事は出来るのでしょうか?
発生している問題・エラーメッセージ
drag_img = cv2.warpAffine(image, M, (w, h)) cv2.error: OpenCV(4.5.4-dev) :-1: error: (-5:Bad argument) in function 'warpAffine' > Overload resolution failed: > - src is not a numpy array, neither a scalar > - Expected Ptr<cv::UMat> for argument 'src'
該当のソースコード
python
1#ライブラリを取り込む 2import tkinter as tk 3from tkinter import filedialog 4import cv2 5from PIL import Image, ImageTk 6import os 7import numpy as np 8 9 10# coding: utf-8 11 12img = None #初期化 13filepath = None #初期化 14 15#ウインドウを作成 16root = tk.Tk() 17root.title("XXXXXX")#タイトル 18root.geometry("800x800")#サイズ 19 20#パーツを配置 21#ラベル1を作成 22label1 = tk.Label(text='■画像読込') 23label1.place(x=10, y=10) 24 25#ラベル2を作成 26label2 = tk.Label(text='ファイル名:') 27label2.place(x=10, y=40) 28 29#ファイルパスの表示欄を作成 30input_box1 = tk.Entry(width=75, bd=4) 31input_box1.place(x=80, y=40) 32 33 34 35#参照ボタンの動作 36def file_select(): 37 global filepath #グローバル宣言 38 39 #ファイルパスを表示欄に表示 40 idir = r'C:\descktop' 41 filetype = [("すべて","*")] 42 filepath = tk.filedialog.askopenfilename(filetypes = filetype, initialdir = idir) 43 input_box1.delete(0, tk.END) 44 input_box1.insert(0, filepath) 45 46 #選択したファイルを表示 47 if filepath and os.path.isfile(filepath): 48 49 global img #グローバル宣言 50 global image_info 51 global image 52 global h, w 53 54 img = cv2.imread(filepath) 55 gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)#グレースケールに変換 56 bin = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY | cv2.THRESH_OTSU)[1]#二値化 57 label = cv2.connectedComponentsWithStats(bin)#ラベリング処理 58 59 # ラベリング結果書き出し用に二値画像をカラー変換 60 color_src = cv2.cvtColor(bin, cv2.COLOR_GRAY2BGR) 61 62 63 64 65 #ブロブ情報を項目別に抽出 66 n = label[0] - 1 67 data = np.delete(label[2], 0, 0) 68 center = np.delete(label[3], 0, 0) 69 70 #オブジェクト情報を利用してラベリング結果を画面に表示 71 for i in range(n): 72 73 #各オブジェクトの外接矩形を赤枠で表示 74 x0 = data[i][0] 75 y0 = data[i][1] 76 x1 = data[i][0] + data[i][2] 77 y1 = data[i][1] + data[i][3] 78 cv2.rectangle(color_src, (x0, y0), (x1, y1), (0, 255, 255), thickness= 2) 79 80 81 #各オブジェクトのラベル番号を黄文字で表示 82 cv2.putText(color_src, "ID: " +str(i + 1), (x1 - 30, y1 - 30), cv2.FONT_HERSHEY_PLAIN, 2, (0, 255, 255)) 83 84 85 #各オブジェクトの重心座標をに黄文字で表示 86 cv2.putText(color_src, "X: " + str(int(center[i][0])), (x1 - 30, y1 + 20), cv2.FONT_HERSHEY_PLAIN, 2, (0, 255, 255)) 87 cv2.putText(color_src, "Y: " + str(int(center[i][1])), (x1 - 30, y1 + 50), cv2.FONT_HERSHEY_PLAIN, 2, (0, 255, 255)) 88 89 #結果の表示 90 #cv2.imshow("color_src", color_src01) 91 img_pil = Image.fromarray(color_src)#PILへ変換 92 #img_tk = ImageTk.PhotoImage(img_pil)#ImageTkへ変換 93 94 #画像の情報を取得 95 w, h = img_pil.size 96 97 #画像リサイズ 98 image = ImageTk.PhotoImage(img_pil.resize((int(h/2), int(w/2)))) 99 100 #表示位置調整 101 canvas.image = image 102 canvas.create_image(image.width()/2, image.height()/2, image=image) 103 104 105 106 # ラベルの個数nだけ色を用意 107 print("ブロブの個数:", n) 108 #print("各ブロブの外接矩形の左上x座標", data[:,0]) 109 #print("各ブロブの外接矩形の左上y座標", data[:,1]) 110 #print("各ブロブの外接矩形の幅", data[:,2]) 111 #print("各ブロブの外接矩形の高さ", data[:,3]) 112 #print("各ブロブの面積", data[:,4]) 113 #print("各ブロブの中心座標:\n",center) 114 115 canvas.bind("<Button-1>", click) 116 canvas.bind('<B1-Motion>', drag) 117 118def click(event): 119 global posx 120 global posy 121 122 posx = event.x 123 posy = event.y 124 print("posx", posx) 125 print("posy", posy) 126 127def drag(event): 128 129 movex = event.x 130 movey = event.y 131 dx = movex - posx 132 dy = movey - posy 133 print("movex", dx) 134 print("movey", dy) 135 136 M = np.float32([[1, 0, dx], [0, 1, dy]]) 137 print(M) 138 drag_img = cv2.warpAffine(image, M, (w, h)) 139 140 # 表示位置調整 141 canvas.image = drag_img 142 canvas.create_image(drag_img.width() / 2, drag_img.height() / 2, image=drag_img) 143 144 145 146 147 148 149 150 151#Canvasの作成(メイン画像) 152canvas = tk.Canvas(root, width=500, height=500, bg="white",) 153canvas.place(x=10, y=70) 154 155#参照ボタン1を作成 156button1 = tk.Button(text="参照", command=file_select, width=8, bd=4) 157button1.place(x=630, y=35) 158 159#閉じるボタンを作成 160button2 = tk.Button(text="閉じる", command=root.destroy, width=8, bd=4) 161button2.place(x=730, y=35) 162 163 164 165#GUIをそのまま表示 166root.mainloop() 167 168 169
試したこと
Pillow -> NumPyへ変換してみましたが、別Errorになりました。
補足情報(FW/ツールのバージョンなど)
Python 3.6.1
opencv-python 4.5.3.56
Pillow 8.3.2
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2021/10/29 09:46
2021/11/01 04:02
2021/11/01 05:14
2021/11/03 04:30
2021/11/04 05:37