FrontPage

2013/01/12からのアクセス回数 1719

ここで紹介したSageワークシートは、以下のURLからダウンロードできます。

http://www15191ue.sakura.ne.jp:8000/home/pub/25/

また、Sageのサーバを公開しているサイト(http://www.sagenb.org/, http://www15191ue.sakura.ne.jp:8000/)にユーザIDを作成することで、ダウンロードしたワークシートを アップロードし、実行したり、変更していろいろ動きを試すことができます。

SageでOpenCVを使ってみよう

OpenCV 2.2以降はpythonとのインタフェースが提供されているので、これを使って SageからOpenCVを使ってみます。

OpenCVを使う準備

通常importするものはcvだけで良いのですが、ipl2npでcv2の関数を使っているので、 cv, cv2をimportします。

また、numpyは、npとしてimportして使用します。

sageへの入力:

import cv, cv2
import numpy as np
# cvに未定義の値を設定
CV_LOAD_IMAGE_ANYDEPTH = 2
CV_LOAD_IMAGE_ANYCOLOR = 4

IplImageからRGBのnumpy arrayに変換関数ipl2np

SageでOpenCVのマトリックスを表示するには、IplImageからRGBの numpy arrayに変換する必要があります。

ipl2np関数を以下のように定義します。

sageへの入力:

# 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.

顔検出

OpenCVと言えば「顔検出」ということで、 OpenCVで顔検出 を参考にしながら、SageでLenaの顔の枠を表示してみましょう。

この例では、OpenCVをCから使用する1.0のインタフェースを使用しています。 「詳解OpenCV」も1.0のインタフェースを使用しているので本と照らし合わせながら試すには 1.0の方がよいと思います。

ほとんどコメントの通りですが、以下の処理を行っています。

  • 検出対象の画像ファイルパス
  • 顔検出対象の画像データの読み込み
  • カスケードのファイルパスセット
  • カスケードのロード
  • 検出に必要なメモリストレージを用意する
  • 高速に顔認識するように引数を調整して、HaarDetectObjectsを呼び出す
  • 検出したオブジェクトのリストをセット

facesの戻り値は、((x, y, width, height), 何かの値)のような形式で返されるので、 ここでは、「何かの値」をdummyとして処理しています。

sageへの入力:

# 検出対象の画像ファイルパス
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の出力:

[((217, 203, 169, 169), 24)]

検出された顔の位置を矩形で表示

検出された顔の位置をOpenCVのRectangleを使って矩形で表示します。

sageへの入力:

# 検出情報から顔の位置情報を取得し、矩形を描画する
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で画像と検出されたかおの位置を表示

ipl2np関数を使ってnumpyの配列に変換し、matrix_plot関数を使って画像を表示します。

sageへの入力:

# 検出した顔の矩形を合わせて表示
matrix_plot(ipl2np(tarImg)).show( axes=True, frame=True, figsize=4, aspect_ratio=1)

sageの出力:

sage0.png

pythonインタフェースではリソースの解放関数がない

Cの場合には、メモリストレージやイメージを解放しますが、pythonインタフェースにはこれらを解放する 関数が見当たりません。

コメント

選択肢 投票
おもしろかった 1  
そうでもない 0  
わかりずらい 0  

皆様のご意見、ご希望をお待ちしております。


(Input image string)


添付ファイル: filesage0.png 399件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2016-04-25 (月) 15:12:50 (369d)
SmartDoc