※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

動画の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値化を行う。



テスト環境

MacOSX 10.5.8
OpenCV


添付ファイル