ラベル Python の投稿を表示しています。 すべての投稿を表示
ラベル Python の投稿を表示しています。 すべての投稿を表示

2018/10/16

VSCodeでPythonをデバッグを実行した時に"Timeout waiting for debugger connection"とエラーが出たら

タイトル通りでVSCodeでPythonをデバッグしたら下記のようなエラーが出た。
デバッグ構成を色々変更しても、解決しないし、ターミナルにシェルが出てきたけど、Pythonプログラムが実行されていない。。。
解決方法としては、下記URLにあるように、
https://stackoverflow.com/questions/52462599/visual-studio-code-python-timeout-waiting-for-debugger-connection

Python Debug Consoleという構成を追加する。

{
     "name": "Python: Debug Console",
     "type": "python",
     "request": "launch",
     "program": "${file}",
     "console": "none"
}

とりあえずこれでできたが、これを毎回しないといけないのだろうか?

2018/04/11

Deep Learningのハリーポッター組分け帽子をLINE Botにしてみた

先日、Deep Learningを使ってハリーポッターの組分け帽子を作りました。

作ったはいいものの、利用するには環境を構築して、試さなければいけません。。。
ですので、作ったソフト"Sorting Deep Hat"をLINE Botにしてみました!

QRコードは下記です。
LINE Botで公開しているので、誰でも利用することができるのですが、
LINE Botのプランはフリーのものを使用しているため、送信数に限度があります。
よって、そのうち利用できなくなる可能性があります。
(MAXになってLINE Botが使えなくなったら、Twitter Botにでもしようかな。)

送信された画像は送り返すために一時ファイルとして保存していますが、
プログラム終了時に消えるようになっています。

また、デバッグ等を行っている時には正常に動作しない場合もありますので、その場合はご了承ください。

LINE Botの使い方

Botに画像を送信すると、すぐに結果を文字と画像で送信してくれるというものです。
文字を送信した場合には同じ文字をオウム返しで送り直してきます。
もしも、画像内に顔が見つからない場合には、「もっと大きく写る写真を使う」よう言われます。
顔認識にはOpenCVを用いていて、模様等をご認識することがよくあるので、顔が大きく写っている画像でないと認識しないよう厳し目にパラメータを設定しています。
大まかに画像の縦1/3程度は顔になるくらい顔が大きく写っているものを送信してください。

HerokuでWebサーバーを立てて、運用していますが、その中のプログラムはGithubで公開しています。

2018/04/03

Heroku, PythonでLine Botを作る

ここでは送信したメッセージをオウム返しするLine Botを作ります。
基本的に他のブログの引用ですが、体系的にまとめました。

Lineアカウント作成

Botを作るためには、下記の2アカウントを作る必要があります。
  • Line Business
  • Messasing API
ここは下記URLを参考に
https://qiita.com/yoshizaki_kkgk/items/bd4277d3943200beab26

Herokuアカウント作成

下記URLを参考に
https://j-hack.gitbooks.io/deploy-meteor-app-to-heroku/content/step1.html

Line Bot作成

基本的には下記URLと同じです。

しかし、この説明ではHeroku Gitのみを使用していますが、
ここではGithubとHerokuを連携させて使用します。

Githubレポジトリ作成・実装

まずは、Githubで連携したいレポジトリを新規作成します。
そのレポジトリ内に上記URLの「実装」章を参考にして、ファイルの追加・編集を行い、レポジトリにpushしてください。
tree
.
├── LICENSE
├── Procfile
├── README.md
├── main.py
└── requirements.txt

次にブラウザでHerokuのアカウントにログインをして、"Create new app"等を押して、アプリケーションを作成します。
設定画面の"Deploy"タブ内のDevelopment methodでGithubを選び、先ほど作成したレポジトリを設定します。

初期設定・デプロイ

まずは初期設定を行います。下記コマンドでHerokuにログインします。
参考にしているサイトではheroku createでアプリケーションを作成していますが、先ほどブラウザ上で作成しましたので不要です。
heroku login
次に同じようにLINEのアカウント設定を環境変数に追加する必要があるのですが、、、
  • LINE_CHANNEL_SECRET
  • LINE_CHANNEL_ACCESS_TOKEN
