본문 바로가기
OpenCV

OpenCV ] 트랙바 (슬라이더 컨트롤) 사용하기

by eteo 2022. 8. 18.

 

 

 

트랙바를 이용하여 그레이스케일 레벨 표현하기

 

createTrackbar() 함수를 사용하여 트랙바를 생성하고 이 함수의 다섯번째 인자인 onChange에 지정하는 콜백함수가 트랙바의 위치가 변경될 때마다 자동으로 호출됨

 

트랙바 콜백함수의 형식

typedef void (*TrackbarCallback)(int pos, void* userdata);

 

 

// 트랙바 콜백함수
// 첫번째 매개변수는 현재 트랙바의 위치 정보,
// 두번째 매개변수는 createTrackbar() 함수에서 지정한 사용자 데이터의 포인터 값이 전달됨
void on_level_change(int pos, void* userdata)
{
	Mat img = *(Mat*)userdata;

	img.setTo(pos * 16);	// 0-255를 16단계로 나눔, 결과가 255보다 크면 포화연산 적용

	imshow("image", img);
}

void trackbar() {
	
	Mat img = Mat::zeros(400, 400, CV_8UC1);

	namedWindow("image", WINDOW_NORMAL);

	int value = 0;

/*
	int createTrackbar(const String& trackbarname, const String& winname,
                              int* value, int count,
                              TrackbarCallback onChange = 0,
                              void* userdata = 0);
    trackbarname 트랙바 이름, winname 생성할 창 이름, value 초기 위치가 담긴 정수형 변수의 주소
    onChange 트랙바 최대값(최소값은 0), userdata 콜백함수에 전달할 데이터의 포인터
                              
*/
	createTrackbar("level", "image", &value, 16, on_level_change, (void*)&img);

	imshow("image", img);
	waitKey(0);

}

 

 

 

 

 

 

 

 

 

최초 이미지를 중간값인 Scalar(128)으로 생성하고 트랙바 초기 위치를 128으로 해서 조절하는 버전

 

void on_level_change(int pos, void* userdata)
{

	//Mat img = *(Mat*)userdata;
	//img.setTo(pos * 16);	// 포화연산 적용

	Mat img = *(Mat*)userdata + pos - 128;

	imshow("image", img);
}

void trackbar() {
	
	//Mat img = Mat::zeros(400, 400, CV_8UC1);
	Mat img = Mat(400, 400, CV_8UC1, Scalar(128));

	namedWindow("image", WINDOW_NORMAL);

	//int value = 0;
	int value = 128;
	//createTrackbar("level", "image", &value, 16, on_level_change, (void*)&img);
	createTrackbar("level", "image", &value, 255, on_level_change, (void*)&img);

	imshow("image", img);
	waitKey(0);

}