現在地 >> メニュー >> サンプルコード::OpenCV >> 特定範囲の2値化 >> 特定範囲の2値化(2)
関連特定範囲の2値化

問題


特定範囲の2値化のプログラムを変更して、トラックバーで上限値、下限値を動かせるようにせよ。

答え

#include <iostream>
#include <string>
#include <cv.h>
#include <highgui.h>

//--------- 各種外部変数 -----------//
const std::string filename = "file2.jpg";
enum{UPPER,LOWER};
IplImage *imgA;
IplImage *clone;


//---------- プロトタイプ宣言 ------------//
void TrackBarFuncUpper(int val);
void TrackBarFuncLower(int val);


//------------ トラックバーのデータ構造 -----------------//
struct _TrackBarData
{
	char *Name; //名前
	int Pos; // スライダの位置
	int MaxValue; //上限値
};
_TrackBarData TBData[2]={{"Upper",255,255},{"Lower",0,255}};




//----------- ここからメイン関数 -------------//
int main(int argc, char **argv)
{
	
	imgA = cvLoadImage( filename.c_str(), CV_LOAD_IMAGE_GRAYSCALE);
	if(imgA == NULL){
		return EXIT_FAILURE;
	}

	clone = cvCloneImage(imgA); //クローンを作成


	cvNamedWindow(filename.c_str(),CV_WINDOW_AUTOSIZE);
	cvInRangeS( clone, cvScalar(TBData[LOWER].Pos),cvScalar(TBData[UPPER].Pos+1), clone );

	cvShowImage(filename.c_str(),clone);

	cvCreateTrackbar( TBData[UPPER].Name, filename.c_str(), &TBData[UPPER].Pos, TBData[UPPER].MaxValue , TrackBarFuncUpper);
	cvCreateTrackbar( TBData[LOWER].Name, filename.c_str(), &TBData[LOWER].Pos, TBData[LOWER].MaxValue , TrackBarFuncLower);

	
	cvWaitKey(0); // 0秒待つ => ずっと入力待ち

	cvReleaseImage( &imgA );  //メモリ解放
	cvReleaseImage( &clone );  //メモリ解放

	cvDestroyAllWindows(); //ウィンドウを破棄



	return EXIT_SUCCESS;
}

void TrackBarFuncUpper(int val)
{
	cvCopy(imgA,clone);
	TBData[UPPER].Pos = val;
	cvInRangeS( clone, cvScalar(TBData[LOWER].Pos),cvScalar(TBData[UPPER].Pos+1), clone );
	cvShowImage(filename.c_str(),clone);

}

void TrackBarFuncLower(int val)
{
	cvCopy(imgA,clone);
	TBData[LOWER].Pos = val;
	cvInRangeS( clone, cvScalar(TBData[LOWER].Pos),cvScalar(TBData[UPPER].Pos+1), clone );
	cvShowImage(filename.c_str(),clone);

}

目次

― その他 ―

Wiki内検索

計測中...(07.10.8〜)

Save The World






▲よろしければ広告のクリックもお願いします


▲ランキングに参加しました

管理人/副管理人のみ編集できます