• 検索結果がありません。

c l a s s  RPV  ̲ A i r

早川

void*** data ̲ p t r ;   i n

ainputYC

̲n

u r n ; i n t *   ainputYC; 

i n

七*

f r a m e

̲no; 

i n

七*

da

a ̲ s i z e ; i n t   ainpu

da

a

̲n

u r n ;

人力非同月

l

データへのポインタ 非同期人ノjデータの数

非同期入力データの送イ ~Jê

P C

千件ザ 非同期人ノJデータのフレーム需

; J a J

ド[1iJ期入力データの大き

inlの処:Ð I~ に使川する入力 JI=[JÎJJ~Iデータの数

5 . 5 :

クラス

RPV ̲ Ainput 

( a )

前処理関数

pre ̲ func

を実行する.

( b )

処理開始割り込み信号を待つ.

( c )

ユーザ関数

user ̲ func

を実行し,

1

フレーム分のデータを処理する.

( d )   frame

̲n

um

フレーム分のデータを処理が済んでいなければ,

2b

へ戻る

( e )

後処理関数

post ̲ func

を実行し,処理を終了する

.

3 .

すべての

PC

で処理が終了したことを確認し,

RPV

全体の処理を終了する.

ユーザ関数

user ̲ func

の引数は,四つの入出力データへのポインタと一つのアプリケー ションプログラマが自由に利用できる引数から成る.入力同期データ引数(図

5 . 3

参照)と 入力非同期データ引数(図

5 . 5

参照)には,システムによって自動的に必要なデータが渡 れ,ユーザ関数はそれらのデータを読み込むことができる.また,出力データ引数(図

5

.4 参照)には,ユーザ関数から書き込み可能であり,書き込みが終了すると自動的にそれらの データは送信される

.

このようにユーザ関数は,データの送受信や同期について考慮する 必要がなく,静止画像を入力とし,それを処理し,結果を出力する静止画像処理と同じ形 式で記述可能である そのため,動画像処理ということを意識することなく,容易にユー ザ関数をプログラミングできる

.また,クラス RPV ̲ Connection

において ある

PC

のデー タ転送元

PC

とデータ転送先

PC

にその

PC

を指定することで その

PC

の出力データを 次のフレームにおけるその

PC

の入力データにすることができる

.

これにより

,過去の処

理結果がユーザ関数の引数として渡されるので,過去の処理結果を利用するデータ処理タ スクについても容易にプログラミング可能である.

5 . 5   RPV 標準ライブラリ

RPV

では標準的なデータ形式をクラスライブラリとして用意する

.

これにより,プログ ラマの負担の軽減のほか,プログラマ間でのデータやプログラムの交換も容易になる.ま た

, RPV

では,標準的な画像処理を関数ライブラリとして用意する

.用意する関数はマノレ

チメディア拡張命令セットを利用するなどして高速化を行う

.

これにより プログラマは 畠速な画像処理システムを低負担で実現できる.本節では

RPV

標準ライブラリが用意す るデータ形式と関数について述べる

.

post̲lunc()  DPM 

FSS  FSS 

一一一一一一一一一一一一」ーート

PC 

5 . 6 :

関数

RPV ̲ I n v o k e

の動き

クラスライブラリ

RPV

は以下のデータ形式のクラスライブラリを用意する.

5

.4節で述 べたように,

RPV

ではデータ処理を各フレームデータごとに処理するように記述するの で,用意する画像形式も動画像形式ではなく静止画像形式である.

カラー画像

( 2 4ビット)

RPV̲RGB24<width, height> 

説明:24ビット

(RGB

8ビ

ットの)の画素から成る横 widht,縦 heightのカラー 画像

カラー画像 (32ビット)

RPVJRGB32<width, height> 

説明:32ビット

(RGB各 8

ビットとダミー

8

ビット)の 画 素 か ら 成 る 横 山dht,縦 heightのカラー画像

濃淡画像 (8ビット)

RPV̲GRAY8<width, height> 

説明

: 8ビ

ットの画素から成る横widht,縦heightの濃淡画像

J

・ 』

2

値 画 像

( 8

ビット)

RPB ̲ BIN8<width ,  height> 

説明

: 8

ビット(下位

1

ビットのみを使用)の画素から成る横

w i dht

,縦

he i ght

2

値 画 像

一般画像(画素の型は

Type)

RPV ̲ IMAGE<width

, 

height

, 

Type> 

説明

: Type

型 の 画 素 か ら 成 る 横

widht

,縦

height

の一般画像

関数ライブラリ

RP V

の用意する画像処理の関数ライブラリの例を挙げる.なお,入出力 画像として一般画像型を代表として挙げているが,他の画像型用の関数も用意する また,

これら以外の関数も順次追加していく予定である.

平均値フィルタ

RPV ̲ IMAGE<width

, 

height

, 

Type>* RPV ̲ AverageFilter(RPV ̲ IMAGE<width

, 

height

, 

Type>*)  i r n ,  i n t   size 

第 1引数:入力画像 第 2引数:近傍領域の人‑き 返 り 値:出力画像

説明:画像の平滑化の一種

size x  size

近 傍 の 画 素 値 の 平 均 を 注 目 画 素 の 新 し い 阿 素値とする処理.

中間値フィルタ

RPV ̲ IMAGE<width

, 

height

, 

Type>* RPVJMedianFilter(RPV ̲ IMAGE<width

, 

height

, 

Type>

本)

i r n ,  i n t   size 

第 1引数:入力画像

2

引数:近傍領域の大きさ

返 り 値:出力画像説明:画 像 の 平 滑 化 の 一 種

size x  size

近傍の画素値の中問値を 注目画素の新しい画素値とする処理.

ガウシアンフィルタ

RPV ̲ IMAGE<width

, 

height

, 

Type>* RPV ̲ GaussianFilter(RPV ̲ IMAGE<width

, 

height

, 

Type>*  i r n

, 

i n t   size

, 

float  S )  

第 1引数:入 力 画 像

2

引数:近傍領域の大きさ 第

3

引数:分 散 値

返 り 値:出力画像説明:画像の平滑化

size x  size

近 傍 に 分 散 値

S

のガウシアンを たたみこむ処理.

Sobel

フィルタ

RPV ̲ IMAGE<width

, 

height

, 

Type>* RPV ̲ SobelFilter(RPV ̲ IMAGE<width

, 

height

, 

Type>*) 

第 1引数:入 力 画 像

返 り 値:出力画像説明:画像のエッジ検出

3  x  3

近 傍 か ら エ ッ ジ 強 度 を 求 め る 処 理.

ラプラシアンフィルタ

RPV ̲ IMAGE<width

, 

height

, 

Type>* RPV ̲ LaplacianFilter(RPV ̲ IMAGE<width

, 

height

, 

Type>*) 

第 1引数:入 力 画 像

返 り 値:出力画像説明:画像のエッジ検出.

3  x  3

近 傍 か ら エ ッ ジ 強 度 を 求 め る 処 理.

画 像 間 差 分

+ U 

n

σ o  

u

γ

L r

h処九る批め

m

求Kを江直AA 

m

対ιV+Pの ο )

1

L l

α m

4 1

川 い

*

a

>

A

口 戸

VJ

︑ ノ

ゆ 乃

σ

LV +

DA

n

:

D A σ h U H

辺 司 引

1

4 1

* e

↑ 封

>

h [  

e

とp

︐ y h 1   T t m  

d11!

U W

h

<

一 叶

σo

F

・1 4 F U

e A

ー に

h M 1 2

象 象

白 日 画 画 像

一 日

F

力 力 画

' q ι

入 入 力 r

μU

P U

‑‑'V'VLL :

ty

4y

m M

引 引

e l l  

v P 1

; v J  即 乃

第 第 返

5 . 6   プログラム例

ここでは,

RPV

プ ロ グ ラ ミ ン グ ツ ールを用いたフログラム例を示す.図

5 . 7

に,シス テム例の概要を示す.このシステムは,

1 2

個のカラーマーカをつけた人聞を

3

台のカメラ で撮影した動画像から,マーカの

3

次元位置を計算し,結 果 を 表 示 す る 処 理 を 実 時 間 で 行 うシステムである.この例では,

PCO

, 

1

, 

2

3

台のカメラから動画像の獲得,平滑化を 行い,

PC3

, 4, 5でマーカの2次元位置を計算し,

PC6

でマーカの 3次元位置を計算し,

5 . 7 :

システム例

#PCno  keyword  i̲P 1̲51Ze  l̲nuπ1  oJC O‑Slze  a̲P

smooth  640 4803 640*4803

smooth  640*4803 6404803

slTIooth  6404803 6404803

calc2D  640*4803 42 12 4312

calc20  640480*3 4212 4*3*12 

calc20  640*480*3  4212 43*12

calc30  34

4*2*12421242*12 734 4312

<

< , <

display  4312

5 . 8 :

コネクションファイノレ例

PC7

でアニメーションを作成している

.

5 . 8

は,クラス

RPV ̲ Connectionを初期化するコネクションファイルで、ある .i ̲ PC

列 の

c

はカメラからの画像データを受け取ることを表し,

o ̲ size

IJの く は 左 の デ ー タ を ブ ロードキャス卜することを表す.keyword列によって,各

PC

でのデータ処理タスクが指 不されている

.

5 . 9

が全ての

PC

で起動されるメイン関数である

. 8

行目の

RPV ̲ I n i   t

で,ファイノレから データフロー情報をクラス

RPV ̲ Connection

に読み込む.その際,ファイル内に矛盾がない か検査も行う.

1 4

行目から

3 3

行自にかけては,クラス

RPV ̲ Connect ion 

のメンバ

keyword

にしたがって適切なユーザ関数を引数とする

RPV ̲ Invoke

を起動している 例えば,

keyword 

c a l c 2 D "の場合,前処理関数 ReadBackgraoudと,画像処理関数 Calculatre2D

が引数 として渡される.このようにユーザが

つのプログラムを各

PC

で起動すると,指定され た

keyword

にしたがって適切なユーザ関数が起動される

.

PC

で起動する関数は,図

5 . 1 0

のように定義する ここでは,

1 0

行目から

1 9

行目

1  #include  <stdio.h> 

2  #include  <rpv.h> 

3 4  int rnain(void)  5  { 

6  7  8  9  10 11  12  13 14  15 

NULL) ;  16  17  18  19 20  21  22  23  24  25  26  27  28  29  30  31  32 

NULL); 

33 34  35  }  36 

