GIMP+Python オプティカルフローであそぶ その2 CVtypes編

[pukiwiki]
GIMP2.4用のプラグインとして動かしてみました。
できたところまでメモ。
二つのレイヤーに ピーマンを少し動かした状態で描く。

http://boxheadroom.com/wp/wp-content/uploads/2008/03/p1.jpg
http://boxheadroom.com/wp/wp-content/uploads/2008/03/p2.jpg

マウス右ボタン -> フィルター ->Python ー>ofblur5
こんなダイアログが表示されます。
http://boxheadroom.com/wp/wp-content/uploads/2008/03/d.jpg

と、動きの大きい部分(動きの絶対値)が選択されます。
http://boxheadroom.com/wp/wp-content/uploads/2008/03/select.jpg

(直後は画面に反映されてません。画像左下のクイックマスクボタンで切り替えすると反映されます)
http://boxheadroom.com/wp/wp-content/uploads/2008/03/select2.jpg
(左下、小さい赤い四角が見えてる場所)

ここまで。
欲しかった結果と違うなぁ~ と、最初はガッカリしたんですが、いろんなサンプル画像で遊んでみたら 使い方によっては面白いかも。

ところで、GIMPには、ピーマンのブラシが標準装備されていて、今回のサンプル画像はそれを使ってるのですが。。。なぜマスコットキャラクターではなく、ピーマン?
(こんなときは便利ですが。)

以下は作業メモ+プラグインのソースコード。
[/pukiwiki]


[pukiwiki]
インテルから配布されてるOpenCV Pythonバインドだと、GIMPからPythonへのデータ転送が遅いので、もう一度CVtypesのお世話になることに。
(swig版に比べると、起動が遅くなるのですが。。。)

