tata色々な備忘録

データ解析、画像解析、化学分析などなど

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)

f:id:tatabox2000:20150301223801p:plain

Widget (ファイル名:widget.ui objectname:widget)

f:id:tatabox2000:20150301215956p:plain

Dialog (ファイル名:dialog.ui objectname:dialog)

f:id:tatabox2000:20150301215949p:plain

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を押す

f:id:tatabox2000:20150301224228p:plain

load widgetボタンを押す

f:id:tatabox2000:20150301224409p:plain

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
実行結果

f:id:tatabox2000:20141006011119p:plain

参考

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ホイールクリックで、メッセージボックスにカーソルの座標が表示される

f:id:tatabox2000:20140916193929j:plain

ホイールに拡大縮小、左クリックに元倍率、右クリックにコンテキストメニューを割り振る予定。

参考

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())

右クリックでメニューが追加表示される。

f:id:tatabox2000:20140916184209j:plain

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ボタンを押す) f:id:tatabox2000:20140902185241j:plainf:id:tatabox2000:20140902185324j:plain

このように、Opencvにてエッジ検出した画像が表示される。

参考
python - How to configure color when convert numpy array to QImage? - Stack Overflow

PyQt(PySide)で画像処理その2(GUI動作設定の基本)

PyQt(PySide)で画像処理(その1) - tataboxの備忘録

前回の続き。

画像と重なるため、若干レイアウトを変更しました。

f:id:tatabox2000:20140901000714p:plain

というわけで、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)画像とアドレスが表示され、画像に合わせて全体がリサイズ
f:id:tatabox2000:20140901003248p:plain

次はOpencvとの連携について書きます。

続きます(気力があれば)