参考にしたサイトと同じようにconfig:setのコマンドを打ってもエラーになってしまいます。。。
これは、heroku createをCLIで行っていないため、config:setコマンドがどのHerokuアプリケーションを対象にしているのかわからないためだと思います。
よって、下記のように変更して実行します。
heroku config:set LINE_CHANNEL_SECRET="チャンネルシークレット" -app アプリケーション名
heroku config:set LINE_CHANNEL_ACCESS_TOKEN="アクセストークン" -app アプリケーション名
その後、ブラウザ上で手動でデプロイします。

最後に、同じようにLine DevelopperサイトのChannel基本設定画面で、Webhook URLを登録します。
ここで注意するのは、URLは下記のように最後に"callback"がつきます。
(自分はこれを追加しないで長い間悩んでしまいました。。。)
https://アプリケーション名.herokuapp.com/callback
これで自分のスマホでBotを友達にして、メッセージを投げるとオウム返しします。

2018/03/31

Bing Image Search APIでネット上の画像を集める

Deep Learningで画像を学習させるために、大量の画像が必要ですが、
それを1つ1つ手で保存していくととても時間がかかります。

ですので、ある言葉に関連のある(ググったら出てくる)画像を自動的に保存するプログラムを使います。

Bringだったり、GoogleだったりでAPIが提供されているのですが、
下記のURLを参考にして、"Bing Image Search API"を使うことにしました。
https://qiita.com/ysdyt/items/565a0bf3228e12a2c503

ちなみに、ユーザー登録してから1ヶ月程度はある上限まで無料で使えますが、
それ以降は有料です。
ですが、それほど高価な金額になるわけでもないですので、これを使っていきます。

Microsoft Azureのユーザー登録

Bring Image Search APIはMicrosoft Azureの一部の機能になっていますので、ユーザー登録が必要です。

登録は下記URLを参考に。ちなみにコードについてはAPIのVerが古いので、別のサイトを参考にしました。
https://qiita.com/ysdyt/items/49e99416079546b65dfc

使ってみる

下記URLを見て、コードをすべてコピペしたら動きました。
まずはやりたいことはこれでできます。
https://qiita.com/hirosemi/items/086f8375fd0f3fa5237b

Deep Learningでハリーポッターの組分け帽子を作りました

ホグワーツには"グリフィンドール"、"レイブンクロー"、"ハッフルパフ"、"スリザリン"という4つの寮があり、映画の作品を見てみると、顔だったり雰囲気だったりになんとなく違いがあると思います。
誰しも「自分はどの寮に入るのかな??」と思ったことがありますよね!

よって、任意の画像から顔を判別し、その人が4つの寮のどれに入るのかをDeep Learningで判断するソフト"Sorting Deep Hat"を作りました!

(調べたところ、全く同じ動機から、全く同じようなソフトを作った人がいらっしゃいますし、そちらのほうがわかりやすいかもしれません。このSorting Deep Hatもこの記事の影響を大きく受けています。)
https://qiita.com/tokkuman/items/aec887ff918fc164567e

ソースはGithubに公開しています。
https://github.com/naonaorange/sorting_deep_hat

動作環境

Deep Learingライブラリとしては、"Keras"を使っています。
  • Ubuntu 16.04 64bit
  • Python 3.6 64bit
  • Jupyter 4.4
  • Tensorflow 1.5
  • Keras 2.1.5
  • OpenCV 3.4

画像集め

映画内で各寮に入っているキャラクターの顔画像を集めます。
学習画像としては各寮100枚ずつの計400枚。
評価画像としては各寮20枚ずつの計80枚を準備しました。

データ集めはDeep Learingにおいて、一番重要で一番大変な作業なので、
他でも参考できるように別記事にします。

下の記事で簡単に説明しました。
「Bing Image Search APIでネット上の画像を集める」
http://kowaimononantenai.blogspot.jp/2018/03/bing-image-search-api.html


モデル作成