FILE *fp; 

fp fopen ("  connec.cn" "r"), 

RPV̲Connecion* connec七 =RPV Ini(fp); 

fclose(fp); 

sruc RPV̲FSM rniss̲FSM; 

rniss  FSM.FSM RPV̲DATA̲MISSING; 

if  (strcrnp(connec>keyword"srnooh")== 0)  { 

RPV̲Invoke(connect, rniss̲FSM, 0, NULL, NULL, &Srnooth, NULL, NULL, 

else  if  (srcrnp(connec>keyword"calc2D") ‑‑ 0)  { 

ReadBackgroundArg read̲background̲arg(BACKGROUND̲FILE̲NAME); 

RPV̲Invoke(connect, rniss̲FSM, 0, 

&ReadBackground, &read̲background̲arg, & 

Calculae2D,&read̲background̲arg.background,  NULL, NULL); 

else  if  (strcrnp(connect>keyword,"calc3D")  0)  { 

ReadCalibraionArg read̲calibraion̲arg(CALIBRATION̲FILE̲NAME);

RPV̲Invoke(connec rniss̲FSM, 0, 

&ReadCalibraion,&read̲calibraion̲arg,

&Calculae3D,&read̲calibraion̲arg.calibration̲data, NULL, NULL); 

else  if  (srcrnp(connec>keyword"display")  ‑‑ 0)  { 

RPV̲Invoke(connect, rniss̲FSM, 0, NULL, NULL, &Display, NULL, NULL, 

〉reurn 0; 

5 . 9 :

プログラム 例 (メイン関数)

でが前処理関数であり, 21行目以下の Calculate2Dが画像処理関数である Calculate2D  では,

6 4 0  x  480

画 素 の カ ラ ー 画 像 仁 後 段 の

PC

からのフィード、パックを入力として,画 像平面上のマーカの 2次元位置を計算し,その座標を出力している.具体的には, 23, 24  行目で、受信ノくッファ中のデータ位置へのポインタ,

2 6

, 

27

行自で、送信ノくッファ 中の書き込 み位置へのポインタ, 28行目で、受信ノくッファ中のフィード、バックデータ位置へのポインタ をそれぞれ取得し,

2 9

, 

3 0

行目でユーザ引数を読み込んでいる

.そして

,背景差分を行っ た後,差分後の画像とフィード、バックデータを入力として,マーカの

2

次元座標位置を計 けしている

.

関連したドキュメント