PythonでOpenCV オプティカルフロー編



半年ぐらい棚ざらしにしてあったのですが、ちょっと時間があったのでいじることに。(でも、最終成果物が出来るのは、さらに一年後ぐらい、かなぁ?orz)

<<追記>>
こちらの記事に続く

とりあえずcvCalcOpticalFlowBM関数のサンプルコードが動くようになったので無くさないようにblog保存。

ググる:オプティカルフローとは

ビデオカメラ、YouTubeやニコニコ動画などのFLVデータ、などなど
地デジが映るのもオプティカルフローのおかげ。

以下はコンピューターのプログラム&チラシの裏。

最終的に作ろうと思ってるものに一番近いのがコレ

既に有るんやから作らなくても。。。と言いたいところですが、いろんな都合もあって、自分でもチャレンジしてみることに。

っていうか、そう思ったのが去年の頭だから、とりかかるまでに時間かかりすぎですが(自分)

(実は、Pythonでは、オプティカルフローの量を検出するところまでは書けても、それを再利用する部分のライブラリが無い。 Distortionマッピングとか、 Displaceマッピングと呼ばれる機能はFlashにも有るので、将来、PILなどにも実装されると嬉しいなぁ。Cで書かれたライブラリを探したけど見つからず。なので、一部、GIMPの機能を使うことに)

次は、これをGIMPプラグイン用に書き直さないと (の前にGIMPをアンインストールしたので、もう一度入れなおさないと。。。)

プログラム言語という魔法の呪文

ちょっと休憩。

私自身も、使ってないプログラム言語はサッパリサッパリで魔法の呪文に見えます。
(とくに人の書いたプログラムコードは「進んだ科学は魔法と見分けがつかない」ってのを、実感したりするわけですけれども)

だから、判らないもの=魔法、的な視線をなげかけるのは(私も含めて)しょうがないことではあるのですけれども

ただ、魔法との一番の違いって。。。

  • 杖を一振りして呪文となえるだけ、ってわけにはいかないよなぁとか。
  • そのかわり、手順を公開して、ステップ・バイ・ステップで行えば、ある程度、再現性があるよね、という
    (イチローとか、卓球の愛ちゃんみたく、特殊な技能、才能を必要とすることもありますけれども。)

文明とか、科学技術ってのは、そういう意味で(文字通り、魔法をタネあかしすると、手品になってしまう、というのと同じ文脈で) 『知の特権性』を奪ってしまう部分があるのかなぁ、と。

(いいか悪いかは別として、コンピューターの根本的な原理を知らなくてもプログラムは書ける。また、誰でも出来るようになると陳腐化してしまう。)

それをつまらない、と思うか、誰でも(特に自分に)出来るようになるのはすばらしい、と思うかは人それぞれ、だとは思うのですが。

使ってるモジュールはswig版です。

import opencv
from opencv import cvCalcOpticalFlowBM, cvSize,
                           cvPoint,cvLine,cvScalar,cvCreateMat,cvSetZero,
                           CV_32FC1,cvGetReal2D,CV_RGB,CV_AA

import opencv.highgui as highgui
from opencv.highgui import cvLoadImage,cvNamedWindow,
                           cvLoadImageM,cvShowImage,
                           CV_LOAD_IMAGE_GRAYSCALE,CV_LOAD_IMAGE_COLOR

import math
from math import ceil
import Image

"""
cvCalcOpticalFlowBM(CvArr prev, CvArr curr, CvSize block_size, CvSize shift_size,
   CvSize max_range, int use_previous,
   CvArr velx, CvArr vely)
"""
fnames=["01.png","02.png","03.png","04.png"]
img1=cvLoadImage (fnames[0],CV_LOAD_IMAGE_GRAYSCALE)
img2=cvLoadImage (fnames[1],CV_LOAD_IMAGE_GRAYSCALE)
dst_img = cvLoadImage (fnames[1], CV_LOAD_IMAGE_COLOR)

block_size = 10;
shift_size = 1;
rows = int (ceil (img1.height / float(block_size)))
cols = int (ceil (img1.width/ float(block_size)))
velx = cvCreateMat (rows, cols, CV_32FC1)
vely = cvCreateMat (rows, cols, CV_32FC1)
cvSetZero (velx)
cvSetZero (vely)

blocksize = cvSize (block_size ,block_size )
shiftsize = cvSize (shift_size,shift_size)
max_range = cvSize (50, 50);
cvNamedWindow("opencv_test")
cvShowImage("opencv_test",dst_img)

cvCalcOpticalFlowBM (img1, img2, blocksize, shiftsize,
                      max_range,0,velx,vely)

# (3)計算されたフローを描画
for  i in xrange(velx.width):
   for  j  in xrange (vely.height) :
     dx = int(cvGetReal2D (velx, j, i))
     dy = int(cvGetReal2D (vely, j, i))
     cvLine (dst_img, cvPoint (i * block_size, j * block_size),
             cvPoint (i * block_size + dx, j * block_size + dy), CV_RGB (255, 0, 0), 1, CV_AA, 0);

cvShowImage("opencv_test",dst_img)
Tags: , ,

Related posts

タグ: , ,

コメントは受け付けていません。