機械系エンジニアの備忘録

20代独身社会人。仕事では機械・機構の研究開発を行っているエンジニアが、自分の専門分野ではないpythonを扱って楽しむブログです。

MENU

【python】【tkinter】【OpenCV】自作の画像編集アプリにエラー表示機能を付ける

前回作ったアプリに、エラー表示の機能を付ける

f:id:stjun:20200412185940p:plain f:id:stjun:20200412190040p:plain

 

※初心者向けにpythonの勉強法とその手順を記事にしました。

www.stjun.com

www.stjun.com

 

 

1. はじめに

前回、ユーザーが画像を好きなサイズに縮小できる機能を追加しました。

www.stjun.com

今回はユーザーが間違って元画像より大きなサイズを指定した時に、ユーザーに向けてエラーの有無と詳細を表示する機能を追加します。

 

2. コードと実行結果

2.1 コード
#マウス選択で選んだ画像を好きな大きさにリサイズ
#(ユーザー名)にお使いのPC名を入れてください

import cv2
import tkinter as tk
import tkinter.filedialog as fl
import tkinter.messagebox as mb
import time
import os

#ウインドの作成
root=tk.Tk()
root.title("画像のリサイズ")

frame_1 = tk.LabelFrame(root,labelanchor="nw",text="実行",foreground="green")
frame_1.grid(row=0, column=0)

frame_2 = tk.LabelFrame(root,labelanchor="nw",text="詳細",foreground="green")
frame_2.grid(row=1, column=0,sticky="we")

#ボタンを押した時の処理
def get(*args):
    
    height=int(num_height.get())
    width=int(num_width.get())
    
    #新しいファイルをデスクトップに作成
    #ファイル名は年月日時分秒
    timestr=time.strftime("%Y%m%d-%H%M%S") 
    file_name="(ユーザー名)"+timestr
    os.makedirs(file_name)
    
    #複数の画像ファイルを選ぶ
    filetype=[("all file","*")]    
    path=fl.askopenfilenames(initialdir="(ユーザー名)",filetypes=filetype,title="select file")
    
    # 読み取った画像を600×400に小さくする
    for i in range(len(path)):
        #画像の読みこみ
        img=cv2.imread(path[i])
        #画像の縦・横の大きさを取得
        img_height,img_width,channels=img.shape
        print(height,width)
        if height>img_height:
            mb.showinfo('error','画像の縦の大きさを確認してください')
            break
        elif width>img_width:
            mb.showinfo('error','画像の横の大きさを確認してください')
            break
        else:
            #画像を600×400に小さくする
            img_resize=cv2.resize(img,dsize=(width,height))
            #画像の名前と保存場所
            name=os.path.splitext(os.path.basename(path[i]))
            hozon_file_name=file_name+'/'+name[0]+'_resize'+'.jpg' 
            #画像の保存
            cv2.imwrite(hozon_file_name,img_resize)
    message["text"]="処理が完了しました"
    mb.showinfo('done','処理が完了しました')

message=tk.Label(frame_1,text="画像を選択してください(複数可)",width=30)
message.grid(row=0,column=0)

button=tk.Button(frame_1,text="開く",command=get)
button.grid(row=0,column=1)

label_height=tk.Label(frame_2,text='縦=',width=5)
label_height.grid(row=1,column=0)

num_height=tk.Entry(frame_2,width=5)
num_height.insert(tk.END,'400')
num_height.grid(row=1,column=1)

label_width=tk.Label(frame_2,text='横=',width=5)
label_width.grid(row=1,column=2)

num_width=tk.Entry(frame_2,width=5)
num_width.insert(tk.END,'600')
num_width.grid(row=1,column=3)

root.mainloop()

 

 

2.2 実行結果

実行すると前回同様、以下の画面が現れます。

f:id:stjun:20200412234531p:plain

もし元画像より小さい値を設定した場合、以下のようにエラーメッセージがでます。

f:id:stjun:20200412235453p:plain

 

3. 説明

3.1 前準備

プログラミング環境はAnacondaを使用しています。またAnacondaにはOpenCVが入ってないので、pipを用いてインストールしています。詳しくは過去記事を見て下さい。

www.stjun.com

またコード内に所々(ユーザー名)とあります。こちらにはお使いのPC名を入れて下さい。

確認するには、ファイルf:id:stjun:20200322173112p:plainをクリックして、PC⇒ローカルディスク(C:)⇒ユーザーと開くとPC名が分かります。

またフォルダ名や画像ファイル名は英数字でないと動かないためご注意ください。 

 

また基本的なコードは前回と同じため、前記事をご覧ください。

www.stjun.com

 

3.2 今回追加した部分:エラー表示の方法

今回追加した処理は以下です。

        #画像の読みこみ
        img=cv2.imread(path[i])
        #画像の縦・横の大きさを取得
        img_height,img_width,channels=img.shape
        #元画像の縦の大きさが設定値より小さい場合はエラーを表示
        if height>img_height:
            mb.showinfo('error','画像の縦の大きさを確認してください')
            break
        #元画像の横の大きさが設定値より小さい場合はエラーを表示
        elif width>img_width:
            mb.showinfo('error','画像の横の大きさを確認してください')
            break
#処理を開始 else:
~画像を縮小する処理~

img_height,img_width,channels=img.shapeで選択した画像の大きさを取得します。

画像の縦の大きさ、画像の横の大きさ、チャネル数(色の数)になります。

f:id:stjun:20200413001245p:plain

そのあと、if文で画像の縦の大きさと設定値を比較し、設定値の方が小さい場合は画像縮小できないので、エラーを表示させます。

同様に画像の横の大きさに対しても判定を行います。

両方に引っかからなければ元画像を縮小できる=設定に問題がないので処理を開始します。

 

おすすめ書籍 

tkinterは参考書が非常に少ないです、というより日本語の参考書はほぼ皆無です。個人的には以下がお勧めです。

私が勉強していた時は以下のような参考書がなくネットで調べながら苦労してtkinterを覚えましたが、もし当時こんな書籍があったらもっと楽に学べたのに...と思うくらい基本的内容について丁寧に書かれています。

Amazonの月額読み放題サービス「Kindle unlimited」でも読めます。

初回30日間は無料、退会も簡単なので試しに無料体験して読んでみてもよさそうです。

 

4. 最後に

いかがだったでしょうか。

tkinterを様々なモジュールと組み合わせて使用できるため非常に便利です。