20160712

端末からQRコード pngとsvgで、できた。

androidは、一次元・二次元バーコード処理ライブラリである、「zxing」があるから、一次元でもQRでも読めるらしい。

QRは、デンソーウェーブが、特許権を持っているけど、特許権を行使しないらしい。

まあね、ヒトのサイトでやってたのをそのままパクって実行した部分もあるんでね、一応リンクをね。

:~$ sudo pip install qrcode
[sudo] hogehoge のパスワード:
The directory '/home/hogehoge/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/hogehoge/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting qrcode
  Downloading qrcode-5.3-py2.py3-none-any.whl
Requirement already satisfied (use --upgrade to upgrade): six in ./.local/lib/python2.7/site-packages (from qrcode)
Installing collected packages: qrcode
Successfully installed qrcode-5.3

pythonインタープリタ使わなくても、パイプ処理で、出力が出きるらしいということが、前述したサイトCUBE SUGAR STORAGE でよんで分かっている。
あのサイトでは、pngでやってたから、svgでやってみようと思い、試した。
まんま、直球
:~$qr "hogehoge" > hogehoge.svg
ファイルは出力されたものの、見れなかった。
拡張子をpngに変えると、.pngとして見れた。



じゃあ、svgはどうやって出力するのか(端末からの操作で。インタプリタからはまだ知らん。)。
やっぱり、Pypiのusageに頼る。
https://pypi.python.org/pypi/qrcodeには、svg関連の項目があった。
まんま写経しますが、

qr --factory=svg-path "http://naga-tsuzuki.sblo.jp/" > test.svg
これでできた。

ここにsvgを置いても、リンクを作るだけで、ページ内に表示されないので、やっぱりpngで保存。
CUBE SUGAR STORAGE様様だ。

qr "http://naga-tsuzuki.sblo.jp/" > アドレス.png
アドレス.png
リンクを貼らなければ、タダの画像。
ブラウザがQRコードを検知して、勝手に読んでくれるとか、そういう機能は、どこも担っていないらしい。

アドレス.png
これで、それっぽくなるはず。


なんか、次の次元へと歩みを進めた感。
posted by yuchan at 07:00 | Comment(0) | python

20160711

pythonでバーコード

何がきっかけだったか忘れたが、バーコードをwikipediaで調べた。
バーコードバトラーなんてのも昔買ったっけとか思っていた。

QRコードで、アドレスを指定するのを考えていて...
それも何で使うのかも特に考えていなくて、多分このブログで...
2次元バーコード(QR)の前に、一次元バーコードかなって事で、仕組みを調べながらやれたらなぁとか...
まぁ、理由なんて何でも良くて...

無性に、バーコードの作り手側になりたくなった。
バーコードをお店の人に赤外線のリーダーで読んでもらうのでもなく、
「そろそろ俺も、バーコードを作る側に回るかな」的な。
携帯電話のアプリを作るきっかけになったらいいな、それも、ほとんど他所様、が作ったフリーのライブラリをごっそりまるごと使って、ガワだけ自作するという。そういうのを目指す。

前置きは以上。

pyBarcodeを使う。
公式では、
sudo pip install pyBarcode
がベストウェイらしい。
apt-getではだめらしい。


:~$ sudo pip install pyBarcode
The directory '/home/hogehoge/.cache/pip/http' or its parent directory is not owned by the current user and the cache has been disabled. Please check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
The directory '/home/hogehoge/.cache/pip' or its parent directory is not owned by the current user and caching wheels has been disabled. check the permissions and owner of that directory. If executing pip with sudo, you may want sudo's -H flag.
Collecting pyBarcode
Installing collected packages: pyBarcode
Successfully installed pyBarcode-0.7
べすとうぇーい!

:~$ python
import barcode
barcode.PROVIDED_BARCODES
CODE39 = barcode.get_barcode_class('code39')
yoshihara = CODE39(u'YOSHIHARA')
fullname = yoshihara.save('yoshihara1')

