******************************************** Indigo2用簡単ビデオライブラリ 「evideo.h」 Ver.2.0 マニュアル 1999.4.21 I.N. ******************************************** 1.はじめに    このライブラリ関数は,Indigo2におけるビデオプログラミングを簡単に行うために作られました. 2.特長  ・入力コネクタはY/C,Comp-1,Comp-2の中からプログラム中で選択切換できます.  ・付属カメラIndyCamからの入力も可能です.  ・デスクトップ上にメインとサブの2つのフルカラーXウィンドウ(640x480)が表示され,   ユーザは簡単にグラフィックを描画することができます  ・メインウィンドウはそのままビデオ出力することが可能です。  ・Xウィンドウの内容をBMP形式で保存したり,BMP形式のファイルをXウィンドウに   描画することができます.  ・HSV色変換関数が用意されています.  ・点,直線,四角形,円,ペイント,文字描画等の描画関数が用意されています. 3.使用方法  a)カレントディレクトリに「evideo.h」をコピーしておきます. b)何かプログラムを書きます.(4.のサンプルプログラムを参照)  c)cc [filename].c -o [filename] -lGL -lX11 -lvl -lgl -lm   でコンパイル&リンクします.  d)[filename] で実行します. ※エイリアスを以下のように設定しておくと便利です.   ・エイリアス設定(ホームディレクトリのファイル「.cshrc」を編集する)   alias ccc 'cc \!*.c -o \!* -lGL -lX11 -lvl -lgl -lm'   ・使い方   ccc [filename] 4.サンプルプログラム 4.1 サンプルその1 このプログラムはY/C入力コネクタからビデオ画像を読み込み 赤と青の判別を行った結果をXウィンドウとビデオ端子に出力する. 何かキーを押すと終了する.途中終了はCtrl+Cで可能. #include "evideo.h" #include main() { int x,y; int r,g,b; EV_init(0); EV_select(1); EV_getframe(); for(y=0;y<480;y++){ for(x=0;x<640;x++){ r=EV_framepointR(x,y); g=EV_framepointG(x,y); b=EV_framepointB(x,y); if(r-b>50)r=255,g=0,b=0; if(b-r>50)r=0,g=0,b=255; EV_putpixelRGB(x,y,r,g,b); } } EV_freeframe(); EV_flush(); EV_videoouton(); EV_videooutoff(); getchar(); EV_term(); return; } 4.2 サンプルその2 このプログラムはComp-1入力コネクタからビデオ映像を読み込み Xウィンドウに表示した後,BMPファイルとして保存する. #include "evideo.h" main() { int x,y,c; EV_init(0); EV_select(3); EV_getframe(); for(y=0;y<486;y++){ for(x=0;x<640;x++){ c=EV_framepointC(x,y); EV_putpixelC(x,y,c); } } EV_freeframe(); EV_flush(); EV_xwin2bmp24("test.bmp",0,0,640,480); getchar(); EV_term(); return; } 4.3 サンプルその3 このプログラムはコマンドラインで指定されたBMPファイルを読み込み Xウィンドウに表示する.     実行例:     > sample3 test.bmp #include "evideo.h" main(int argc, char *argv[]) { EV_init(0); EV_bmp2xwin(argv[1],0,0); getchar(); EV_term(); return; } 4.4 サンプルその4 このプログラムはver.1.4から追加された様々な描画関数の使用例. #include "evideo.h" main() { int x,y,i; int r,g,b,c; BMPINFO bi; EV_init(0); EV_cls(); EV_line(0,0,639,479,0xffffff); EV_box(500,300,300,200,0xff8844); EV_boxfill(300,20,200,60,0x00bbff,0x44ffaa); for(i=1;i<360;i+=6) EV_circle(320,240,i,HSV2C(i,255,255)); EV_circlefill(400,400,30,0xffffff,0x0000ff); EV_flush(); getchar(); for(i=0;i<50;i++){ x=random(640); y=random(480); r=random(256); g=random(256); b=random(256); EV_lineto(x,y,RGB2C(r,g,b)); } for(i=0;i<30;i++){ x=random(640); y=random(480); EV_lineto(x,y,0); } EV_paint(300,100,0x006600); EV_flush(); getchar(); EV_boxfill(320,240,600,400,0x0000FF,0x0000ff); for(i=0;i<360;i++){ EV_line(i,0,i,30,HSV2C(i,255,255)); } for(i=0;i<360;i++){ int h,s,v,c; c=EV_getpixelC(i,0); C2HSV(c,&h, &s,&v); EV_line(i,40,i,60,HSV2C(h,s,v)); } EV_xwin2bmp24("test.bmp",0,0,320,240); EV_getbmpinfo("test.bmp",&bi); printf("wx%d wy%d p%d\n",bi.Width,bi.Height,bi.BitCount); EV_bmp2xwin("test.bmp",200,290); EV_flush(); getchar(); EV_term(); return; } 4.5 サンプルその5 Ver.2から追加された文字描画関数,サブウィンドウ関数の使用例 #include "evideo.h" main() { int x,y,i; int r,g,b,c; BMPINFO bi; EV_init(0); EV_xwinsel(0); EV_cls(); EV_xwinsel(1); EV_cls(); EV_circle(320,240,120,0xffffff); EV_textcolor(0x00ffff); EV_locate(100,100); EV_putc('C'); EV_puts("haracter display functions\n1999.4.21\n"); EV_textcolor(0x00ff00); EV_locate(220,240); EV_printf("Hello, %s\n","evideo library!"); EV_printf("Sample program."); EV_paint(320,200,0x222222); EV_xwin2bmp8("test.bmp",200,100,200,200); EV_locate(550,50); EV_printf("main window and sub window supported."); EV_xwinsel(0); EV_bmp2xwin("test.bmp",40,70); EV_flush(); getchar(); EV_term(); return; } ----------------------------------------------------------------------------------------------------- 5.関数リファレンス 5.1 共通事項  ・Xウィンドウ(メインおよびサブ)における座標(x,y)の範囲は   (0,0)〜(639,479)まで.この範囲外の描画は無視される.   またこの範囲外の色を読み出すと0が返ってくる.  ・内部フレームメモリの座標(x,y)の範囲は(0,0)〜(639,479)まで.   ただし,EV_framepoint()関数においては座標の範囲チェックを行っていないので,   ユーザプログラム側で気を付けること.  ・r,g,b,s,vの範囲はいずれも0〜255.   hの範囲は0〜359.   カラーを指定するときの引数 c のフォーマットは 0xBBGGRR であることに注意. 5.2 void EV_init(int m); 初期化を行う.EV関数を使うはじめに1回だけ実行する. ビデオポートの初期化を行う. デスクトップにサイズ640x480,パレットRGB各8ビットのXウィンドウを作成する. メインウィンドウの番号は0,サブウィンドウの番号は1. 引数 m は入力の種類を指定する.m=0なら入力コネクタはY/C,Comp-1,Comp-2が使用できる.     付属カメラIndyCamを入力源とするときはm=1を指定する. m:0 (アナロぐビデオ入力)      1 (IndyCam:付属カメラ) 5.3 void EV_term(void); 終了処理を行う. EV関数を使い終わったら最後に1回だけ実行する. Xウィンドウを閉じる. 5.4 void EV_select(int num); 入力チャンネルを切り換える.同期を確実にするため約37msのウェイトも入る. EV_getframe()より前に実行しておく. numに指定する値は以下の通り.  0:Y/C(RCA)  1:Y/C(S-Video)  3:Comp-1(RCA)  4:Comp-2(RCA) EV_init(1)によってIndyCamが選択されているときは,この関数は意味がない. 5.5 void EV_getframe(void) 入力チャンネルからのビデオ信号を内部のフレームメモリに転送する. この関数を実行することにより,EV_framepointR()などでピクセルの値を 読むことができるようになる. 5.6 int EV_framepointR(x,y); int EV_framepointG(x,y); int EV_framepointB(x,y); int EV_framepointC(x,y); 内部のフレームメモリから指定の座標におけるピクセルの色を得る. EV_framepointR/G/B()はいずれも0〜255の値が戻る. EV_framepointC()は24ビットの値(0xbbggrr)が戻る. これらの関数は,EV_getframe()の実行後有効になり, EV_freeframe()を実行すると無効になる. 5.7 void EV_freeframe(void); 内部のフレームメモリを解放する. この関数を実行することにより,再び EV_getframe()を実行できる状態になる. 5.8 void EV_putpixelRGB(int x,int y,int r,int g,int b); void EV_putpixelC(int x,int y,int c); Xウィンドウ内の座標(x,y)に点を描画する. r,g,bはいずれも0〜255の範囲をとる. cは24ビットの値(0xbbggrr)を指定する.     ただしこれらの関数を実行すると直ちに描画されるわけではない.     Xウィンドウの内容を更新するにはEV_flush()を実行しなければならない. 5.9 int EV_getpixelR(x,y); int EV_getpixelG(x,y); int EV_getpixelB(x,y); int EV_getpixelC(x,y); Xウィンドウ内の座標(x,y)におけるピクセル値を得る. EV_getpixelR/G/B()はいずれも0〜255の値が戻る. EV_getpixelC()は24ビットの値(0xbbggrr)が戻る. 5.10 void EV_flush(void); Xウィンドウ(メインおよびサブ)の内容を更新する. EV_putpixelRGB()などで複数の点を描画した最後に実行しておく. 1点描画するたびに実行する必要はない. 5.11 void EV_videoouton(void); Xウィンドウ(メイン)の内容をビデオ信号として出力する. この関数の実行後は,EV_videooutoff()を実行するまで Xウィンドウの内容がリアルタイムでそのまま出力される. 注意)この関数を実行したあとは,EV_videooutoff()が実行されるまで    EV_getframe(),EV_framepointR/G/B/C(),EV_freeframe()は使えない.        EV_putpixelRGB/C(),EV_getpixelR/G/B/C(),EV_flush()等の描画係については使用可能. 5.12 void EV_videooutoff(void) Xウィンドウの内容をビデオ出力するのを止める. ビデオ出力の内容は,最後の映像で静止した状態になる. この状態ではEV_getframe()が実行可能である. 5.13 int EV_xwin2bmp24(char *filename,int x0,int y0,int wx,int wy);  int EV_xwin2bmp8(char *filename,int x0,int y0,int wx,int wy); Xウィンドウの内容をBMP形式でディスクに保存する EV_xwin2bmp24()のパレット形式は24ビット(そのまま/1670万色) EV_xwin2bmp8()のパレット形式は8ビット(グレースケール変換/256色) filename:ファイルネーム(拡張子は各自で付ける,大文字小文字の区別あり) x0,y0:領域の左上座標 wx,wy:領域のX幅およびY幅 戻り値:0(正常終了)     1(ファイル関係のエラーあり) 補足:グレースケール変換→各ピクセルのRGB値を輝度V=(77R+150G+29B)/256に変換して保存 参考:画像サイズが640x486の場合のファイルサイズ  933,174バイト(24ビット時)  312,118バイト( 8ビット時) 5.14 int EV_bmp2xwin(char *filename,int x0,int y0); ディスク上のBMPファイルを読み込みXウィンドウに描画する. パレット形式は2色,16色,256色,1670万色のすべてに対応. filename:ファイルネーム(拡張子は各自で付ける,大文字小文字の区別あり) x0,y0:描画開始左上座標 注意:画像が画面からはみ出す場合はプログラムが強制終了するので気を付けること 戻り値:0(正常終了)     1(ファイル関係のエラーあり) 5.15 int C2R(int c); int C2G(int c); int C2G(int c); int RGB2C(int r,int g,int b); int HSV2C(int h,int s,int v); void C2HSV(int c,int *ph,int *ps,int *pv); 色変換関数      c:0xBBGGRR 0〜16777215 r:0xRR 赤 0〜255 g:0xGG 緑 0〜255 b:0xBB 青 0〜255 h:色相 0〜359 s:彩度 0〜255 v:明度 0〜255 ph:色相格納ポインタ ps:彩度格納ポインタ pv:明度格納ポインタ 5.16 int random(int n);      0〜(n-1)までの間で,乱数を得る. ただし n=0〜32767 5.17 int EV_getbmpinfo(char *filename, BMPINFO *bmpinfo); BMPファイルの情報を得る filename:ファイルネーム bmpinfo :構造体BMPINFOデータ格納用ポインタ      戻り値 0:No error 1:File not found 2:Not "BMP" file 構造体BMPINFO typedef struct BMPINFO { int Size; ファイルサイズ int Width;     画像の幅 int Height;     画像の高さ short Planes;    画像の枚数(通常1) short BitCount;  パレット(1/4/8/24ビット) int Compression; 圧縮(通常0) int SizeImage;   画像データのサイズ int XPelsPerMeter; int YPelsPerMeter; int ClrUsed; int ClrImportant; int Palette[256]; パレットデータ } BMPINFO; 5.18 void EV_cls(void);      Xウィンドウ描画関数      画面を黒色で消去する 5.19 void EV_line(int x1,int y1,int x2,int y2,int c);      Xウィンドウ描画関数      ライン描画 5.20 void EV_lineto(int x,int y,int c)      Xウィンドウ描画関数      ライン描画      始点は前回のline/lineto関数の(x2,y2) 5.21 void EV_box(int x1,int y1,int x2,int y2,int c)      Xウィンドウ描画関数      ボックスの描画 5.22 void EV_boxfill(int x1,int y1,int x2,int y2,int c,int f)      Xウィンドウ描画関数      ボックス(塗りつぶし)の描画      c:外枠の色      f:内部の色 5.23 void EV_circle(int x0,int y0,int r,int c)      Xウィンドウ描画関数      円の描画      r:半径 5.24 void EV_circlefill(int x0,int y0,int r,int c,int f)      Xウィンドウ描画関数      円(塗りつぶし)の描画      r:半径      c:外円の色      f:内部の色 5.25 void EV_paint(int x,int y,int c)      Xウィンドウ描画関数      ペイント描画      c:塗りつぶす色      座標(x,y)の描画する前の色が続く領域を塗りつぶす 5.26 void EV_locate(int x,int y);      文字描画の開始点(左上)を指定する. 5.27 void EV_textcolor(int c)      文字の色を指定する. 5.28 void EV_putc(char c);      1文字を描画する.      ただし,文字コード c は 0x20〜0x7F の範囲だけサポートする.      それ以外の文字は描画しない. 5.29 void EV_puts(char *s)      文字列を描画する. 5.30 void EV_printf(char *format, ...)      書式付き文字列を表示する.      書式は printf() と同様. 5.31 void EV_xwinsel(int i)      描画対象となるウィンドウを選択する.      EV_init()により初期化した直後はメインが選択されている. i:0(メインウィンドウ)       1(サブウィンドウ) 6.変更履歴 I.N. 1997.11.4  (ver.1.0 改訂版) 1997.12.11 (ver.1.1) 1997.12.12 (ver.1.2) 1999. 4. 1 (ver.1.3) 1999. 4.19 (ver.1.4)       1999. 4.21 (ver.2.0)         ver.1.4 各種描画関数を追加 ウィンドウサイズを640x486から640x480へ変更        付属カメラIndyCamサポート        HSV変換関数追加   ver.2.0 文字描画関数を追加        メインとサブの2個のウィンドウ End of File