ここまでのあらすじ
-[[GIMP2.4 win32版のプラグインをPythonで書く インストール編:http://boxheadroom.com/2007/12/16/gimp_python]]
-[[「CVtypes.py」OpenCVをctypes経由で使う:http://boxheadroom.com/2007/12/19/cvtypes]]~
動作にはこのパッチが必要。
(ToDo 今後、パッチを当ててないCVtypesで動くようにしないと)
-[[PythonでOpenCV オプティカルフロー編:http://boxheadroom.com/2008/03/15/opticalflowbm1]]
前回の記事。 むしろ、このサンプルコードみたく、動画の各コマに、線を描き入れるだけでもマンガの効果線みたいで面白いかも。
それはそれで作らないと。。。

—-

今回のコード。自分用なので、print文 デバッグも残してあります。

_#!/usr/bin/env python
_
_from gimpfu import *
_import CVtypes as cv
_import math
_from itertools import izip
_gettext.install(“gimp20-python”, gimp.locale_directory, unicode=True)
_
_
_def ofblur5(img, lyr,lyr0,lyr1):
_#def ofblur5(img, lyr,lyr0,lyr1,sxy):
_ import sys
_ import os
_ p=os.path.abspath(os.path.dirname(sys.argv[0]))
_ fp=file(p+”\\test.txt”,”a”)
_ #print >>fp,p
_ #sys.stdout,tmp= fp,sys.stdout
_ #print code
_ #img=gimp.image_list()[0]
_ #lyr=img.active_layer
_ #s=img.selection
_ w,h=x1,y1=lyr.width,lyr.height
_ w0,h0=lyr0.width,lyr0.height
_ w1,h1=lyr1.width,lyr1.height
_
_ if w0!=w1 or h0!=h1 :
_ print >>fp,”size not match”
_ return
_
_ pr0=lyr0.get_pixel_rgn(0,0,w0,h0)
_ pr1=lyr1.get_pixel_rgn(0,0,w0,h0)
_
_ cvimg0 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, pr0.bpp )
_ cvimg1 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, pr1.bpp )
_ sstr0=cv.cvImageAsString(cvimg0)
_ sstr1=cv.cvImageAsString(cvimg1)
_ if len(sstr0)==len(pr0[:,:]) :
_ sstr0[:]=pr0[ : , : ]
_ else :
_ ws=cvimg0.contents.widthStep
_ for y in xrange(h):
_ i0=y*ws
_ i1=i0+w
_ sstr0[ i0 : i1 ]=pr0[ : , y]
_
_ #print >>fp, cvimg1.contents.widthStep,” “,len(pr1[ : , 1])
_ if len(sstr1)==len(pr1[:,:]) :
_ sstr1[:]=pr1[ : , : ]
_
_ else :
_ ws=cvimg1.contents.widthStep
_ for y in xrange(h):
_ i0=y*ws
_ i1=i0+w
_ sstr1[ i0 : i1 ]=pr1[ : , y]
_
_ “””for y in xrange(h):
_ for x in xrange(w):
_ src_img[x,y]=cv.cvScalar(*[ord(x) for x in pr0[x,y]])
_ “””
_
_ block_size = 16;
_ shift_size = 1;
_
_ rows = int (math.ceil (h / float(block_size)))
_ cols = int (math.ceil (w/ float(block_size)))
_ velx = cv.cvCreateMat (rows, cols, 5) #CV_32FC1
_ vely = cv.cvCreateMat (rows, cols, 5) #CV_32FC1
_ cv.cvSetZero (velx)
_ cv.cvSetZero (vely)
_
_
_
_ #cvReleaseImage(img)
_ gray0 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, 1 )
_ gray1 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, 1 )
_ if pr0.bpp==3 :
_ cv.cvCvtColor(cvimg0, gray0, cv.CV_RGB2GRAY)
_ elif pr0.bpp==4 :
_ cv.cvCvtColor(cvimg0, gray0, cv.CV_RGBA2GRAY)
_
_ if pr1.bpp==3 :
_ cv.cvCvtColor(cvimg1, gray1, cv.CV_RGB2GRAY)
_ elif pr1.bpp==4 :
_ cv.cvCvtColor(cvimg1, gray1, cv.CV_RGBA2GRAY)
_
_ #——————————–
_ #main
_ blocksize = cv.CvSize (block_size ,block_size )
_ shiftsize = cv.CvSize (shift_size,shift_size)
_ max_range = cv.CvSize (50, 50)
_ cv.cvCalcOpticalFlowBM (gray0,gray1, blocksize, shiftsize,\
_ max_range,0,velx,vely)
_
_
_ fx=cv.cvMatAsFloat(velx)
_ fy=cv.cvMatAsFloat(vely)
_ #——————————–
_
_ if pr0.bpp==3 :
_ cv.cvCvtColor(gray0, cvimg0, cv.CV_GRAY2RGB)
_ elif pr0.bpp==4 :
_ cv.cvCvtColor(gray0, cvimg0, cv.CV_GRAY2RGBA)
_ cv.cvOrS(cvimg0, cv.CvScalar(0,0,0,255.0), cvimg0)
_ if pr1.bpp==3 :
_ cv.cvCvtColor(gray1, cvimg1, cv.CV_GRAY2RGB)
_ elif pr1.bpp==4 :
_ cv.cvCvtColor(gray1, cvimg1, cv.CV_GRAY2RGBA)
_ cv.cvOrS(cvimg1, cv.CvScalar(0,0,0,255.0), cvimg1)
_ #pr0[ : , : ]=sstr0[ : ]
_ #pr1[ : , : ]=sstr1[ : ]
_
_
_ cvsmall=cv.cvCreateImage( cv.CvSize( cols,rows), 8, 1 )
_ smallstr=cv.cvImageAsString(cvsmall)
_ ws=cvsmall.contents.widthStep
_
_ if len(smallstr)==cols*rows :
_ smallstr[:]=””.join( chr(int(abs(i)+abs(j))*2) for i,j in izip(fx,fy))
_ else :
_ for y in xrange(rows):
_ i0=y*ws
_ i1=i0+cols
_ b=y*cols
_ smallstr[i0 : i1] = “”.join( chr(int(abs(i)+abs(i))*2) for i, j in izip(fx[b:b+cols],fy[b:b+cols]))
_
_ cvlarge= cv.cvCreateImage( cv.CvSize(w, h ), 8, 1 )
_ cv.cvResize( cvsmall, cvlarge, cv.CV_INTER_CUBIC )
_ largestr=cv.cvImageAsString(cvlarge)
_ #print >>fp, largestr
_ pdb.gimp_selection_all(img)
_ s0=img.selection
_ prs=s0.get_pixel_rgn(0,0,w , h )
_ prs[:,:]=largestr[:]
_ #prs[:,:]=”\xff”*(w*h)
_ s0.flush()
_ #cv.cvNamedWindow(“test”)
_ #cv.cvShowImage(“test”,cvlarge)
_
_ “””
_ ax=sxy
_ ay=sxy
_ dox=1
_ doy=1
_ displace_type=1
_
_
_ pdb.plug_in_displace(img, dw, ay, ay, dox, doy, mapx, mapy, displace_type)
_ “””
_ #sys.stdout=tmp
_
_register(
_ “python-fu-ofblur5”,
_ N_(“python-fu-ofblur5 opencv”),
_ “python-fu-pfblur4 opencv”,
_ “boxheadroom”,
_ “boxheadroom”,
_ “2008”,
_ N_(“_ofblur5”),
_ “RGB*, GRAY*”,
_ [
_ (PF_IMAGE, “img”, “Input image”, None),
_ (PF_DRAWABLE, “lyr”, “Input layer”, None),
_ (PF_DRAWABLE, “img0”, “current image”, None),
_ (PF_DRAWABLE, “img1”, “previous “, None),
_ #(PF_SLIDER, “sxy”, _(“_blur strength”), 5.0, (0, 20, 0.1)),
_
_ ],
_ [],
_ ofblur5,
_ menu=”/Filters/Python”,
_ domain=(“gimp20-python”, gimp.locale_directory)
_ )
_
_main()
_
[/pukiwiki]

コメントを残す

メールアドレスが公開されることはありません。