PyQt(PySide)とOpenCVで画像処理その7(日本語処理)
OSを判定して日本語対応させる。 os.nameがntならcp932、それ以外ならutf-8でエンコードする。
import os import PySide from PySide import QtCore,QtGui import cv2 #OSチェック def os_check(): #windows if os.name is 'nt': code = 'cp932' return code #Unix、Mac if os.name is not 'nt': code = 'utf-8' return code def open_file(code): filename = QtGui.QFileDialog.getOpenFileName(filter="Image Files (*.png *.bmp *jpg)") #日本語をエンコードして文字化け回避 filename = filename[0].encode(code) im = cv2.imread(filename) cv2.imshow("",im) cv2.waitKey(0) cv2.destroyAllWindows() if __name__ == '__main__': code = os_check() open_file(code)
PyQt(PySide)とOpenCVで画像処理その6(サブウィンドウ)
久しぶりの更新。以下の続き
PyQt(PySide)とOpenCVで画像処理その5(イベントフィルター) - tataboxの備忘録
PyQt(PySide)でサブウィンドウを呼び出したり、ウィジットを追加してみる。
1.QtDesigner で下のように作る
Main window (ファイル名:main.ui objectname: main)
Widget (ファイル名:widget.ui objectname:widget)
Dialog (ファイル名:dialog.ui objectname:dialog)
2.フォルダに移動し、コマンドライン上でpythonのコードに変換
pyside-uic -o main.py main.ui pyside-uic -o widget.py widget.ui pyside-uic -o dialog.py dialog.ui
3.同一フォルダに以下の内容で作成し、実行
import PySide from PySide import QtCore,QtGui import sys from main import Ui_main from dialog import Ui_dialog from widget import Ui_widget class Main(QtGui.QMainWindow,Ui_main): def __init__(self, parent = None): super(Main, self).__init__(parent) self.ui = Ui_main() self.setupUi(self) self.button.clicked.connect(self.pushButton) QtCore.QObject.connect(self.actionLoad_Dialog, QtCore.SIGNAL("triggered()"), self.pushMenu) def pushButton(self): self.widget = Widget(self) self.widget.show() def pushMenu(self): self.dialog = Dialog(self) self.dialog.show() class Dialog(QtGui.QDialog,Ui_dialog): def __init__(self, parent=None): QtGui.QDialog.__init__(self, parent) self.setupUi(self) class Widget(QtGui.QWidget,Ui_widget): def __init__(self, parent=None): QtGui.QWidget.__init__(self, parent) self.setupUi(self) if __name__ == '__main__': app = QtGui.QApplication(sys.argv) dmw = Main() dmw.show() sys.exit(app.exec_())
menu 中のload Dialogを押す
load widgetボタンを押す
Widgetは内部、Dialogは別窓で表示される。
参考
python - How to create new PyQt4 windows from an existing window? - Stack Overflow
python+Opencvによる画像処理10(線や文字の書き込み)
画像にスケールを書き込む必要があり、線や文字の書き込み法を調べたのでメモ。
(1) 線の書き込み
cv2.line(image,(start_x,start_y),(end_x,end_y),color,thickness)
(2)文字の書き込み
cv2.putText(image,text,(start_x,start_y),font, font size,color)
フォントの種類(これのみ、日本語は多分不可)
FONT_HERSHEY_COMPLEX FONT_HERSHEY_COMPLEX_SMALL FONT_HERSHEY_DUPLEX FONT_HERSHEY_PLAIN FONT_HERSHEY_SCRIPT_COMPLEX FONT_HERSHEY_SCRIPT_SIMPLEX FONT_HERSHEY_SIMPLEX FONT_HERSHEY_TRIPLEX FONT_ITALIC
実行結果
参考
Drawing Functions in OpenCV — OpenCV 3.0.0-dev documentation
PyQt(PySide)とOpenCVで画像処理その5(イベントフィルター)
前回の続きということで、マウス操作にてカーソル位置の取得を行う。 PyQt(PySide)とOpenCVで画像処理その4(右クリックメニュー) - tataboxの備忘録
イベントフィルターを使用する。 前回のコードに下記を追加
def __init__(self, parent = None): ・ ・ ・ #ここから #イベントフィルターの追加 self.pic_View.installEventFilter(self) #イベントフィルター時に実施する関数 def eventFilter(self, source, event): #画像表示部の情報をマウスボタンを押す際に取得 if (event.type() == QtCore.QEvent.MouseButtonPress and source is self.pic_View): #右クリックはコンテキストメニュー用に例外処理 if event.button() == QtCore.Qt.RightButton: pass else: #マウス位置の取得 pos = event.pos() #メッセージボックスで表示 msgbox = QtGui.QMessageBox(self) msgbox.setText('mouse position: (%d, %d)' % (pos.x(), pos.y())) #メッセージボックスの表示 ret = msgbox.exec_() #戻り値が必要 return QtGui.QWidget.eventFilter(self, source, event)
左orホイールクリックで、メッセージボックスにカーソルの座標が表示される
ホイールに拡大縮小、左クリックに元倍率、右クリックにコンテキストメニューを割り振る予定。
参考
python - PyQt: how to handle event without inheritance - Stack Overflow
PyQt(PySide)とOpenCVで画像処理その4(右クリックメニュー)
前回の続き。コンテキストメニュー(右クリックメニュー)の追加方法について。
PyQt(PySide)で画像処理その3(OpenCVとの連携) - tataboxの備忘録
main_setup.pyに下記を追記
def __init__(self, parent = None): ・ ・ ・ #ここから pic_view = self.pic_View #コンテキストメニューの表示 pic_view.setContextMenuPolicy(QtCore.Qt.CustomContextMenu) #コンテキストメニューを定義する関数との接続 pic_view.customContextMenuRequested.connect(self.contextMenue) def contextMenue(self,event): #メニュー(Qメニュー) menu = QtGui.QMenu() #項目名と実行する関数の設定 menu.addAction('canny',self.make_canny) menu.addAction('test1',self.make_canny) menu.addAction('test2',self.make_canny) #マウス位置に出現 menu.exec_(QtGui.QCursor.pos())
右クリックでメニューが追加表示される。
PyQt(PySide)で画像処理その3(OpenCVとの連携)
前回の続き。
PyQt(PySide)で画像処理その2(GUI動作設定の基本) - tataboxの備忘録
今回はExecuteボタンを押すと1)表示画像をOpencvにてエッジ検出し、 2)GUIにて元画像と重ねて表示するコードを作成する。
OpenCVにて画像処理する下記のコードを作成し、opencv_test.pyという名前で、他のファイルと同じフォルダに保存する。
main_setup.pyを下記のように編集して、先ほどのopencv_test.pyと連携させる。
実行結果
(ファイル選択後にExecuteボタンを押す)
このように、Opencvにてエッジ検出した画像が表示される。
参考
python - How to configure color when convert numpy array to QImage? - Stack Overflow
PyQt(PySide)で画像処理その2(GUI動作設定の基本)
PyQt(PySide)で画像処理(その1) - tataboxの備忘録
前回の続き。
画像と重なるため、若干レイアウトを変更しました。
というわけで、Qtで画像を開き、画像に合わせてフレームのサイズを変更するコードです。
前回作成したpyqt_Opencv.pyと同じフォルダに下記のファイルを入れます。
from PySideを PyQt4に書き換えることでPyQtでも動作します。
重要ポイントは下記の3つ
(1)前回生成したフォームの引き継ぎ
生成ファイルからUi_(+メインウィンドウ名)のクラスを
インポートすることで、フォームを引き継ぎます。
"""生成されたフォームのファイルからフォームをインポート""" from pyqt_Opencv import Ui_Qt_CV_MainWindow
(2)シグナル&スロット
シグナル&スロット(実行関数)には幾つかの表記法がありますが、今回は以下の書式です。 QtCore.QObject.connect(操作オブジェクト名,QtCore.SIGNAL("シグナル名"),実行する関数名)
"""シグナル&スロット:file_buttonをクリックすると、open_file関数を実行""" QtCore.QObject.connect(self.file_button, QtCore.SIGNAL("clicked()"), self.open_file)
(3)おまじない1、2
意味は以下の通りです。クラス名は任意。
1)インポートしたフォームを取り込んで初期化
2)クラスの実行
実行結果(例)
1)Fileボタンを押し、画像ファイルを選択
2)画像とアドレスが表示され、画像に合わせて全体がリサイズ
次はOpencvとの連携について書きます。