1

Spyder 環境で Ipython インタープリターを使用しています。フォルダー内のすべての画像を同じサイズでトリミングするスクリプトを書きたいと思います。Matplotlib を使用して *.jpg 画像をプロットします。マウスを使用して、新しい画像の左上と右下に対応する画像の 2 つの角をポイントできるようにしたいと考えています。

私はそのようなコードを書きました

import os
import scipy.ndimage as nd
import matplotlib.pyplot as plt

plt.close('all')

class Conoscopia:
    def __init__(self, cono, nome):
        self.x1 = 0.0
        self.y1 = 0.0
        self.x2 = 0.0
        self.y2 = 0.0
        self.cono = cono
        self.nome = nome

    def connect(self):
        self.cid = self.cono.canvas.mpl_connect('button_press_event', self.onclick)

    def onclick(self, event):
        if self.x1==0.0 and self.y1==0.0:
            self.x1=event.xdata
            self.y1=event.ydata
            print "x1 = ", event.xdata, " y1 = ", event.xdata
        elif self.x2==0.0 and self.y2==0.0:
            self.x2=event.xdata
            self.y2=event.ydata
            print "x2 = ", event.xdata, " y2 = ", event.xdata     

    def return_coo(self):
        return self.x1, self.x2, self.y1, self.y2

    def disegna(self):
        plt.imshow(self.nome)
        plt.show()       

plt.ioff()

files = os.listdir(os.getcwd())

lista_nomi=[]
for nome in files:
    if nome[len(nome)-4:len(nome)] == '.JPG' or nome[len(nome)-4:len(nome)] == '.jpg':
        lista_nomi.append(nome)

foto = nd.imread(lista_nomi[0])

id_f = plt.figure()

cn = Conoscopia(id_f, foto)
cn.connect()
cn.disegna()

x1, y1, x2, y2 = cn.return_coo()

私の問題は、コード全体が一度に実行され、最後に x1、y1、x2、および y2 の値が初期化値に対応することです。次に、画像をクリックして 4 つの値を取得できます。インタープリターx1, y1, x2, y2 = cn.return_coo()で実行すると、正しい値が含まれています。しかし、コードでそれらを直接取得して使用できるようにするにはどうすればよいでしょうか? 私が理想的に望むのは、2 回のクリックが完了するとウィンドウが閉じ、残りのプログラミングで座標 (x1, y1) と (x2, y2) を使用できるようになることです。

return_coo()座標が初期化値と異なるまで待機ループまたは関数のループを追加しようとしましたが、これによりコンピューターがブロックされ、画面が表示されません。

ありがとう!

4

0 に答える 0