動画の2値化(Movie Binalize)-C
| C Mac OpenCV ソースコード ライブラリ | 解説 | 最終更新日 2009-09-24 | link_pdfプラグインはご利用いただけなくなりました。 |
ダウンロード | View - |
OpenCVを用いてキャプチャした動画に対して2値化を行う。 2値化の閾値はトラックバーで操作可能。
captureBinary.c
//http://www.eml.ele.cst.nihon-u.ac.jp/~momma/wiki/wiki.cgi/OpenCV/動画像処理プログラム2.html
#include <cv.h>
#include <highgui.h>
#include <stdio.h>
#define TRACKBAR_MAX_VALUE 255 // トラックバーの最大値
#define THRESHOLD_MAX_VALUE 255 // 2値化の際に使用する最大値
static int flip =1;
void binarization(IplImage *src,IplImage *binary, int threshhold);
void on_change( int pos );
int main(){
int levels = 128; // トラックバーの値(2値化の際の閾値)のデフォルト
//cvCaptureFromCAMでキャプチャ用のCvCaptureへのポインタを取得
//引数はカメラ番号
CvCapture *capture = cvCaptureFromCAM(CV_CAP_ANY);
IplImage *image,*imageBinary;
int keyInput;
if(!capture){
fprintf(stderr,"Capture failed\n");
return 1;
}
cvNamedWindow("main window",CV_WINDOW_AUTOSIZE);
cvNamedWindow("binary window",CV_WINDOW_AUTOSIZE);
//閾値を決めるトラックバーを設置
cvCreateTrackbar("Threathhold", "binary window", &levels,TRACKBAR_MAX_VALUE, on_change );
//cvcamでのコールバックの代わりに無限ループを回す
for(;;){
//フレーム画像を取得
image=cvQueryFrame(capture);
if(!image) break;
if(!imageBinary)
imageBinary = cvCreateImage (cvGetSize (image), IPL_DEPTH_8U, 1);
if(flip==1) cvFlip(image,NULL,1); //反転
cvShowImage("main window",image);
//2値値する。
binarization(image,imageBinary, levels);
cvShowImage("binary window",imageBinary);
//10msのウェイトをかけてキー入力を監視
keyInput=cvWaitKey(10);
//ESCキーでループを終了
if((keyInput&255)==27) break;
}
//後片付け
cvReleaseCapture(&capture);
cvDestroyWindow("main window");
cvDestroyWindow("binary window");
return 0;
}
/**2値画像に変換し,表示する
* srcを threshholdで2値化してbinaryに返す。
*
* ただし、binaryは1チャンネルの画像
*/
void binarization(IplImage *src,IplImage *binary, int threshhold){
// BGRからグレースケールに変換する
cvCvtColor( src, binary, CV_BGR2GRAY );
// グレースケールから2値に変換する
cvThreshold( binary, binary, threshhold, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );
}
//
// トラックバーの値が変わった時に呼ばれる関数
//
// 引数:
// pos : トラックバーの値
//
void on_change( int pos ){
printf("Changed !! pos=%d\n",pos);
}
Makefile
Mac
CXX = g++ -Wall -O2 CC = gcc -Wall -O2 CXXFLAGS = `pkg-config --cflags opencv` LDFLAGS = `pkg-config --libs opencv` FRAMEWOKS = -framework OpenGL -framework GLUT -framework Foundation .cpp: $(CXX) [email protected] $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@ .c: $(CC) [email protected] $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@
実行方法
コンパイルして
make captureBinary
実行
./captureBinary
実行結果
なにか画質が悪いが、雰囲気はつかめると思う。
白黒画像の上にはトラックバーがあり、トラックバーを動かすとTerminalにトラックバーの値が出力される。
トラックバーの値を閾値にして2値化を行う。
白黒画像の上にはトラックバーがあり、トラックバーを動かすとTerminalにトラックバーの値が出力される。
トラックバーの値を閾値にして2値化を行う。
テスト環境
| MacOSX 10.5.8 |
| OpenCV |
添付ファイル