- 追加された行はこの色です。
- 削除された行はこの色です。
[[FrontPage]]
#contents
2013/01/12からのアクセス回数 &counter;
ここで紹介したSageワークシートは、以下のURLからダウンロードできます。
http://www15191ue.sakura.ne.jp:8000/home/pub/20/
http://www15191ue.sakura.ne.jp:8000/home/pub/25/
また、Sageのサーバを公開しているサイト(http://www.sagenb.org/, http://www15191ue.sakura.ne.jp:8000/)にユーザIDを作成することで、ダウンロードしたワークシートを
アップロードし、実行したり、変更していろいろ動きを試すことができます。
* SageでOpenCVを使ってみよう [#p1a55454]
OpenCV 2.2以降はpythonとのインタフェースが提供されているので、これを使って
SageからOpenCVを使ってみます。
** OpenCVを使う準備 [#e195efa9]
通常importするものはcvだけで良いのですが、ipl2npでcv2の関数を使っているので、
cv, cv2をimportします。
また、numpyは、npとしてimportして使用します。
sageへの入力:
#pre{{
import cv, cv2
import numpy as np
# cvに未定義の値を設定
CV_LOAD_IMAGE_ANYDEPTH = 2
CV_LOAD_IMAGE_ANYCOLOR = 4
}}
*** IplImageからRGBのnumpy arrayに変換関数ipl2np [#aa001c7c]
SageでOpenCVのマトリックスを表示するには、IplImageからRGBの
numpy arrayに変換する必要があります。
ipl2np関数を以下のように定義します。
sageへの入力:
#pre{{
# cvのIplImageからRGBのnumpy arrayに変換する
def ipl2np(ipl):
mat = cv.GetMat(ipl)
bgrimage = np.asarray(mat)
rgbimage = cv2.cvtColor(bgrimage, cv2.COLOR_BGR2RGB)
return rgbimage/255.
}}
** 顔検出 [#da73515f]
OpenCVと言えば「顔検出」ということで、
[[OpenCVで顔検出>http://www.aianet.ne.jp/~asada/prog_doc/opencv/opencv_obj_det_img.htm]]
を参考にしながら、SageでLenaの顔の枠を表示してみましょう。
この例では、OpenCVをCから使用する1.0のインタフェースを使用しています。
「詳解OpenCV」も1.0のインタフェースを使用しているので本と照らし合わせながら試すには
1.0の方がよいと思います。
ほとんどコメントの通りですが、以下の処理を行っています。
- 検出対象の画像ファイルパス
- 顔検出対象の画像データの読み込み
- カスケードのファイルパスセット
- カスケードのロード
- 検出に必要なメモリストレージを用意する
- 高速に顔認識するように引数を調整して、HaarDetectObjectsを呼び出す
- 検出したオブジェクトのリストをセット
facesの戻り値は、((x, y, width, height), 何かの値)のような形式で返されるので、
ここでは、「何かの値」をdummyとして処理しています。
sageへの入力:
#pre{{
# 検出対象の画像ファイルパス
tarFilePath = DATA + 'lena.jpg'
# 顔検出対象の画像データの読み込み
tarImg = cv.LoadImage(tarFilePath, CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR)
# カスケードのファイルパスセット
cascadeFilePath = DATA + 'haarcascade_frontalface_alt.xml'
# カスケードのロード
cvHCC = cv.Load(cascadeFilePath)
# 検出に必要なメモリストレージを用意する
cvMStr = cv.CreateMemStorage(0)
# 高速に顔認識するように引数を調整して、HaarDetectObjectsを呼び出す
faces = cv.HaarDetectObjects(tarImg, cvHCC, cvMStr, 1.2, 2, cv.CV_HAAR_DO_CANNY_PRUNING)
# 戻り値がOpenCVと違うみたいなので、プリントしてみる
faces
}}
sageの出力:
#pre{{
[((217, 203, 169, 169), 24)]
}}
*** 検出された顔の位置を矩形で表示 [#j243e414]
検出された顔の位置をOpenCVのRectangleを使って矩形で表示します。
sageへの入力:
#pre{{
# 検出情報から顔の位置情報を取得し、矩形を描画する
for (x, y, width, height), dummy in faces:
cv.Rectangle(tarImg, (x, y), (x + width, y + height), cv.CV_RGB(255, 0, 0), 2, cv.CV_AA, 0)
}}
*** Sageで画像と検出されたかおの位置を表示 [#b8caad0a]
ipl2np関数を使ってnumpyの配列に変換し、matrix_plot関数を使って画像を表示します。
sageへの入力:
#pre{{
# 検出した顔の矩形を合わせて表示
matrix_plot(ipl2np(tarImg)).show( axes=True, frame=True, figsize=4, aspect_ratio=1)
}}
sageの出力:
&ref(sage.png);
&ref(sage0.png);
*** pythonインタフェースではリソースの解放関数がない [#a5adf897]
Cの場合には、メモリストレージやイメージを解放しますが、pythonインタフェースにはこれらを解放する
関数が見当たりません。
** コメント [#k172cf4e]
#vote(おもしろかった,そうでもない,わかりずらい)
#vote(おもしろかった[1],そうでもない[0],わかりずらい[0])
皆様のご意見、ご希望をお待ちしております。
#comment_kcaptcha