動画の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) $@.cpp $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@ .c: $(CC) $@.c $(CXXFLAGS) $(LDFLAGS) $(FRAMEWOKS) -o $@
実行方法
コンパイルして
make captureBinary
実行
./captureBinary
実行結果
なにか画質が悪いが、雰囲気はつかめると思う。
白黒画像の上にはトラックバーがあり、トラックバーを動かすとTerminalにトラックバーの値が出力される。
トラックバーの値を閾値にして2値化を行う。
白黒画像の上にはトラックバーがあり、トラックバーを動かすとTerminalにトラックバーの値が出力される。
トラックバーの値を閾値にして2値化を行う。
テスト環境
MacOSX 10.5.8 |
OpenCV |
添付ファイル