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との連携について書きます。
続きます(気力があれば)
PyQt(PySide)で画像処理その1(GUIの作成)
久々の更新。
PyQt(やPySide)とOpenCVで画像処理GUIアプリを作ってみる。
※8/31追記 guiqwtはpysideで動かない⇒graphics Viewに変更
1.画面レイアウトの作成
(1)メイン画面
QtDesignerを立ちあげてMainwindowを選択(MacはQt Createrから作成)。
(2)ウィジット(部品)の配置
左のツリービュー(ウィジットボックス)からアイコンをドラッグし、 下記のようにレイアウトする。
使用したウィジットは下記の通り
・Push Button
・LCD Number
・Graphics Vier
・Horizontal Slider
・LineEdit
※追記 guiqwtはpysideで動かない⇒graphics Viewに変更
ウィジットボックス中のLayoutの項目で整列できる。適宜活用しましょう。
(3)名称の記入
アイコンやファイルメニューをクリックしてボタンなどに表記する(目的とリンクさせる)。
(4)各ウィジットに名前をつける
右側にあるオブジェクトインスペクタにてウィジット(部品)に名前をつける。
名前を機能とリンクさせて分かりやすくすると良い感じ。
今回はこの名前に設定。
(4)ウィジットのプロパティ
1)画面中央のimagewidgetを選択し、プロパティウィンドウにて
mousetrackingにチェックを入れる。
2)Sliderにはプロパティ中のQAbstractSliderにてmaximumの値を254(上2つ)、260000(最下段)に設定。用途は下記の予定。
・254 ;色の閾値最大と最小
・90000:面積の閾値(QLcdnumberの最大値)
(5)シグナルとスロット
シグナル:作業者の動作(テキストを記入した、マウスをクリックしたなど)
スロット:受信側の挙動(テキストの反映、表示など)
今回は下記のシグナルとスロットを対応させている。
・ファイルメニューのQuit⇒MainWindow終了
・各種スライダーの値変更⇒LCDに反映
・LCD脇のテキストボックス値変更⇒LCDに反映
(6)保存とpythonコードへの変換
pyqt_Opencv.uiとして適当なフォルダに保存する。 コマンドラインにてそのフォルダへ移動して下記のコマンドを実行する。
$ pyuic4 -i 0 -x pyqt_Opencv.ui -o pyqt_Opencv.py
PySideの場合は下記
$ pyside-uic -o pyqt_Opencv.py pyqt_Opencv.ui
ライセンスに関してはPyQtはGPL、PySideはLGPLなので、商用するならPySideっすね。
続く(気力があれば)
pythonで散布図行列
pandasを使用して散布図行列や箱ひげを書いてみる。
データはirisを使用。
https://raw.github.com/pydata/pandas/master/pandas/tests/data/iris.csv
(日本語環境テストのため、Nameを種類、lengthを長さ、widthを幅に置換して使用)
前提条件のmatplotlib日本語環境はこちら http://tatabox.hatenablog.com/entry/2013/07/21/025603
# -*- coding: cp932 -*- import pandas as pd import numpy as np from pandas.tools.plotting import radviz '''matplotlibの日本語環境''' from matplotlib import rcParams rcParams['font.family'] = 'IPAexGothic' rcParams['font.sans-serif'] = ['IPAexGothic'] import matplotlib.pyplot as plt '''データの読み込み。Windows環境はencoding='cp932'必須''' iris = pd.read_csv('.//iris.csv',index_col=0,encoding='cp932') '''最初の5つを表示''' print iris.head(n=5) '''概要''' print iris.describe() '''相関係数行列とCSV出力''' iris_corr=iris.corr() print iris_corr iris_corr.to_csv('iris_corr.csv') '''散布図行列''' pd.scatter_matrix(iris,color='green',diagonal='kde',figsize=(6,6)) '''radviz''' plt.figure() radviz(iris,u"種類") '''箱ひげ''' iris.boxplot(by=u"種類") plt.show()
[
他だとpyvttblが良さそう。
https://pyvttbl.googlecode.com/hg-history/0315dcd0bc2fba044fae4449dc9d84f5fc7b66eb/doc/_build/html/scatter_matrix.html
参考
http://blog.livedoor.jp/norikazu197768/archives/12539634.html
http://pandas.pydata.org/pandas-docs/stable/visualization.html (公式)