これだけで、SVGができた。
yoshihara.svg
ただし、”YOSHIHARAD”ってなる。
Dってなんだ?
末尾にスペース追加すると
yoshihara = CODE39(u'YOSHIHARA ')
fullname = yoshihara.save('yoshihara2')
”YOSHIHARA 8”ってなるし。

Wikipedia https://ja.wikipedia.org/wiki/CODE39
を適当に流し読みすると、スタート/ストップキャラクタか、チェックディジットの問題だと思う。
*は追加出来なかった。何かエラーが返ってくる。
チェックディジットが勝手に追加されているのではないか。
チェックサムとも言うらしい。
しょうがないから、usageから一歩踏み込んで、公式ドキュメントを読む。http://pythonhosted.org/pyBarcode/

(というか、今まで読んでいたのが、PyPIだった。https://pypi.python.org/pypi/pyBarcode/0.7
チェックサム(チェックディジット)をOFFする引数がちゃんと用意されていた。http://pythonhosted.org/pyBarcode/codes.html#code-39

yoshihara = CODE39(u'YOSHIHARA', add_checksum = False)
fullname = yoshihara.save("yoshihara3")
で無事に排出されました。

べすとうぇーい!!


下記の様に、書くと、バーコードのPNG画像が出力できると思ったんだけど...
import barcode
barcode.PROVIDED_BARCODES
CODE39 = barcode.get_barcode_class('code39')

from barcode.writer import ImageWriter
yoshihara = CODE39(u'http://naga-tsuzuki.sblo.jp/', add_checksum = False, writer=ImageWriter())fullname = yoshihara.save('yoshihara4')

URLは:が有るからダメな様です。こっちはQRコードに任せようか!
:無しで再チャレンジ。

import barcode
barcode.PROVIDED_BARCODES
CODE39 = barcode.get_barcode_class('code39')

from barcode.writer import ImageWriter
yoshihara = CODE39(u'yoshihara', add_checksum = False, writer=ImageWriter())fullname = yoshihara.save('yoshihara4')

yoshihara4.png


小文字で入力しても、大文字で出力されるよう。

まぁ、.pngで出力できるとはいえ、拡大縮小する都合上、svgが一番かと思った。
次は、QRコードでも出力してみようかな。
posted by yuchan at 07:00 | Comment(0) | python

20160620

新しいソフト

また作ってみた。

画像を読み込んで、一通り計算し終えたデータを表示。
どこかのパラメータいじったら、それに応じて再計算し、画像に反映。
↑ここをやった。

20160620screenshot26.png
rotationのradiobutton押したら、各チャネル毎に、回転が反映されるのはいいけど、フィルタ後のデータを、全て統一した向きにして再構成してくれない。だから、こんな絵になる。

あと、せっかくregionで範囲指定しているのに、いくら高域側のカットオフ周波数を指定しても、再計算後には、最大周波数(初期値)に戻ってる。低周波側は、最小周波数(初期値)に戻っている。

これら二つは、初回読み込むときと同じ関数を使いまわしているせい。回転は、ちゃんと再構成しなおした覚えはないし、初期値に戻る方は、doublespinboxに数字入力する命令なんか、初期値に設定したとき以外に出してないもん。

徐々に、直していく予定。
posted by yuchan at 07:00 | Comment(0) | python

20160613

Pyside の QFileDialog.getOpenFileName で手に入れたパスで、 QgraphicsViewに描画

かなり前に書いて忘れていた。

連続更新記録断絶を防ぐためのやつ。

内容は、正しくないかもしれない。


Pyside の QFileDialog.getOpenFileName で取得したパスで、 QgraphicsViewに画像を表示する手順。

断片的な情報なので注意。これ単体で動くわけじゃない。


QtDesignerでグラフを描くエリアを先に決めたかったが、どう描けばいいか分からなかった。

なので、Graphics Viewっていうそれっぽい適当なウィジットがあったので、それで埋めておいた。

pyside-uicで作ったpythonファイルを見てみると、QtGui.QGraphicsViewという名前のクラスだった。


google検索したり、Pysideのリファレンスとか見たりしていると、どうやらQGraphicsViewで、画像表示でるのでは?と思った。

OpenCVとかPyQtGraphとか使わずに済みそうだ。


結構、苦戦したので、メモしておく。


1 QtDesignerで、 QgraphicsViewを配置。

2 シグナルスロットを追加。

3 シグナルスロットの所で使う関数を追加。


#↓class Ui_MainWindow(object):のdef setupUi(self, MainWindow):以下に書いておく

        QtCore.QObject.connect(self.actionOpen, QtCore.SIGNAL("triggered()"), self.file_dialog)


#↓def setupUi(self, MainWindow):と同じ字下げで書く。上のシグナルスロットの所で、実行したい関数。

    def file_dialog(self):

        filters = "Image files (*.bmp *.jpg *.png *.tif);;Any files (*)"

        filename = QtGui.QFileDialog.getOpenFileName(filter=filters)#ファイルダイアログで、パスを取得。

        img_original=QtGui.QImage(filename[0])#手に入れたパスでQImageを作る。

        img = QtGui.QPixmap(img_original)#QImageをQPixmapにする。

        scene = QtGui.QGraphicsScene()#QPixmapをQGraphicsSceneに入れる。

        scene.addPixmap(img)#QGraphicsSceneに、QPixmapを入れる。

        self.graphicsView1.setScene(scene)# QgraphicsViewにQGraphicsSceneをセットする。→表示される。

posted by yuchan at 13:00 | Comment(0) | python

20160609

pythonでファイルを連番で保存したいときの桁合わせ。

pythonで

open("001.txt","w")

とかやって、連番でファイルを保存したいとき、テキストなら、

"%03.f"%(i)+".txt"

とか、画像なら

"%03.f"%(i)+".png"

とか書くとできた。

"%03.f"%(2)

って書くと、

002
って返してくれる。

こういう工夫がないと

2

とだけ返ってくる。
それで何が困るのかというと、名前でソートした時、

こうしたかったこう並んだ
11
210
311
42
53
64
75
86
97
108
119

ってなる。

20170102マークダウンで書き直した。

posted by yuchan at 13:06 | Comment(0) | python

20160608

QtDesignerでshortcut。

QtDesignerのアクションは、メニューバーに使うためだけのアクションなのかもしれない。
アクションって名前の響きが、ショートカットも設定できる便利機能みたいだったから、ちょっと勘違いしていた。

アプリケーションにショートカットキーを設定して、ショートカットでアプリケーションを操れるようにしたいなと思っていた。
ただ、アクションの使い方がよく分からなかった。

ショートカットを設定したアクションを作った→プレビューでそのショートカットが使える
って訳ではない様です。

メニューの中に入っているのもが、「アクション」な様です。
このメニューの中にはいっているものにしか、ショートカットを設定できない。

もしや、アクションって言ったら、メニューの中にはいっているものだけを指すのか。
...そのまさかでした。

埋め込み画像 1
まあ、それでもいいか。

どうやら、"visible"のチェックを外して、表示しないって方法もあるみたい。

埋め込み画像 2

visibleをオフにして、消えているシーンをスクショしたかったけど、スクショする前に、メニューのドロップダウンリストが一旦消えてしまうので、撮影できなかった。

これで、完全にキーボードで操ってる感を出せる。
単にメニューから選んでいるだけだけど。

メニューから選んでいる感じっていうのが嫌だなぁ。
ショートカットっていう性質と真逆なイメージなのよ。

自分の中で、「効率が悪いやり方」の代名詞が「メニューからマウスでクリック」で選ぶやり方。
ショートカットが、メニューのそれと同じ機能使っているなんてだなんて何か嫌だわぁ...


その気になれば、このショートカットだけでゲームも作れそう。
その気にならんが。
posted by yuchan at 07:39 | Comment(0) | python

20160607

1・subplotを使った4段のグラフ

import matplotlib.pyplot as plt
import numpy as np
import scipy.signal as sig

f1 = 10
f2 = 30
f3 = 90

samples = 1001

theta1 = np.linspace(0.0, f1*np.pi, samples)
theta2 = np.linspace(0.0, f2*np.pi, samples)
theta3 = np.linspace(0.0, f3*np.pi, samples)

taps = 31
lcf = 20
hcf = 40

x1 = np.linspace(0, 1, samples)
y1 = np.sin(theta1) + np.cos(theta2) + np.sin(theta3)

y2 = sig.firwin(taps, [lcf, hcf], pass_zero = False, nyq = 500.5)
x2 = np.linspace(0.0, 1.0/samples*len(y2),len(y2))

f,(ax1, ax2, ax3, ax4) = plt.subplots(4, 1, sharex = True)

ax1.plot(x1, y1)
ax2.plot(x2, y2)

plt.show()
figure_1-1.png
1段目で解析対象。
2段目でフィルタ右に動く。一マス動くごとに止まって、畳み込み和の要素を一つ一つ数えていく。
3段目に、ムービーでどんどん増えていく畳み込み和の要素。
4段目に、これまでの畳み込み和のプロットと、3段目の総和計算の増減に応じて、上昇(下降)する値。
とする予定。

また、subplotを横に別に用意して、LaTeXで目まぐるしく、式を動かす。


だけど、このままでは、
フィルタの
3段目の各項の一つ一つに着目できない。
着目できないなら、総和を動画で見せる意味もかなり薄れる。

あのΣの式を
「ここではかけ算してるよ」「ここでは足し算してるよ」
「立ち返ってΣの式を見たとき、どの部分がどの動作に対応しているか、納得できますな」
のレベルまで下げたい。


plt.plot(x2, y2)
plt.show()
figure_1.png
この、かくかく感がいい。
いかにも折れ線グラフですよ感。
この折れ線グラフを拡大したほうがいい。
tapの大きさが、プロットできる最大幅にしたほうがいい。
しかも、そのプロット一つ一つに、数字を割り振る。

ななめにかかる線に意味はないので、棒グラフの線版みたいな奴の方が、離散数字の計算には合っている気がするが、あの棒グラフ的なあれ、いきなり見せられても、ぽかーんとなるだけだから。

plt.plot(x2,y2,"ow")
plt.vlines(x2,[0],y2,lw=2)
plt.show()
これね、もう。。。
figure_1-2.png
たしかに、間には何の数字もないけどさぁ...良く分からないよそこまでこだわる理由が。

ちなみに、vlinesの他にhlinesもある。
Horizontal, verticalの違いだろう。
水平、垂直。
http://matplotlib.org/examples/pylab_examples/stem_plot.html
ちょっと違うけど、stemというのもあるらしい。

今日は、予定外に頑張れてしまった。
新しいグラフとかが、すんなり描けて、面白かったのだろうと思う。
明日は、ax3(グラフの3段目)に関して、ちょろっと考える程度でいいや。
posted by yuchan at 07:00 | Comment(0) | python

20160605

pysideで作ったウィンドウ上に、pyqtgraphのPlotWidgetを置いて、pyqtgraphで作ったregionを載せる。

Screenshot from 2016-06-05 23-12-48.png
数字を直接与えてやれば、動く状況にはなっている。
あとは、UIとの対応がメインの作業になるんだけど…。
これが結構な作業量になりそうだ。
一つ出来上がれば、後はコピペと置換って状況に持ち込みたい。

目玉の一つである、regionは、プログラムが面倒だけど、是非のせたい。
これがあるだけで、使い勝手や、とっつきやすさが全然違う。

pysideで作ったウィンドウ上に、pyqtgraphのPlotWidgetを載せた。
そのPlotWidget上で、スペクトルをプロットした。
そのプロットに重ねて、フィルタ後のスペクトルをプロットした。
さらに、そのスペクトルに重ねて、pyqtgraphのregionを載せた。

これが重要。

self.graphicsView_A = pg.PlotWidget(self.tab_A, background=[0,0,0,0])
self.region_A = pg.LinearRegionItem()
self.region_A.setZValue(10)
self.region_A.setBounds([np.log10(self.doubleSpinBox_LCF_A.value()), np.log10(self.doubleSpinBox_HCF_A.value())])
self.region_A.setRegion([np.log10(self.doubleSpinBox_LCF_A.value()), np.log10(self.doubleSpinBox_HCF_A.value())])
self.graphicsView_A.addItem(self.region_A)
ざっくりと、こんなかんじだけど、これ以外にもいろいろやっているから、上記を書くだけでは、絵の様にはならない。

20160606screenshot25.png
青くなっている部分が、region。
端の部分をドラッグすれば動くし、中央部分をドラッグすれば、幅を維持したまま動く。

setBoundで境界を指定すれば、それより外側には動かなくできる。
setRegionで値を設定すれば、その位置にregionが動いてくれる。
マウス使って動かすものに、わざわざコマンドが用意されている理由は、初期位置とかを細かく指定したい場合でしょう。
実際自分も使いました。

pyqtgraphのregionを操作している最中に、regionのエッジの値を得て、どこかに表示したいなら、
self.region_A.sigRegionChanged.connect(self.関数名)
とかすれば、カッコ内の関数を実行してくれる。
この関数の中に、UIのダブルスピンボックスに値をsetする命令でも書いておけば、regionを操作しながら、値が動くさまが見れる。

ただ、その関数の中には再計算のコマンドは入れてはいけない。
なぜならば、単純に時間がかかるから。
時間がかかる処理がしたいのであれば、動かし終わった後。
動かし終わった後にシグナルをエミットする事も出来る。
下記。
self.region_A.sigRegionChangeFinished.connect(self.関数)

二つ、シグナルをエミットするコマンドを書いた。
sigRegionChangeFinished(self)とsigRegionChanged(self)
両方共、カッコの中に、関数が入れられて実行できる。
関数名()のように、関数名の後にカッコはいらない。
要る場合もあるんだけど、ココではなぜか要らない。
理由は知らない。
posted by yuchan at 23:22 | Comment(0) | python

20160604

pyqtgraphのplotwidgetに一旦書いたplotの消し方

20160605screenshot23.png

二回、画像を開いたとき、スペクトルが二個表示されてしまう。
前にプロットしたものを、消したりしないのが原因。

開く前に、消した。
直った。

20160605screenshot24.png

self.graphicsView_A = pg.PlotWidget(self.tab_A, background=[0,0,0,0])
self.graphicsView_A.plot(x, y, pen=[250,0,0])
で書きっぱなしだったものを、
self.graphicsView_A.clear()
で、消した。
pyqtgraphの使い方のはなし。
posted by yuchan at 22:45 | Comment(0) | python

20160601

QRadioButton

20160531screenshot22.png
ラジオボタンのアクティブ、非アクティブ
ラジオボタンを非アクティブにするには、
self.radioButton_A.setEnabled(False)
逆に、非アクティブ→アクティブにするには
self.radioButton_A.setEnabled(True)
とかやる。
使ったから書いておく。

ラジオボタンのチェック状態
ラジオボタンの値をとるには、
isCheckedを使うと、bool型の変数で返してくれる。

boolだと、TrueかFalseで返ってくる。
文字列とかではない。""とか、''で囲う必要はない。
True、Falseで、pythonは分かってくれる。

if self.radioButton_A.isChecked() == True:
print("hogehoge")
else:
print("hagehage")
もできる。

QtDesigner上でプロパティを設定すれば、自動でやってくれる所だけど、後から手動でイジりたい人もいるだろうし。
もう、QtDesignerでの編集まで戻るのが面倒な位、改変した後で、こんな基本的な事を変更したくなることもるだろうし。
posted by yuchan at 07:00 | Comment(0) | python