<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>BoxHeadRoom &#187; OpenCV</title>
	<atom:link href="http://boxheadroom.com/tag/opencv/feed" rel="self" type="application/rss+xml" />
	<link>http://boxheadroom.com</link>
	<description>蝸牛の一歩</description>
	<lastBuildDate>Tue, 07 Feb 2012 13:41:06 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.8.6</generator>
	<language>ja</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>OpenCV + Pythonで ドロネー△　（どろねーさん、かっけー）</title>
		<link>http://boxheadroom.com/2010/09/07/cv_py_delaunay</link>
		<comments>http://boxheadroom.com/2010/09/07/cv_py_delaunay#comments</comments>
		<pubDate>Tue, 07 Sep 2010 09:57:10 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=4239</guid>
		<description><![CDATA[ドロネー三角形を作りたかったので、ひさびさにOpenCVで遊んでみました。
ドロネー三角形（ドロネー図）というのは、適当な点のリストを線でつないで、適当な三角形を作ること、です。　

ドロネー図 &#8211; Wikipedia
OpenCVライブラリはインテルが配布している、無料の画像処理ライブラリ。これを使うと、点のリストを渡すだけで、簡単にドロネー図を作成してくれます。

詳しい使用方法やインスコ方法などの解説は
http://opencv.jp/tips
平面細分割¶
をごらんください
今回はこちらのwindows用バイナリをインストールしました
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/OpenCV-2.1.0-win32-vs2008.exe/download
OpenCVに付属のサンプル delaunay.py は少しややこしいので、必要最低限の関数にまとめることに。
今回は点をつなぐ線が欲しいだけなので、比較的簡単にできました。
delaunay_simple.py

#!/usr/bin/python
# -*- coding: cp932 -*-

import cv

def delaunay_simple(pxy_list):
    u"ドロネー三角形"
    storage = cv.CreateMemStorage(0);
    xlist=[p[0] for p in pxy_list]
    ylist=[p[1] for p in pxy_list]
    rect=(min(xlist)-1,min(ylist)-1,max(xlist)+1,max(ylist)+1)
    subdiv = cv.CreateSubdivDelaunay2D( rect, storage );
    pdict=dict()
  [...]]]></description>
			<content:encoded><![CDATA[<p>ドロネー三角形を作りたかったので、ひさびさにOpenCVで遊んでみました。</p>
<p>ドロネー三角形（ドロネー図）というのは、適当な点のリストを線でつないで、適当な三角形を作ること、です。　</p>
<p><img src="http://boxheadroom.com/wp/wp-content/uploads/2010/09/delaunay.png" tilte="ドロネー三角形"/></p>
<p><a href="http://ja.wikipedia.org/wiki/%E3%83%89%E3%83%AD%E3%83%8D%E3%83%BC%E5%9B%B3">ドロネー図 &#8211; Wikipedia</a><br />
OpenCVライブラリはインテルが配布している、無料の画像処理ライブラリ。これを使うと、点のリストを渡すだけで、簡単にドロネー図を作成してくれます。<br />
<span id="more-4239"></span><br />
詳しい使用方法やインスコ方法などの解説は<br />
<a href="http://opencv.jp/tips">http://opencv.jp/tips</a><br />
<a href="http://opencv.jp/opencv-2.1/py/planar_subdivisions.html">平面細分割¶</a><br />
をごらんください</p>
<p>今回はこちらのwindows用バイナリをインストールしました<br />
http://sourceforge.net/projects/opencvlibrary/files/opencv-win/2.1/OpenCV-2.1.0-win32-vs2008.exe/download</p>
<p>OpenCVに付属のサンプル delaunay.py は少しややこしいので、必要最低限の関数にまとめることに。<br />
今回は点をつなぐ線が欲しいだけなので、比較的簡単にできました。</p>
<p>delaunay_simple.py</p>
<pre class="code">
#!/usr/bin/python
# -*- coding: cp932 -*-

import cv

def delaunay_simple(pxy_list):
    u"ドロネー三角形"
    storage = cv.CreateMemStorage(0);
    xlist=[p[0] for p in pxy_list]
    ylist=[p[1] for p in pxy_list]
    rect=(min(xlist)-1,min(ylist)-1,max(xlist)+1,max(ylist)+1)
    subdiv = cv.CreateSubdivDelaunay2D( rect, storage );
    pdict=dict()
    for idx,pxy in enumerate(pxy_list):
        p =cv.SubdivDelaunay2DInsert( subdiv, pxy )
        pdict[p.pt]=idx
    next_dict=dict()
    for k in pdict:
        pass
    for edge in subdiv.edges:
        p0= cv.Subdiv2DEdgeOrg(edge).pt
        p1= cv.Subdiv2DEdgeDst(edge).pt
        if not p0 in pdict or not p1 in pdict:
            continue
        i0=pdict[p0]
        i1=pdict[p1]
        if not i0 in next_dict:
            next_dict[i0]=[]
        if not i1 in next_dict:
            next_dict[i1]=[]
        if not i1 in next_dict[i0] :
            next_dict[i0].append(i1)
        if not i0 in next_dict[i1] :
            next_dict[i1].append(i0)

        for k in next_dict:
            next_dict[k].sort()
    return next_dict

#テストコード
if __name__ == '__main__':
    #点のリストの作成
    from random import random
    from math import sqrt
    idx=0
    plist=[]
    while idx&gt;10:
        px,py= 1.*random(),1.*random()

        for x,y in plist:
            if sqrt( (x-px)**2+(y-py)**2)&gt;.1 :
                break
        else :
            plist.append( (px,py))
            idx+=1
    #plist=list(set(plist))
    for p in plist:
        print p
    print "***"

    #作図に必要なのは　下の一行だけ。
    #点のxy座標ペアの入ったリストを渡すと、
    #点ごとに、どの点と線でつながっているのか辞書に
　　#格納されて返ってきます。　　
    next_dict=delaunay_simple(plist)
    print next_dict

    #ここからはグラフィックで表示するためのルーチン
    W,H=500,500
    img = cv.CreateImage( (W,H), 8, 3 );
    line_color = cv.RGB(0,0,0);
    point_color = cv.RGB(255,0,0);
    bg_color = cv.RGB(255,255,255);
    cv.Set( img, bg_color )

    for k in next_dict:
        px0,py0=plist[k]
        px0*=W
        py0*=H
        for j in next_dict[k]:
            px1,py1=plist[j]
            px1*=W
            py1*=H
            pt1=(int(px0),int(py0))
            pt2=(int(px1),int(py1))
            cv.Line(img,pt1,pt2,line_color)
    for px,py in plist:
        px*=W
        py*=H
        pt1=(int(px-2),int(py-2))
        pt2=(int(px+2),int(py+2))
        cv.Rectangle(img,pt1,pt2,point_color)

    cv.SaveImage("delaunay.png",img)
    winname="delaunay"
    cv.NamedWindow(winname)
    cv.ShowImage(winname,img)
    cv.WaitKey(0);

    cv.DestroyWindow( winname );
</pre>
<p>今回はデモなので10個ですけど、点が千個以上でもラクラクです。</p>

	Tags: <a href="http://boxheadroom.com/tag/cg" title="CG" rel="tag">CG</a>, <a href="http://boxheadroom.com/tag/opencv" title="OpenCV" rel="tag">OpenCV</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2010/09/07/cv_py_delaunay/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>【PyGame】画面のAVI書き出し＆スクリーンショット</title>
		<link>http://boxheadroom.com/2009/02/20/pygame_avi_save</link>
		<comments>http://boxheadroom.com/2009/02/20/pygame_avi_save#comments</comments>
		<pubDate>Thu, 19 Feb 2009 23:50:50 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[game]]></category>
		<category><![CDATA[video]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[PyGame]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=2514</guid>
		<description><![CDATA[棚上げしてあったPyGameのチュートリアルにチャレンジ開始。
ついでに、PyGameの画面を静止画や動画で保存できるようにするモジュールを書いてみました。
PyGameとは、ゲーム用のライブラリSDLをPythonから使えるようにしたもの。

Pythonでゲーム作りますが何か？
やっと４分の１ぐらいサンプルコードを動かしました
Pygame入門
Pygame公式
　　クラスライブラリを調べるのに。

本格的にゲームを作るつもりは無いのですが。。。ちょっとしたインタラクティブな映像を作るのによさげ。
表示中の映像をAVIに保存する機能は、標準では用意されてないみたいなので、書いてみました。
（もっと　賢いやり方があったら教えてください。。。）
数日～数週間、一時　勉強を中断しなきゃいけないので、コードを紛失しないようにメモ。
また、時間が出来たら　動くサンプルコード＆サンプル動画を作成予定
＜＜注意＞＞
音声は保存できません。　（OpenCVの制限）
コード
以下を videowriter.pyというファイル名で保存。

Python 2.5系で検証
必要なライブラリは　PyGame， PIL，　OpenCV (CVtypes)
CVtypesについてはコチラ

ダウンロード




#!/usr/bin/env python
# -*- coding: utf-8 -*-
#videowriter.py
import Image
import CVtypes as cv
import atexit

#SCREEN_SIZE = (W, H)

class VideoWriter(object):
    def write_frame_pygame(self,sc):
        """
            write_frame for PyGame Surface
        """
 [...]]]></description>
			<content:encoded><![CDATA[<p>棚上げしてあったPyGameのチュートリアルにチャレンジ開始。<br />
ついでに、PyGameの画面を静止画や動画で保存できるようにするモジュールを書いてみました。</p>
<p>PyGameとは、ゲーム用のライブラリSDLをPythonから使えるようにしたもの。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://pygame.skr.jp/" rel="nofollow">Pythonでゲーム作りますが何か？</a><br />
やっと４分の１ぐらいサンプルコードを動かしました</li>
<li><a href="http://www.halb-katze.jp/pygt/" rel="nofollow">Pygame入門</a></li>
<li><a href="http://www.pygame.org/docs/" rel="nofollow">Pygame公式</a><br />
　　クラスライブラリを調べるのに。</li>
</ul>
<p>本格的にゲームを作るつもりは無いのですが。。。ちょっとしたインタラクティブな映像を作るのによさげ。<br />
表示中の映像をAVIに保存する機能は、標準では用意されてないみたいなので、書いてみました。</p>
<p>（もっと　賢いやり方があったら教えてください。。。）<br />
数日～数週間、一時　勉強を中断しなきゃいけないので、コードを紛失しないようにメモ。<br />
また、時間が出来たら　動くサンプルコード＆サンプル動画を作成予定<br />
＜＜注意＞＞<br />
音声は保存できません。　（OpenCVの制限）</p>
<h2 id="content_1_0">コード</h2>
<p>以下を videowriter.pyというファイル名で保存。</p>
<ul class="list1" style="padding-left: 16px; margin-left: 16px;">
<li>Python 2.5系で検証</li>
<li>必要なライブラリは　PyGame， PIL，　OpenCV (CVtypes)</li>
<li><a href="http://boxheadroom.com/tag/opencv" rel="nofollow">CVtypesについてはコチラ</a>
<ul class="list2" style="padding-left: 16px; margin-left: 16px;">
<li><a href="http://uncpythontools.cvs.sourceforge.net/uncpythontools/CV/" rel="nofollow">ダウンロード</a></li>
</ul>
</li>
</ul>
<hr class="full_hr">
<pre class="code">#!/usr/bin/env python
# -*- coding: utf-8 -*-
#videowriter.py
import Image
import CVtypes as cv
import atexit

#SCREEN_SIZE = (W, H)

class VideoWriter(object):
    def write_frame_pygame(self,sc):
        """
            write_frame for PyGame Surface
        """
        #print self.idx
        self.idx+=1
        s=str(sc.get_buffer().raw)
        cv.cvSetData(self.cvimg,s,self.W*self.bpp)
        #cv.cvShowImage("test",self.cvimg)
        cv.cvWriteFrame(self.vw,self.cvimg)

    def atexist(self):
        cv.cvReleaseVideoWriter(self.vw)

    def __init__(self,fname, size=(640,480),
                 fps=30,codec=-1,bpp=4,mode="pygame"):
        """
        bpp=bit_per_pixel
        mode  , now pygame only (extendable)
        """
        self.idx=0
        modelist={"pygame":self.write_frame_pygame}

        self.write_frame=modelist[mode]
        self.bpp=bpp
        self.SCREEN_SIZE=size
        self.W,self.H=size
        self.vw=cv.cvCreateVideoWriter(fname,
            codec,fps,cv.CvSize(*size))
        self.cvimg=cv.cvCreateImage(cv.CvSize(*size),8,bpp)
        atexit.register(self.atexist)
        #終了時に aviファイルを自動的にclose

#オマケ
#PyGameのSurfaceデータを　PIL画像データに変換
def img(s):
#ピクセル取得
    buf=s.get_buffer()
    im =Image.fromstring("RGBA",s.get_size(),buf.raw)
    B,G,R,A=im.split()
    return Image.merge("RGBA",(R,G,B,A))
</pre>
<div id="pukiwiki_content2" class="pukiwiki_content">
<hr class="full_hr">
<h2 id="content_1_0">使い方</h2>
<p>このコード自体は検証してないです。　　<s>後日、ちゃんと動くサンプルを作成予定～</s><br />
代表的なPyGameのサンプルコードは、こんな感じのループになってるのですが</p>
<pre class="code">
import pygame
from pygame.locals import *
from videowriter import VideoWriter,img  #☆☆☆　インポート
#
vw=VideoWriter("filename.avi")        #☆☆☆　 出力ファイル名を指定して初期化
#
SCREEN_SIZE=(640,480)

pygame.init()
screen = pygame.display.set_mode(SCREEN_SIZE)
～～～～（中略）～～～～～～
clock = pygame.time.Clock()
while True:　#Pygameのメインループ
    clock.tick(30)  #毎秒の表示コマ数に応じてウェイト
                        #ディスク上のAVIへ書き込むことを考えると、FPSは　15コマ／秒程度がよさげ
                        # （速いマシンなら　もっと速くできるかもですが）
    screen.blit( ほげほげ, (x,y))  #　個々のキャラクターを描画

  ～～～～このへんに、描画のメイン処理～～～～～～
    pygame.display.update()             #画面に反映
    vw.write_frame(screen)               #☆☆☆ ここでAVI に １コマ書き出し

    for event in pygame.event.get():   #窓を閉じると終了
        if event.type == QUIT:
            sys.exit()
</pre>
<p>という感じで使います。</p>
<div class="jumpmenu"><a href="#pukiwiki_content2">↑</a></div>
<h2 id="content_1_1">オマケの静止画保存</h2>
<pre class="code">
from videowriter import VideoWriter,img  #☆☆☆　インポート
from datetime import datetime
#画面のスクリーンショットをとりたくなった場所で適宜
im=img(screen)
im.save("screenshot%s.jpg"%datetime.today().strftime("%Y%m%d-%H%M%S"))
</pre>
<p><span id="more-2514"></span></p>

	Tags: <a href="http://boxheadroom.com/tag/opencv" title="OpenCV" rel="tag">OpenCV</a>, <a href="http://boxheadroom.com/tag/pygame" title="PyGame" rel="tag">PyGame</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2009/02/20/pygame_avi_save/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GIMPからcvInpaint処理(Python経由で)~画像の小キズ隠しに~</title>
		<link>http://boxheadroom.com/2008/11/01/gimp_cvinpaint_opencv</link>
		<comments>http://boxheadroom.com/2008/11/01/gimp_cvinpaint_opencv#comments</comments>
		<pubDate>Fri, 31 Oct 2008 19:26:53 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[PC]]></category>
		<category><![CDATA[GIMP]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=1993</guid>
		<description><![CDATA[
OpenCVのinpaint関数をGIMPから(Python経由で)使えるようにしてみました。
処理結果はこちらのサンプルみたいな感じ。

【動画】inpaint処理結果サンプル

あまり大げさなことは出来ませんが、小さいノイズを消したりするのに便利なので、個人的に手放せません。
以下コード



関連

不要オブジェクトの除去 cvInpaint  Cサンプルコード(opencv.jp)
Gimp Python Documentation

オマケ

知って得する５つの『GIMP』トリック
「四角選択ー＞角丸」　一週間早く知りたかったー

わかってる不具合
なんでこうなるの？

フィルタ動作後、レイヤーが非表示になったままです。
表示してやると、処理が画面に反映されます
アンドゥーがききません。　

&#8593;
下記のプログラムが動くまでの道のり

GIMP (レタッチソフト)
GIMP2を使おう
Python
GIMP2.4 win32版のプラグインをPythonで書く　インストール編
OpenCV
CVtypes  PythonからOpenCVを使うためのライブラリ
今回はパッチなしで動くようにしてみました。
「CVtypes.py」OpenCVをctypes経由で使う


&#8593;
その他のメモ
cvSetDataなどを使い、以前よりも、ちょっとだけ、GIMPとOpenCVの間の画像データのやりとりが速くなったはず。


#!/usr/bin/env python
from gimpfu import *
import CVtypes as cv
import ctypes
import sys
gettext.install("gimp20-python", gimp.locale_directory, unicode=True)

def cvImageAsString(img):
    btype = ctypes.c_char * img[0].imageSize
    return btype.from_address(img[0].imageData)

_cvDLL = ctypes.cdll.cv100
cvInpaint =cv.cfunc('cvInpaint',_cvDLL, None,
    ('src', ctypes.c_void_p, 1), # const CvArr* src
    ('mask', ctypes.c_void_p, 1), [...]]]></description>
			<content:encoded><![CDATA[<div id="pukiwiki_content2" class="pukiwiki_content">
<p>OpenCVのinpaint関数をGIMPから(Python経由で)使えるようにしてみました。</p>
<p>処理結果はこちらのサンプルみたいな感じ。</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://video.nifty.com/cs/catalog/video_metadata/catalog_071111041075_1.htm" rel="nofollow">【動画】inpaint処理結果サンプル</a></li>
</ul>
<p>あまり大げさなことは出来ませんが、小さいノイズを消したりするのに便利なので、個人的に手放せません。</p>
<p>以下コード</p>
</div>
<p><span id="more-1993"></span></p>
<div id="pukiwiki_content3" class="pukiwiki_content">
<p>関連</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://opencv.jp/sample/special_transforms.html#inpaint" rel="nofollow">不要オブジェクトの除去 cvInpaint  Cサンプルコード(opencv.jp)</a></li>
<li><a href="http://www.jamesh.id.au/software/pygimp/pygimp.html" rel="nofollow">Gimp Python Documentation</a></li>
</ul>
<p>オマケ</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://www.lifehacker.jp/2008/10/gimp.html" rel="nofollow">知って得する５つの『GIMP』トリック</a><br />
「四角選択ー＞角丸」　一週間早く知りたかったー</li>
</ul>
<h2 id="content_1_0">わかってる不具合</h2>
<p>なんでこうなるの？</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li>フィルタ動作後、レイヤーが非表示になったままです。<br />
表示してやると、処理が画面に反映されます</li>
<li>アンドゥーがききません。　</li>
</ul>
<div class="jumpmenu"><a href="#pukiwiki_content3">&uarr;</a></div>
<h2 id="content_1_1">下記のプログラムが動くまでの道のり</h2>
<ul class="list2" style="padding-left:32px;margin-left:32px">
<li>GIMP (レタッチソフト)<br />
<a href="http://www.geocities.jp/gimproject/gimp2.0.html" rel="nofollow">GIMP2を使おう</a></li>
<li>Python<br />
<a href="http://boxheadroom.com/2007/12/16/gimp_python" rel="nofollow">GIMP2.4 win32版のプラグインをPythonで書く　インストール編</a></li>
<li>OpenCV</li>
<li>CVtypes  PythonからOpenCVを使うためのライブラリ<br />
今回はパッチなしで動くようにしてみました。<br />
<a href="http://boxheadroom.com/2007/12/19/cvtypes" rel="nofollow">「CVtypes.py」OpenCVをctypes経由で使う</a></li>
</ul>
<hr class="full_hr" />
<div class="jumpmenu"><a href="#pukiwiki_content3">&uarr;</a></div>
<h2 id="content_1_2">その他のメモ</h2>
<p>cvSetDataなどを使い、以前よりも、ちょっとだけ、GIMPとOpenCVの間の画像データのやりとりが速くなったはず。</p>
</div>
<pre class="code">
#!/usr/bin/env python
from gimpfu import *
import CVtypes as cv
import ctypes
import sys
gettext.install("gimp20-python", gimp.locale_directory, unicode=True)

def cvImageAsString(img):
    btype = ctypes.c_char * img[0].imageSize
    return btype.from_address(img[0].imageData)

_cvDLL = ctypes.cdll.cv100
cvInpaint =cv.cfunc('cvInpaint',_cvDLL, None,
    ('src', ctypes.c_void_p, 1), # const CvArr* src
    ('mask', ctypes.c_void_p, 1), # CvArr* dst
    ('dst', ctypes.c_void_p, 1), # CvArr* dst
    ('flags', ctypes.c_int, 1), # int flags
    ('inpaintRadius', ctypes.c_double, 1), # double threshold1
)
def cvinpaint(img,layer):
    r=10
    gimp.progress_init("cvInPaint")
    gimp.progress_update(0.5) #percnt 0 ->1.0
    flag,x0,y0,x1,y1=gimp.pdb.gimp_selection_bounds(img)
    ox,oy=layer.offsets
    x0-=ox; x1-=ox; y0-=oy; y1-=oy
    if not flag : return
    x0=max(x0-r,0)
    y0=max(y0-r,0)
    x1=min(x1+r,layer.width)
    y1=min(y1+r,layer.height)
    r=float(r)
    w=x1-x0; h=y1-y0
    p0=layer.get_pixel_rgn(x0,y0,w,h)
    src_img = cv.cvCreateImage( cv.CvSize( w,h), 8, p0.bpp )
    cv.cvSetData(src_img,str(p0[:,:]),w*p0.bpp)
#---------------
    stp=src_img[0].widthStep
    sstr=cvImageAsString(src_img)
    stp2=w*p0.bpp
    idx0=0
    for y in xrange(y0,y1):
        idx1=idx0+stp2
        p0[x0:x1,y]=sstr[idx0:idx1]
        idx0+=stp

#---------------
    if layer.bpp==4 :
        src4=src_img

        src_img=cv.cvCreateImage( cv.CvSize( w,h), 8, 3)
        cv.cvCvtColor( src4, src_img,cv.CV_BGRA2BGR )
    gimp.progress_update(0.6) #percnt 0 ->1.0
    layer.visible=False
    sel=img.selection
    ps=sel.get_pixel_rgn(x0+ox,y0+oy,w,h)

    mask_img = cv.cvCreateImage( cv.CvSize( w,h), 8, 1)
    cv.cvSetData(mask_img,str(ps[:,:]),w)
    dst_img = cv.cvCloneImage (src_img)

    gimp.progress_update(0.7) #percnt 0 ->1.0
    cvInpaint (src_img, mask_img, dst_img, cv.CV_INPAINT_TELEA, r)

    gimp.progress_update(0.8) #percnt 0 ->1.0
    if p0.bpp==4 :
        cv.cvCvtColor( dst_img, src4, cv.CV_BGR2BGRA )
        cv.cvReleaseImage(dst_img)
        cv.cvOrS(src4, cv.CvScalar(0,0,0,255.0), src4)
        dst_img=src4

    dstr=cvImageAsString(dst_img)
    stp=dst_img[0].widthStep
    stp2=w*p0.bpp
    idx0=0
    for y in xrange(y0,y1):
        idx1=idx0+stp2
        p0[x0:x1,y]=dstr[idx0:idx1]
        idx0+=stp
    cv.cvRelease(dst_img)
    cv.cvRelease(mask_img)
    cv.cvRelease(src_img)
    layer.visible=True
    gimp.displays_flush()
    gimp.progress_update(1.0)
    #img.undo_group_end()
register(
    "python-fu-cvinpaint",
    N_("CvInPaint OpenCV"),
    "Adds a layer of fog to the image.",
    "BoxHeadRoom",
    "BoxHeadroom.com",
    "2007",
    N_("_CvInPaint..."),
    "RGB*, GRAY*",
    [
        (PF_IMAGE, "image",       "Input image", None),
        (PF_DRAWABLE, "drawable", "Input drawable", None),
    ],
    [],
    cvinpaint,
    menu="&lt;Image&gt;/Filters/OpenCV",
    domain=("gimp20-python", gimp.locale_directory)
    )

main()
</pre>

	Tags: <a href="http://boxheadroom.com/tag/gimp" title="GIMP" rel="tag">GIMP</a>, <a href="http://boxheadroom.com/tag/opencv" title="OpenCV" rel="tag">OpenCV</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2008/11/01/gimp_cvinpaint_opencv/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Pythonでビデオキャプチャ作業メモ</title>
		<link>http://boxheadroom.com/2008/05/01/pyvideocapture</link>
		<comments>http://boxheadroom.com/2008/05/01/pyvideocapture#comments</comments>
		<pubDate>Thu, 01 May 2008 03:42:16 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/?p=1401</guid>
		<description><![CDATA[
PythonでWebカメラなどの画像を録画する方法の作業メモ。
環境はWindows(XP/Vista)



OpenCV
バージョン1.0では320&#215;240でしか画像を取り込めません
tag　／　wiki
。。。なので、今回は別の方法を探すことに。
&#8593;
VideoCaptureモジュール
Pythonから簡単にビデオキャプチャできるモジュール。超楽。
解像度も指定できます。(IEEEカメラなどが使えるかは不明)
きめ細かい指定は直接はできませんが、とにかく簡単。
&#8593;
EyeToy用ドライバ
PS2用のWebカメラ、EyeToy PlayをPC(WindowsXP,Vista)で使うためのドライバ。
1個だけなら、このドライバで、Vistaでも動きました。が。。。
&#8593;
EyeToyをPCに複数個接続したい。。。が挫折
複数個のカメラをPCに接続したところ

テレビチューナーカード1個＋EyeToy1個で動作した(XP)
VideoCaptureモジュール自体は複数カメラに対応している模様
VistaなPCにEyeToyを複数個接続したところ、

USBハブに複数カメラを接続すると、2個目のカメラを認識せず。
PC本体のUSBポートにカメラを直接接続。動作した。。。かと思いきや暴走してブルースクリーンに。
ドライバが原因か、ハード的な原因か、VideoCaptureモジュールのアクセスするタイミングの問題か。。。それともPCのUSBの問題かは不明



というわけで、当面、EyeToy一個だけで遊ぶことに。
同じ機種のカメラを複数同時に使えると面白そうだと思ったのだけれど残念。
&#8593;
ビデオ編集ソフトVirtualDub
OpenCVが作成するAVIは、一部のソフトと相性が悪く、開けない場合有り。
（音声トラックがついてない、という問題なのかも）
VirtualDubで開いて、再圧縮なしで保存しなおすと他のソフトでもちゃんと開けるようになります
&#8593;
サンプルコード
&#8593;
VideoCaptureモジュールサンプルコード(静止画)
たった4行でjpeg画像として保存できちゃいます。
これはラクチン。
_from VideoCapture import Device
_cam = Device(devnum=0)
_cam.setResolution(640,480)
_cam.saveSnapshot(&#8217;testtestimage.jpg&#8217;)
_#保存する画像にタイムスタンプを入れる場合はこちら。
_#cam.saveSnapshot(&#8217;testtestimage.jpg&#8217;, \
_#           timestamp=3, boldfont=1)
&#8593;
動画
Webカメラ1個をPythonからVideoCaptureモジュールで画像取り込み。
50フレームだけ一旦メモリーに格納。
取り込み終わったあと、OpenCVでAVIとして保存する例。取り込んで終了
VideoCaptureモジュールで取り込んだ画像をOpenCVのIPL Image形式に変換するには、cvSetData関数を使うのが速いみたいです。
（ちょっと悩みました）
_from VideoCapture import Device
_import time
_import CVtypes as cv
_
_w=640;  h=480;  fmax=50
_#cam = Device(devnum=0)
_cam.setResolution(w,h)
_vw=cv.cvCreateVideoWriter(&#34;test.avi&#34;,\
_                      [...]]]></description>
			<content:encoded><![CDATA[<div id="pukiwiki_content6" class="pukiwiki_content">
<p>PythonでWebカメラなどの画像を録画する方法の作業メモ。<br />
環境はWindows(XP/Vista)</p>
</div>
<p><span id="more-1401"></span></p>
<div id="pukiwiki_content7" class="pukiwiki_content">
<h2 id="content_1_0">OpenCV</h2>
<p>バージョン1.0では320&#215;240でしか画像を取り込めません<br />
<a href="http://boxheadroom.com/tag/opencv" rel="nofollow">tag</a>　／　<a href="http://boxheadroom.com/wiki/?OpenCV" rel="nofollow">wiki</a></p>
<p>。。。なので、今回は別の方法を探すことに。</p>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h2 id="content_1_1"><a href="http://videocapture.sourceforge.net/" rel="nofollow">VideoCaptureモジュール</a></h2>
<p>Pythonから簡単にビデオキャプチャできるモジュール。超楽。<br />
解像度も指定できます。(IEEEカメラなどが使えるかは不明)<br />
きめ細かい指定は直接はできませんが、とにかく簡単。</p>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h2 id="content_1_2"><a href="http://www.emagi.co.uk/2007/10/29/windows-vista-and-the-eyetoy/" rel="nofollow">EyeToy用ドライバ</a></h2>
<p>PS2用のWebカメラ、EyeToy PlayをPC(WindowsXP,Vista)で使うためのドライバ。<br />
1個だけなら、このドライバで、Vistaでも動きました。が。。。</p>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h3 id="content_1_3">EyeToyをPCに複数個接続したい。。。が挫折</h3>
<p>複数個のカメラをPCに接続したところ</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li>テレビチューナーカード1個＋EyeToy1個で動作した(XP)<br />
VideoCaptureモジュール自体は複数カメラに対応している模様</li>
<li>VistaなPCにEyeToyを複数個接続したところ、
<ul class="list2" style="padding-left:16px;margin-left:16px">
<li>USBハブに複数カメラを接続すると、2個目のカメラを認識せず。</li>
<li>PC本体のUSBポートにカメラを直接接続。動作した。。。かと思いきや暴走してブルースクリーンに。<br />
ドライバが原因か、ハード的な原因か、VideoCaptureモジュールのアクセスするタイミングの問題か。。。それともPCのUSBの問題かは不明</li>
</ul>
</li>
</ul>
<p>というわけで、当面、EyeToy一個だけで遊ぶことに。<br />
同じ機種のカメラを複数同時に使えると面白そうだと思ったのだけれど残念。</p>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h2 id="content_1_4"><a href="http://www.virtualdub.org/" rel="nofollow">ビデオ編集ソフトVirtualDub</a></h2>
<p>OpenCVが作成するAVIは、一部のソフトと相性が悪く、開けない場合有り。<br />
（音声トラックがついてない、という問題なのかも）<br />
VirtualDubで開いて、再圧縮なしで保存しなおすと他のソフトでもちゃんと開けるようになります</p>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h2 id="content_1_5">サンプルコード</h2>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h4 id="content_1_6">VideoCaptureモジュールサンプルコード(静止画)</h4>
<p>たった4行でjpeg画像として保存できちゃいます。<br />
これはラクチン。</p>
<p>_from VideoCapture import Device<br />
_cam = Device(devnum=0)<br />
_cam.setResolution(640,480)<br />
_cam.saveSnapshot(&#8217;testtestimage.jpg&#8217;)<br />
_#保存する画像にタイムスタンプを入れる場合はこちら。<br />
_#cam.saveSnapshot(&#8217;testtestimage.jpg&#8217;, \<br />
_#           timestamp=3, boldfont=1)</p>
<div class="jumpmenu"><a href="#pukiwiki_content7">&uarr;</a></div>
<h4 id="content_1_7">動画</h4>
<p>Webカメラ1個をPythonからVideoCaptureモジュールで画像取り込み。<br />
50フレームだけ一旦メモリーに格納。<br />
取り込み終わったあと、OpenCVでAVIとして保存する例。取り込んで終了</p>
<p>VideoCaptureモジュールで取り込んだ画像をOpenCVのIPL Image形式に変換するには、cvSetData関数を使うのが速いみたいです。<br />
（ちょっと悩みました）</p>
<p>_from VideoCapture import Device<br />
_import time<br />
_import CVtypes as cv<br />
_<br />
_w=640;  h=480;  fmax=50<br />
_#cam = Device(devnum=0)<br />
_cam.setResolution(w,h)<br />
_vw=cv.cvCreateVideoWriter(&quot;test.avi&quot;,\<br />
_                            -1,30,cv.CvSize(w,h))<br />
_print raw_input(&quot;Press Enter for Start Recording&quot;)<br />
_last=time.time()<br />
_blist=[]<br />
_for i in xrange(fmax):<br />
_    b=str(cam.dev.getbuffer()[0])<br />
_    blist.append(b)<br />
_t=time.time()-last<br />
_print t<br />
_print &quot;%f fps&quot; % (fmax/t)<br />
_wd=w*3<br />
_im=cv.cvCreateImage(cv.CvSize(w,h),8,3)<br />
_for i,b in enumerate(blist):<br />
_    cv.cvSetData(im,b,wd)<br />
_    cv.cvWriteFrame(vw,im)<br />
_    cv.cvFlip(im)<br />
_cv.cvReleaseVideoWriter(vw)</p>
<p>OpenCVで、いろんな画像処理しても楽しいかも。</p>
<p>ソースも読みやすく着色しないといかんですねぇ。。。</p>
</div>

	Tags: <a href="http://boxheadroom.com/tag/opencv" title="OpenCV" rel="tag">OpenCV</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2008/05/01/pyvideocapture/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GIMP+Python オプティカルフローであそぶ　その2 CVtypes編</title>
		<link>http://boxheadroom.com/2008/03/22/opticalflowbm2</link>
		<comments>http://boxheadroom.com/2008/03/22/opticalflowbm2#comments</comments>
		<pubDate>Sat, 22 Mar 2008 06:45:22 +0000</pubDate>
		<dc:creator>boxheadroom</dc:creator>
				<category><![CDATA[CG]]></category>
		<category><![CDATA[GIMP]]></category>
		<category><![CDATA[OpenCV]]></category>
		<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://boxheadroom.com/2008/03/22/opticalflowbm2</guid>
		<description><![CDATA[
GIMP2.4用のプラグインとして動かしてみました。
できたところまでメモ。
二つのレイヤーに　ピーマンを少し動かした状態で描く。


マウス右ボタン　－＞　フィルター　－＞Python ー＞ofblur5
こんなダイアログが表示されます。

と、動きの大きい部分（動きの絶対値）が選択されます。

（直後は画面に反映されてません。画像左下のクイックマスクボタンで切り替えすると反映されます）

（左下、小さい赤い四角が見えてる場所）
ここまで。
欲しかった結果と違うなぁ～　と、最初はガッカリしたんですが、いろんなサンプル画像で遊んでみたら　使い方によっては面白いかも。
ところで、GIMPには、ピーマンのブラシが標準装備されていて、今回のサンプル画像はそれを使ってるのですが。。。なぜマスコットキャラクターではなく、ピーマン？
(こんなときは便利ですが。)
以下は作業メモ＋プラグインのソースコード。



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

GIMP2.4 win32版のプラグインをPythonで書く　インストール編
「CVtypes.py」OpenCVをctypes経由で使う
動作にはこのパッチが必要。
(ToDo  今後、パッチを当ててないCVｔｙpesで動くようにしないと)
PythonでOpenCV オプティカルフロー編
前回の記事。　むしろ、このサンプルコードみたく、動画の各コマに、線を描き入れるだけでもマンガの効果線みたいで面白いかも。
それはそれで作らないと。。。


今回のコード。自分用なので、print文　デバッグも残してあります。
_#!/usr/bin/env python
_
_from gimpfu import *
_import CVtypes as cv
_import math
_from itertools import izip
_gettext.install(&#34;gimp20-python&#34;, 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+&#34;\\test.txt&#34;,&#34;a&#34;)
_    #print &#62;&#62;fp,p
_    #sys.stdout,tmp= fp,sys.stdout
_    [...]]]></description>
			<content:encoded><![CDATA[<div id="pukiwiki_content10" class="pukiwiki_content">
<p>GIMP2.4用のプラグインとして動かしてみました。<br />
できたところまでメモ。<br />
二つのレイヤーに　ピーマンを少し動かした状態で描く。</p>
<p><a href="http://boxheadroom.com/wp/wp-content/uploads/2008/03/p1.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2008/03/p1.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2008/03/p1.jpg" /></a><br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2008/03/p2.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2008/03/p2.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2008/03/p2.jpg" /></a></p>
<p>マウス右ボタン　－＞　フィルター　－＞Python ー＞ofblur5<br />
こんなダイアログが表示されます。<br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2008/03/d.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2008/03/d.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2008/03/d.jpg" /></a></p>
<p>と、動きの大きい部分（動きの絶対値）が選択されます。<br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2008/03/select.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2008/03/select.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2008/03/select.jpg" /></a></p>
<p>（直後は画面に反映されてません。画像左下のクイックマスクボタンで切り替えすると反映されます）<br />
<a href="http://boxheadroom.com/wp/wp-content/uploads/2008/03/select2.jpg" rel="nofollow"><img src="http://boxheadroom.com/wp/wp-content/uploads/2008/03/select2.jpg" alt="http://boxheadroom.com/wp/wp-content/uploads/2008/03/select2.jpg" /></a><br />
（左下、小さい赤い四角が見えてる場所）</p>
<p>ここまで。<br />
欲しかった結果と違うなぁ～　と、最初はガッカリしたんですが、いろんなサンプル画像で遊んでみたら　使い方によっては面白いかも。</p>
<p>ところで、GIMPには、ピーマンのブラシが標準装備されていて、今回のサンプル画像はそれを使ってるのですが。。。なぜマスコットキャラクターではなく、ピーマン？<br />
(こんなときは便利ですが。)</p>
<p>以下は作業メモ＋プラグインのソースコード。</p>
</div>
<p><span id="more-1360"></span></p>
<div id="pukiwiki_content11" class="pukiwiki_content">
<p>インテルから配布されてるOpenCV Pythonバインドだと、GIMPからPythonへのデータ転送が遅いので、もう一度CVtypesのお世話になることに。<br />
(swig版に比べると、起動が遅くなるのですが。。。)</p>
<p>ここまでのあらすじ</p>
<ul class="list1" style="padding-left:16px;margin-left:16px">
<li><a href="http://boxheadroom.com/2007/12/16/gimp_python" rel="nofollow">GIMP2.4 win32版のプラグインをPythonで書く　インストール編</a></li>
<li><a href="http://boxheadroom.com/2007/12/19/cvtypes" rel="nofollow">「CVtypes.py」OpenCVをctypes経由で使う</a><br />
動作にはこのパッチが必要。<br />
(ToDo  今後、パッチを当ててないCVｔｙpesで動くようにしないと)</li>
<li><a href="http://boxheadroom.com/2008/03/15/opticalflowbm1" rel="nofollow">PythonでOpenCV オプティカルフロー編</a><br />
前回の記事。　むしろ、このサンプルコードみたく、動画の各コマに、線を描き入れるだけでもマンガの効果線みたいで面白いかも。<br />
それはそれで作らないと。。。</li>
</ul>
<hr class="full_hr" />
<p>今回のコード。自分用なので、print文　デバッグも残してあります。</p>
<p>_#!/usr/bin/env python<br />
_<br />
_from gimpfu import *<br />
_import CVtypes as cv<br />
_import math<br />
_from itertools import izip<br />
_gettext.install(&quot;gimp20-python&quot;, gimp.locale_directory, unicode=True)<br />
_<br />
_<br />
_def ofblur5(img, lyr,lyr0,lyr1):<br />
_#def ofblur5(img, lyr,lyr0,lyr1,sxy):<br />
_    import sys<br />
_    import os<br />
_    p=os.path.abspath(os.path.dirname(sys.argv[0]))<br />
_    fp=file(p+&quot;\\test.txt&quot;,&quot;a&quot;)<br />
_    #print &gt;&gt;fp,p<br />
_    #sys.stdout,tmp= fp,sys.stdout<br />
_    #print code<br />
_    #img=gimp.image_list()[0]<br />
_    #lyr=img.active_layer<br />
_    #s=img.selection<br />
_    w,h=x1,y1=lyr.width,lyr.height<br />
_    w0,h0=lyr0.width,lyr0.height<br />
_    w1,h1=lyr1.width,lyr1.height<br />
_<br />
_    if  w0!=w1 or h0!=h1 :<br />
_        print &gt;&gt;fp,&quot;size not match&quot;<br />
_        return<br />
_<br />
_    pr0=lyr0.get_pixel_rgn(0,0,w0,h0)<br />
_    pr1=lyr1.get_pixel_rgn(0,0,w0,h0)<br />
_<br />
_    cvimg0 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, pr0.bpp )<br />
_    cvimg1 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, pr1.bpp )<br />
_    sstr0=cv.cvImageAsString(cvimg0)<br />
_    sstr1=cv.cvImageAsString(cvimg1)<br />
_    if len(sstr0)==len(pr0[:,:]) :<br />
_        sstr0[:]=pr0[ : , : ]<br />
_    else :<br />
_        ws=cvimg0.contents.widthStep<br />
_        for y in xrange(h):<br />
_            i0=y*ws<br />
_            i1=i0+w<br />
_            sstr0[ i0 : i1 ]=pr0[ : , y]<br />
_<br />
_    #print &gt;&gt;fp, cvimg1.contents.widthStep,&quot; &quot;,len(pr1[ : , 1])<br />
_    if len(sstr1)==len(pr1[:,:]) :<br />
_        sstr1[:]=pr1[ : , : ]<br />
_<br />
_    else :<br />
_        ws=cvimg1.contents.widthStep<br />
_        for y in xrange(h):<br />
_            i0=y*ws<br />
_            i1=i0+w<br />
_            sstr1[ i0 : i1 ]=pr1[ : , y]<br />
_<br />
_    &quot;&quot;&quot;for y  in xrange(h):<br />
_        for x in xrange(w):<br />
_            src_img[x,y]=cv.cvScalar(*[ord(x) for x in pr0[x,y]])<br />
_    &quot;&quot;&quot;<br />
_<br />
_    block_size = 16;<br />
_    shift_size = 1;<br />
_<br />
_    rows = int (math.ceil (h / float(block_size)))<br />
_    cols = int (math.ceil (w/ float(block_size)))<br />
_    velx = cv.cvCreateMat (rows, cols, 5) #CV_32FC1<br />
_    vely = cv.cvCreateMat (rows, cols, 5) #CV_32FC1<br />
_    cv.cvSetZero (velx)<br />
_    cv.cvSetZero (vely)<br />
_<br />
_<br />
_<br />
_    #cvReleaseImage(img)<br />
_    gray0 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, 1 )<br />
_    gray1 = cv.cvCreateImage( cv.CvSize( w0,h0), 8, 1 )<br />
_    if pr0.bpp==3 :<br />
_        cv.cvCvtColor(cvimg0, gray0, cv.CV_RGB2GRAY)<br />
_    elif pr0.bpp==4 :<br />
_        cv.cvCvtColor(cvimg0, gray0, cv.CV_RGBA2GRAY)<br />
_<br />
_    if pr1.bpp==3 :<br />
_        cv.cvCvtColor(cvimg1, gray1, cv.CV_RGB2GRAY)<br />
_    elif pr1.bpp==4 :<br />
_        cv.cvCvtColor(cvimg1, gray1, cv.CV_RGBA2GRAY)<br />
_<br />
_    #&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
_    #main<br />
_    blocksize = cv.CvSize (block_size ,block_size )<br />
_    shiftsize = cv.CvSize (shift_size,shift_size)<br />
_    max_range = cv.CvSize (50, 50)<br />
_    cv.cvCalcOpticalFlowBM (gray0,gray1, blocksize, shiftsize,\<br />
_                       max_range,0,velx,vely)<br />
_<br />
_<br />
_    fx=cv.cvMatAsFloat(velx)<br />
_    fy=cv.cvMatAsFloat(vely)<br />
_    #&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8212;&#8211;<br />
_<br />
_    if pr0.bpp==3 :<br />
_        cv.cvCvtColor(gray0, cvimg0,  cv.CV_GRAY2RGB)<br />
_    elif pr0.bpp==4 :<br />
_        cv.cvCvtColor(gray0, cvimg0,  cv.CV_GRAY2RGBA)<br />
_        cv.cvOrS(cvimg0, cv.CvScalar(0,0,0,255.0), cvimg0)<br />
_    if pr1.bpp==3 :<br />
_        cv.cvCvtColor(gray1, cvimg1,  cv.CV_GRAY2RGB)<br />
_    elif pr1.bpp==4 :<br />
_        cv.cvCvtColor(gray1, cvimg1,  cv.CV_GRAY2RGBA)<br />
_        cv.cvOrS(cvimg1, cv.CvScalar(0,0,0,255.0), cvimg1)<br />
_    #pr0[ : , : ]=sstr0[ : ]<br />
_    #pr1[ : , : ]=sstr1[ : ]<br />
_<br />
_<br />
_    cvsmall=cv.cvCreateImage( cv.CvSize( cols,rows), 8, 1 )<br />
_    smallstr=cv.cvImageAsString(cvsmall)<br />
_    ws=cvsmall.contents.widthStep<br />
_<br />
_    if len(smallstr)==cols*rows :<br />
_        smallstr[:]=&quot;&quot;.join( chr(int(abs(i)+abs(j))*2) for i,j in izip(fx,fy))<br />
_    else :<br />
_        for y in xrange(rows):<br />
_            i0=y*ws<br />
_            i1=i0+cols<br />
_            b=y*cols<br />
_            smallstr[i0 : i1] = &quot;&quot;.join( chr(int(abs(i)+abs(i))*2)  for i, j in izip(fx[b:b+cols],fy[b:b+cols]))<br />
_<br />
_    cvlarge= cv.cvCreateImage( cv.CvSize(w, h ), 8, 1 )<br />
_    cv.cvResize( cvsmall, cvlarge, cv.CV_INTER_CUBIC )<br />
_    largestr=cv.cvImageAsString(cvlarge)<br />
_    #print &gt;&gt;fp, largestr<br />
_    pdb.gimp_selection_all(img)<br />
_    s0=img.selection<br />
_    prs=s0.get_pixel_rgn(0,0,w , h )<br />
_    prs[:,:]=largestr[:]<br />
_    #prs[:,:]=&quot;\xff&quot;*(w*h)<br />
_    s0.flush()<br />
_    #cv.cvNamedWindow(&quot;test&quot;)<br />
_    #cv.cvShowImage(&quot;test&quot;,cvlarge)<br />
_<br />
_    &quot;&quot;&quot;<br />
_    ax=sxy<br />
_    ay=sxy<br />
_    dox=1<br />
_    doy=1<br />
_    displace_type=1<br />
_<br />
_<br />
_    pdb.plug_in_displace(img, dw, ay, ay, dox, doy, mapx, mapy, displace_type)<br />
_    &quot;&quot;&quot;<br />
_    #sys.stdout=tmp<br />
_<br />
_register(<br />
_        &quot;python-fu-ofblur5&quot;,<br />
_        N_(&quot;python-fu-ofblur5 opencv&quot;),<br />
_        &quot;python-fu-pfblur4 opencv&quot;,<br />
_        &quot;boxheadroom&quot;,<br />
_        &quot;boxheadroom&quot;,<br />
_        &quot;2008&quot;,<br />
_        N_(&quot;_ofblur5&quot;),<br />
_        &quot;RGB*, GRAY*&quot;,<br />
_        [<br />
_            (PF_IMAGE, &quot;img&quot;,       &quot;Input image&quot;, None),<br />
_            (PF_DRAWABLE, &quot;lyr&quot;, &quot;Input layer&quot;, None),<br />
_            (PF_DRAWABLE, &quot;img0&quot;, &quot;current image&quot;, None),<br />
_            (PF_DRAWABLE, &quot;img1&quot;, &quot;previous &quot;, None),<br />
_            #(PF_SLIDER, &quot;sxy&quot;, _(&quot;_blur  strength&quot;), 5.0, (0, 20, 0.1)),<br />
_<br />
_        ],<br />
_        [],<br />
_        ofblur5,<br />
_        menu=&quot;&lt;Image&gt;/Filters/Python&quot;,<br />
_        domain=(&quot;gimp20-python&quot;, gimp.locale_directory)<br />
_    )<br />
_<br />
_main()<br />
_</p>
</div>

	Tags: <a href="http://boxheadroom.com/tag/cg" title="CG" rel="tag">CG</a>, <a href="http://boxheadroom.com/tag/gimp" title="GIMP" rel="tag">GIMP</a>, <a href="http://boxheadroom.com/tag/opencv" title="OpenCV" rel="tag">OpenCV</a>, <a href="http://boxheadroom.com/tag/python" title="Python" rel="tag">Python</a><br />

	<h4>Related posts</h4>
	<ul class="st-related-posts">
	<li><a href="http://boxheadroom.com/2011/09/16/namedlist2" title="Pythonで名前つきリスト その2 (9月 16, 2011)">Pythonで名前つきリスト その2</a> (0)</li>
	<li><a href="http://boxheadroom.com/2011/02/11/urllib2_range" title="【Py】webページの先頭数バイトだけ取得 (2月 11, 2011)">【Py】webページの先頭数バイトだけ取得</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/10/29/wget_py" title="wget.py webをまとめて取得　などなど (10月 29, 2010)">wget.py webをまとめて取得　などなど</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/21/py_cui_progress_ba" title="CUIでプログレスバーもどき (9月 21, 2010)">CUIでプログレスバーもどき</a> (0)</li>
	<li><a href="http://boxheadroom.com/2010/09/18/matplotlib_delaunay" title="ドロネー三角形 matplotlibで (9月 18, 2010)">ドロネー三角形 matplotlibで</a> (0)</li>
</ul>

]]></content:encoded>
			<wfw:commentRss>http://boxheadroom.com/2008/03/22/opticalflowbm2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