CNNで実装していきます。
最終的に全結合層で出力数を4にしています。
Deep Learingについて、始めたばかりなので、パラメータ等もっとよいものがあるのかもしれません。
from keras.models import Sequential
from keras.layers import Dense, Dropout, Flatten, Activation
from keras.layers import Conv2D, MaxPooling2D, ZeroPadding2D
from keras import optimizers
from keras.preprocessing.image import ImageDataGenerator
from keras.callbacks import EarlyStopping, CSVLogger
from keras import backend as K
import matplotlib.pyplot as plt
import numpy as np 


img_width = 100
img_height = 100
train_data_dir = 'data/train'
valid_data_dir = 'data/validation'

datagen = ImageDataGenerator(rescale = 1./255)

train_generator = datagen.flow_from_directory(directory=train_data_dir,
                                              target_size=(img_width,img_height),
                                              classes=['Glyffindor','Hufflpuff','Ravenclaw','Slytherin'],
                                              batch_size=16)

validation_generator = datagen.flow_from_directory(directory=valid_data_dir,
                                                   target_size=(img_width,img_height),
                                                   classes=['Glyffindor','Hufflpuff','Ravenclaw','Slytherin'],
                                                   batch_size=16)

model =Sequential()

model.add(Conv2D(32,(3,3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(32,(3,3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Conv2D(64,(3,3), input_shape=(img_width, img_height, 3)))
model.add(Activation('relu'))
model.add(MaxPooling2D(pool_size=(2,2)))

model.add(Flatten())
model.add(Dense(64))
model.add(Activation('relu'))
model.add(Dropout(0.5))
model.add(Dense(4))
model.add(Activation('softmax'))

model.summary()

model.compile(loss='categorical_crossentropy',optimizer='rmsprop',metrics=['accuracy'])

es = EarlyStopping(monitor='val_loss', patience=2)
training = model.fit_generator(generator=train_generator,
                               steps_per_epoch=400 // 16,
                               epochs=20,
                               validation_data=validation_generator,
                               validation_steps=80//16,
                               callbacks=[es])

model.save('models/sorting_deep_hat.h5')


精度確認

作ったモデルの精度を確認していきます。
最終的には、学習画像については約85%。評価画像については約73%の精度となっています。
まずはこの程度でしょうか。
引き続き精度向上のため変更していきます。

動作確認

任意の画像からOpenCVで顔画像を切り取り、作成したモデルで寮を判別します。
その結果に応じて、顔に矩形と寮名を描画します。
from keras.models import load_model
import cv2
import matplotlib.pyplot as plt
import numpy as np

model = load_model('models/sorting_deep_hat.h5')

image = cv2.imread('data/sample/harrypotter.jpg')

gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray, 1.1, 3)

for (x, y, w, h) in faces:
    face_image = image[y:y+h, x:x+w]
    face_image = cv2.resize(face_image, (100, 100))
    
    b,g,r = cv2.split(image)
    i = cv2.merge([r,g,b])
    i = cv2.resize(i,(100, 100))
    i = np.array([i / 255.])
    
    house = np.argmax(model.predict(i))
    if house == 0:
        house_name = 'Glyffindor'
        color = (0, 0, 255)
    elif house == 1:
        house_name = 'Hufflpuff'
        color = (0, 255, 255)
    elif house == 2:
        house_name = 'Ravenclaw'
        color = (255, 0, 0)
    elif house == 3:
        house_name = 'Slytherin'
        color = (0, 255, 0) 
    
    cv2.rectangle(image, (x, y), (x + w, y + h), color, 2)
    cv2.putText(image, house_name, (x, y), cv2.FONT_HERSHEY_PLAIN, 2, color, 4)
    
plt.imshow(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))
plt.show()

実際にハリーポッターの画像を入力してみると、こんな感じになりました。
きちんとハリーはグリフィンドールに判断されています。
マルフォイはスリザリン。

いろんな人を何枚か試しましたが、確かに間違えるときはありますが、それなりに判断しています。

いろんな人で試してみる

イチローはグリフィンドール。
確かに、勇気とか騎士道精神とかありそうですね。
トランプ大統領はレイブンクロー。
確かに、頭はいいからね!(スリザリンだと思ったのに。。。)
ジョブズはスリザリン。
ちょっと意外ですが、確かに「巧妙さ」とかはあるかなと、自伝を読んで感じました。


ガッキーはグリフィンドール。まあ、どの寮でもかわいいからOK!

参考サイト


2018/03/27

pyenvとpyenv-virtualenvのインストール

同一PCで複数のPythonのバージョンを使い分ける必要ができてしまったので、調べてみるとpyenvというものがあるそうです。
また、pyenv-virtualenvも使うと幸せになれるそうです。

簡単に説明すると、以下。
  • pyenv
同一PC内に複数のバージョンのPythonの共存させるソフト。
2系と3系とかのレベルではなく、3.5.2と3.6.4を共存させたりできる。
  • pyenv-virtualenv
pyenvを使いやすくするためのソフト。
virtualenvとは別物(かなりややこしい。ネットでは一緒のものとして誤って説明されていたりするのでググるときには要注意!!)
pyenvだけでも使えるが、pyenv-virtualenvを使うことで何が嬉しいかというと。。。

(以下、URLからの引用)
https://qiita.com/maskedw/items/aaa2fd7abfd493cf2820
pyenv-virtualenvはpyenvのプラグインです。pyenvでは複数のPythonバージョンをインストールできますが、各Pythonバージョンのモジュールを管理するsite-packagesというディレクトリは共通です。pyenv-virtualenvを使用すると同じPythonバージョンで別々のsite-packagesを管理することができます。
開発中のアプリーケーションで使用しているモジュールのバージョンを全て固定したり、必要最小限だけのモジュールをインストールしたりすることによって、開発環境と実行環境の違いを最小限にすることができます。



pyenvのインストール

基本的にGithubのREADMEと同じです。
https://github.com/pyenv/pyenv
gitから持ってきます(pipでインストールできればいいのに。。。)
git clone https://github.com/pyenv/pyenv.git ~/.pyenv
次に、設定をしていきます。
echo 'export PYENV_ROOT="$HOME/.pyenv"' >> ~/.bashrc
echo 'export PATH="$PYENV_ROOT/bin:$PATH"' >> ~/.bashrc
echo -e 'if command -v pyenv 1>/dev/null 2>&1; then\n  eval "$(pyenv init -)"\nfi' >> ~/.bashrc
pyenvコマンドを実行して使えるかどうかを確認してください。

pyenv-virtualenvのインストール

こちらもGithubの説明と同様です。
https://github.com/pyenv/pyenv-virtualenv
git clone https://github.com/pyenv/pyenv-virtualenv.git ~/.pyenv/plugins/pyenv-virtualenv
echo 'eval "$(pyenv virtualenv-init -)"' >> ~/.bash_profile

使い方

#Pythonのコンパイルに必要なライブラリ軍をまずはインストール
sudo apt-get install git gcc make openssl libssl-dev libbz2-dev libreadline-dev libsqlite3-dev

#pyenvでインストールできるバージョンの確認
pyenv install --list
#使用するバージョンのPythonをコンパイル
pyenv install 3.6.4

#仮想環境を作成
#ENV_NAMEは仮想環境の名前を入れます
pyenv virtualenv 3.6.4 ENV_NAME

#現在ある仮想環境を確認
pyenv virtualenvs

#仮想環境の有効化、無効化
pyenv activate ENV_NAME
pyenv deactivate

#仮想環境の削除
pyenv uninstall ENV_NAME

参考にしたサイト

https://qiita.com/akito1986/items/be5dcd1a502aaf22010b

2018/03/23

Jupyter Notebookを起動するとAttributeError: type object 'IOLoop' has no attribute 'initialized'とエラーが出る

Jupyterをインストール後、Jupyter Notebookを起動すると、下記のようなエラーが出てしまいます。

AttributeError: type object 'IOLoop' has no attribute 'initialized'

GitHubにはissueがすでに上がっているそうで、
https://github.com/ipython/ipython/issues/8374

下記コマンドを実行して、tornadoというソフトをダウングレードすることで、一時的に回避できるそうです。
pip3 uninstall tornado
pip3 install tornado==4.5.3

2018/03/21

Tensorflowが"Illegal instruction (コアダンプ)"で動かない

Tensorflowをインストールして実行しようとしたところ、エラーで動かなくなってしまいました。
Python 3.5.2 (default, Nov 23 2017, 16:37:01) 
[GCC 5.4.0 20160609] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import tensorflow as tf
Illegal instruction (コアダンプ)
環境は下記です。
  • Tensorflow 1.6
  • Python 3.5
原因はよくわかっていませんが、一応TensorflowのVerを1.5にすることでエラーが出なくなりました。
(Ver 1.5.1では同様のエラーが出てしまいました。)
とりあえずはこれでやっていきます。
pip uninstall tensorflow tensorflow-tensorboard
pip install tensorflow==1.5

2014/03/02

Windows環境でPythonのnumpyやscipyを使えるようにする

タイトル通り、Pythonのnumpyやscipyを使えるようにします。

環境はPython2.6です。
今回3通りのインストール方法を試したのですが、
結局、インストーラーをダウンロードしてインストールしました。

まずは、成功したインストール方法から説明します。

numpyは次のURLからOSやPythonのバージョンにあったインストーラーをダウンロードします。
Numerical Python - Browse /NumPy at SourceForge.net
http://sourceforge.net/projects/numpy/files/NumPy/
あとはダブルクリックでインストールするだけです。

scipyの場合はこちらのURLで、
SciPy: Scientific Library for Python - Browse /scipy at SourceForge.net
http://sourceforge.net/projects/scipy/files/scipy/



次に失敗した方法を書いていきます。

pipを利用してインストールする方法

次のコマンドを打って、インストールしようとしたのですが、結果的にはできませんでした。
pip install numpy

エラー内容は次のようなものでした。

Command python setup.py egg_info failed with error code 1 in c:\users\○○○○\appdata\local\temp\pip_build_nao\numpy
Storing debug log for failure in C:\Users\○○○○\pip\pip.log

ググると、「pipのバグだ」だったり、「MinGWをインストールして使うといい」というような解決方法があるようでしたが、

python - pip fails to install numpy error code 1 - Stack Overflow
http://stackoverflow.com/questions/19027324/pip-fails-to-install-numpy-error-code-1

windows + virtualenv + pip + numpy (problems when installing numpy) - Stack Overflow
http://stackoverflow.com/questions/6114115/windows-virtualenv-pip-numpy-problems-when-installing-numpy


めんどくさかったので、インストーラーの方法に乗り換えてしまいました。

WindowsでPythonの"easy_install"や"pip"を使えるようにする

Pythonを使っていると、必要になるのは"easy_install"や"pip"です。

これらのインストール方法をメモしておきます。

pipはeasy_installを使って入れるので、まずはeasy_installを入れます。


下のURLから"ez_setup.py"をダウンロードしてきます。
setuptools 2.2 : Python Package Index
https://pypi.python.org/pypi/setuptools#windows

 あとはこれをダブルクリックしてインストールします。

そのようにすると
 C:\Python○○\Scripts
に"easy_install.exe"などができていると思います。


次に、環境変数を編集してコマンドプロンプトからeasy_installコマンドを打てるようにします。

環境変数のPATHに
C:\Python○○\Scripts
を追加します。


これでコマンドプロンプトからeasy_installコマンドが打てるようになりました。


次にpipをインストールします。
これも簡単です。

コマンドプロンプトで、
easy_install pip
を実行するだけです。

2013/12/05

Cygwinでゴミ箱を利用するために"trash-cli"をインストールする

Ubuntuではrmの代わりに,trash-cliをapt-getでインストールして使っているので,
Cygwinでも利用できるようにしました.

ちなみにこれはapt-cygとpipを使ってインストールします.

apt-cygが入っていることが前提なので入っていない場合は下の記事などを参考にして入れてください.
○○○○に怖いものなんてない!!: Cygwinにapt-cygを導入する
http://kowaimononantenai.blogspot.jp/2013/12/cygwinapt-cyg.html

まず,apt-cgyでpythonとpython-setuptoolsをインストールします.
python-setuptoolsはpythonでソフトウェアをインストールするときに使うものです.
apt-cyg install python
apt-cyg install python-setuptools

python-setuptoolsをインストールすると"easy_install"コマンドが使えるようになるので,次はpipをインストールします.
pipはsetuptooleよりも簡単にソフトをインストールできるようにするものです.
easy_install pip

これでpipが使えるようになったのでいよいよtrash_cliをインストールします.
pip install trash-cli

これで"trash-put"コマンドなどが使えるようになりました.


参考にしたサイト
rm が消しすぎるので、rm の替わりにゴミ箱に放り込むコマンドが欲しい. - それマグで!
http://takuya-1st.hatenablog.jp/entry/20110726/1311655677
Pythonで一番最初に入れるべきパッケージ setuptools と pip - Life with Python
http://www.lifewithpython.com/2012/11/Python-package-setuptools-pip.html

2013/10/27

OpenCVでfillConvexPolyを使って四角形や多角形を描画する

OpeCVの2.xのお話ですが,

OpenCVで任意の四角形や多角形を描画するときにはポリゴンを使って頂点をつなげて描画するみたいです.

初めは下記ので書かれている
cv::fillPoly
を使って書こうと思ったのですが,

描画処理 — OpenCV-CookBook
http://opencv.jp/cookbook/opencv_drawing.html

下記のサイトのfillPolyを見てみると,引数は次のように書かれています.
描画関数 — opencv v2.1 documentation
http://opencv.jp/opencv-2.1/cpp/drawing_functions.html

void fillPoly(Mat& img, const Point** pts, const int* npts, int ncontours, const Scalar& color, int lineType=8, int shift=0, Point offset=Point())

特に2個目の"Point**"とか渡さないといけなくて,なんか変だなと思っていました.

そしてなんとなく上の方を見てみると"fillConvexPoly"というのを見つけました.

void fillConvexPoly(Mat& img, const Point* pts, int npts, const Scalar& color, int lineType=8, int shift=0)

これだとPoint*を渡せばいいのでわかりやすいです.
また,「fillPolyよりも高速で動作する」とも書いています.
勝手に塗りつぶされるのがたまにキズですが,今回は塗りつぶされてもいいのでこれを使います.

"fillConvexPoly"を使ったサンプルプログラムを探したのですが,見つからなかったので,
自分で書きます.

/*****************************************************
    C++  のプログラム(Python版は下に書きます)
******************************************************/

次にプログラムを載せますが,
カメラで画像を取得して適当な4つの点を結ぶ四角形を描画します.
下のは四角形ですが,配列を増やせば多角形もいけます.


#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

int main(int argc, char *argv[])
{
  cv::VideoCapture cap(0);
  cap.set(CV_CAP_PROP_FRAME_WIDTH, 640);
  cap.set(CV_CAP_PROP_FRAME_HEIGHT, 480);
  
  // カメラがオープンできたかの確認
  if(!cap.isOpened()) return -1;
  cv::namedWindow("Capture", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);

  while(1) {
    cv::Mat frame;
    cap >> frame;


    cv::Point pt[4]; //任意の4点を配列に入れる
    pt[0] = cv::Point(100, 100);
    pt[1] = cv::Point(150, 200);
    pt[2] = cv::Point(300, 300);
    pt[3] = cv::Point(400, 100);

    //描画 引数は (画像, 点の配列, 点の数, 色)
    cv::fillConvexPoly( frame, pt, 4, cv::Scalar(0,0,200) ); 
    
    cv::imshow("Capture", frame);
 
    if(cv::waitKey(30) >= 0){
      break;
    }
  }
}


実行結果はこのようになります.




#####################################
#   2015年1月18日 追記
#   コメントでPythonの方のプログラムのリクエストがあったので書きます。
#   Python のプログラム
#####################################
Ubuntu14.04
Python 2.7.6 , python-opencv 2.4.8
で確認しました。

引数などを確認すると
Drawing Functions — OpenCV 2.4.9.0 documentation
http://docs.opencv.org/modules/core/doc/drawing_functions.html#void%20fillPoly(Mat&%20img,%20const%20Point**%20pts,%20const%20int*%20npts,%20int%20ncontours,%20const%20Scalar&%20color,%20int%20lineType,%20int%20shift,%20Point%20offset)

cv2.fillConvexPoly(img, points, color[, lineType[, shift]])

となっています。
同じようにカメラ画像から取得した画像にfillConvexPolyで多角形を描画します。

#!/usr/bin/env python
# -*- coding: utf-8 -*-

import cv2
import numpy as np

def main():
    cap = cv2.VideoCapture(0)

    while(True):
        #カメラのキャプチャからフレームを取得する
        ret, frame = cap.read()
        #多角形を記述
        contours = np.array( [ [100,100], [100,230], [230, 250], [150,70] ] )
        #fillConvexPolyで多角形を描画
        cv2.fillConvexPoly(frame, points =contours, color=(0,0,255))

        cv2.imshow('Camera Capture', frame)

        #何かキーを押したら終了
        if cv2.waitKey(10) > 0:
            cap.release()
            cv2.destroyAllWindows()
            break

if __name__ == '__main__':
    main()

実行するとこのようになります。
これでおkです。






2013/10/03

Windows7 64bitでIPythonを使う

最近になってやっとIPythonというPythonの中でも便利なものを見つけました.
よって,WindowsにIPythonをインストールします.

公式に行くとこのようなインストール方法を進められますが,
Installing IPython — IPython
http://ipython.org/install.html

自分はこちらでやりました.

pip と ipython インストール手引き (Windows編) - secretbase.log
http://cointoss.hatenablog.com/entry/20120531/1338474875

こちらの方がpipで入るし,簡単ですね.

2012/04/30

Amazon Product Advertising API を使ってみる

ある事情で,amazonで検索した書籍の情報をcsvファイルにできるようなプログラムを作ってexcelで開きたい.

探してみるとProduct Advertising APIなるものがあるらしい.

さっそくこのサイトを参考にTry.
http://www.ajaxtower.jp/ecs/

ありがたいことにかなりわかりやすく親切に書いてくれているが,登録がかなりめんどくさい.amazonアフリエイトの方も登録が必要なので色々書く所がある.

何とか終わり, RESTの利用方法-> リクエストの作成のところでサンプルをやってみると
<?xml version="1.0"?>
<ItemSearchErrorResponse xmlns="http://ecs.amazonaws.com/doc/2009-07-01/"><Error><Code>MissingParameter</Code><Message>The request must contain the parameter Signature.</Message></Error><RequestId>b2e7e58c-81a1-4590-8a01-3fce9a946762</RequestId></ItemSearchErrorResponse>
 となって説明通りにいかない.


とりあえず,参考にしたサイトのamadocで確認したところ
きちんとできているみたいなので登録などはしっかりできている模様.

ってことでまあいいかと思い.

色々面白いことを書いてくれている下のブログに関連することがあったのでやってみる.

しかし,ここでも
UnicodeDecodeError: 'ascii' codec can't decode byte 0xe3 in position 0: ordinal not in range(128)
というエラーで実行できない.
まあコレは文字のコードでのエラーみたいなのでProduct Advertising APIは直接は関係ないが,



色々調べてみると,Product Advertising APIはちょくちょく仕様を変えているらしく(前は別の名前だったらしい),2011-08-01に新しいバージョンが出て,しかも,それ以外のバージョンは2012年2月7日から使えないらしい(過ぎたばっかじゃん).
しかも,バージョンを追っていく限りだんだんめんどくさくなってきている.

1個前のバージョンに対応した情報はいろいろあるが,最新バージョンとの決定的な違いは
"AssociateTag(登録するときにあった○○○-22っていうやつ)"が必須になったという事

まあ他にも使いにくくなっているところはいろいろあるが,詳しくは下のサイトに

ということでブロクなどの情報は2011年以降に書かれたものを中心に調べてみる.

すると,こんな記事を発見.


"bottlenose"というものがあるらしい.
しかも嬉しいことにpythonで書ける.

次は"bottlenose"についての記事を書く予定.

2012/01/11

またsleep関数でちょっと待つ

今度はpythonでsleep関数を使う。
import time
  time.sleep(t[s]) 
pythonでまでsleep関数を使いたくないが、まあ一時的にということで

ここを参考に
http://d.hatena.ne.jp/Michael_e29/20110127/1296090610


2011/12/26

pythonを日本語(utf-8)対応にするには

pythonでprintなどのなかに日本語をいれたい時そのまま入れてしまうと
UnicodeEncodeError: 'ascii' codec can't encode characters in position 0-7
というようなエラーが出てしまう。これは文字コードがutf-8ではなくasciiになっているため。

参考にしたサイト
http://zensan.blogzine.jp/blog/2010/01/sitecustomizepy.html

http://d.hatena.ne.jp/SumiTomohiko/20070120/1169300624

http://d.hatena.ne.jp/motie/20090615/sitecustomize20090615

しかし、ちょっと書いてあることとは違った。(ubuntu10.04使用)

/usr/lib/python2.6の中にsitecustomize.pyが直接、またデフォの状態でもうあった。

よってバックアップをして退避させてsitecustomize.pyを次のように編集


(ただコピペをしただけなのでインデントに注意!!)


# install the apport exception handler if available
try:
  import apport_python_hook
  except ImportError:
  pass
else:
  apport_python_hook.install()

      ↓↓↓

# install the apport exception handler if available
try:
  import apport_python_hook
  import sys
  sys.setdefaultencoding('utf-8')
except ImportError:
  print('ImportError')
else:
  apport_python_hook.install()


確認のため

$ python
Python 2.6.5
[GCC 4.4.3] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import sys
>>> print sys.getdefaultencoding()
utf-8

きちんとutd-8になってるからおk

2011/12/25

列挙型 enum


列挙型について各言語の違い

●c++
enumあり.列挙型のイメージのとおり使えると思う.構造体みたいな感じ.
http://ja.wikipedia.org/wiki/%E5%88%97%E6%8C%99%E5%9E%8B


●java
enumあり.使い方は全くc++と同じかな
上のURLにjavaのもかいてある


●python
なんか他のと同じような型が組み込みであると思ったけど調べてみるとない...
タプル型と混同していたのかな.

でもenumというのはあったが,AppleEvent オブジェクトがpython3.xから無くなってしまうらしいので使わないほうがいいし,覚えないほうがいいかも.
http://www.python.jp/doc/release/library/aetypes.html#aetypes.Enum

またemurateというものもあったが,ちょっと他のとはイメージが違う.ネットではfor文で回すのが多かった.
http://www.python.jp/doc/release/library/fm.html#fm.enumerate


今回ちょっと調べてみて1番よかったことはwikiで"列挙型"などの言葉を検索すると各言語の違いなども出てくるということだ.
暇なときにでも思いついたヤツを見てみるといいかも(pythonがないのは悲しいがしょうがない)

c++とjavaの違いはいろいろなサイトでも扱っているので情報が多いね
http://ja.wikipedia.org/wiki/Java%E3%81%A8C%2B%2B%E3%81%AE%E6%AF%94%E8%BC%83

http://www.nurs.or.jp/~sug/soft/java/java15.htm

デフォルト引数とオーバーロード


ふと,デフォルト引数をつかってオーバーロードを使ったらかなりめんどくさくなんないか?と思った.

ではここで各言語のデフォルト引数とオーバーロードについてのまとめ

●c++
デフォルト引数,オーバーロード両方あり

よって,このような問題が起こる(関数のデフォルト引数とあいまいさの問題のところ)
http://www.geocities.jp/pcinfo_hp/Cplus2.html

デフォルト引数は使わずオーバーロードを使って行ったほうがいい


●java
デフォルト引数なし.オーバーロードはあり.

これは問題が起こらないがデフォルト引数がないということを覚えておかなくては

さすがめんどくさいが誤解をうまないjava


●python
デフォルト引数はあるが,オーバーロードはなし.

しかし,デフォルト引数でオーバーロードのようなことができる.
http://works.surgo.jp/translation/pyguide.html

まあオーバーロードはないのできちんと見ればわかるかな


ってことで三者三様.やはり,c++が1ばんやっかいだね


じゃあちょっと使っているjythonはどうなっているのだろうか?
たぶん構成はjavaっぽいのでjavaのようになるのだろう