//---------------------------------------------------------------------
//概要		: 画像を2値化する
//File Name	: binarization.cpp
//Library	: OpenCV for MS-Windows 1.0
//---------------------------------------------------------------------

#include <stdio.h>
#include <cv.h>
#include <cxcore.h>
#include <highgui.h>

#define TRACKBAR_MAX_VALUE	255	//	トラックバーの最大値
#define THRESHOLD_MAX_VALUE	255	//	2値化の際に使用する最大値

IplImage *sourceImage;	//	元画像用IplImage
IplImage *grayImage;	//	グレースケール画像用IplImage
IplImage *binaryImage;	//	2値画像用IplImage

char windowNameBinarization[] = "Binarization";	//	2値化した画像を表示するウィンドウの名前
int levels = 128;	//	トラックバーの値(2値化の際の閾値)

//
//	2値画像に変換し，表示する
//
void binarization( void ){
	//	BGRからグレースケールに変換する
	cvCvtColor( sourceImage, grayImage, CV_BGR2GRAY );

	//	グレースケールから2値に変換する
	cvThreshold( grayImage, binaryImage, levels, THRESHOLD_MAX_VALUE, CV_THRESH_BINARY );

	//	画像を表示する
	cvShowImage( windowNameBinarization, binaryImage );
}

//
//	トラックバーの値が変わった時に呼ばれる関数
//
//	引数:
//		pos : トラックバーの値
//
void on_change( int pos ){
	binarization();
}

int main( int argc, char **argv ){

	char trackbarNameThreshold[] = "Threshold";	//	2値化の際の閾値を変更するトラックバーの名前

	//	画像を読み込む
	sourceImage = cvLoadImage( "image/lena.jpg",CV_LOAD_IMAGE_ANYDEPTH | CV_LOAD_IMAGE_ANYCOLOR );

	if ( sourceImage == NULL ){
		//	画像が見つからなかった場合
		printf( "画像が見つかりません\n" );
		return -1;
	}

	//	画像を生成する
	grayImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );
	binaryImage = cvCreateImage( cvGetSize(sourceImage), IPL_DEPTH_8U, 1 );
	
	//	ウィンドウを生成する
    cvNamedWindow( windowNameBinarization );

	//	トラックバーを生成する
	cvCreateTrackbar( trackbarNameThreshold,  windowNameBinarization, &levels,TRACKBAR_MAX_VALUE, on_change );
	binarization();

	//	キー入力を待つ
	cvWaitKey( 0 );
	
	//	メモリを解放する
	cvReleaseImage( &sourceImage );
	cvReleaseImage( &grayImage );
	cvReleaseImage( &binaryImage );
	//	ウィンドウを破棄する
	cvDestroyWindow( windowNameBinarization );

	return 0;
}