「動画の2値化(Movie Binalize)-C」の編集履歴(バックアップ)一覧はこちら
「動画の2値化(Movie Binalize)-C」(2009/09/24 (木) 23:37:38) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
*&this_page()
|&tags()|解説|最終更新日 &date()|&link_pdf(text=PDFで表示)|[[ダウンロード>http://www20.atwiki.jp/yosilove?cmd=upload&act=open&pageid=18&file=capbin.zip]]|
OpenCVを用いてキャプチャした動画に対して2値化を行う。
2値化の閾値はトラックバーで操作可能。
#contents
*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値化を行う。
#video(http://www.youtube.com/watch?v=znoQnLVBsuI)
*テスト環境
|MacOSX 10.5.8|
|OpenCV|
----
*&this_page()
|&tags()|解説|最終更新日 &date()|&link_pdf(text=PDFで表示)|[[ダウンロード>http://www20.atwiki.jp/yosilove?cmd=upload&act=open&pageid=18&file=capbin.zip]]|View &counter(total)|
OpenCVを用いてキャプチャした動画に対して2値化を行う。
2値化の閾値はトラックバーで操作可能。
#contents
*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値化を行う。
#video(http://www.youtube.com/watch?v=znoQnLVBsuI)
*テスト環境
|MacOSX 10.5.8|
|OpenCV|
----
表示オプション
横に並べて表示:
変化行の前後のみ表示: