[OpenCV] 트랙바 사용하기 – createTrackbar

[OpenCV] 트랙바 사용하기 – createTrackbar

 이번 글에서는 createTrackbar 함수를 사용하여 OpenCV에서 제공하는 트랙바를 만들어보겠습니다.

아래는 createTrackbar에 대한 설명입니다.

/** 
@return 1: 정상 동작, 0: 실패
@param trackbarname 트랙바 이름
@param winname 창 이름
@param value 트랙바 위치 받을 정수형 변수 주소
@param count 트랙바 최대값
@param onChange 트랙바 위치 변경 시 콜백 함수, NULL이면 value 값만 갱신
@param userdata 사용자 데이터
 */
int createTrackbar(const String& trackbarname, const String& winname, int* value, int count, TrackbarCallback onChange = 0, void* userdata = 0);

createTrackbar의 6번째 인자는 콜백 함수가 입력 됩니다. 콜백 함수로 사용되는 TrackbarCallBack에 대한 정의는 아래와 같습니다.

/**
@param pos 트랙바 현재 위치값
@param userdata 사용자 데이터
 */
typedef void (*TrackbarCallback)(int pos, void* userdata);

아래는 샘플 코드입니다.

#include <iostream>
#include "opencv2/opencv.hpp"

#ifdef _DEBUG
#pragma comment(lib, "opencv_world440d.lib")
#else
#pragma comment(lib, "opencv_world440.lib")
#endif

using namespace std;
using namespace cv;

void on_level_change(int pos, void *pUserData); // 트랙바 콜백함수

int main(void)
{
	Mat img = Mat::zeros(400, 400, CV_8UC1); // 400x400 GrayScale 이미지
	if (img.empty())
	{
		cerr << "Image Open Error" << endl;
		return -1;
	}

	imshow("image", img);
	
	createTrackbar("level", "image", 0, 256, on_level_change, (void*)&img); // 0 ~ 256을 위치값을 가진 level 트랙바 생성

	waitKey();
	destroyAllWindows();

	system("pause");
	return 0;
}

void on_level_change(int pos, void * pUserData)
{
	cout << "pos: " << pos << endl;
	Mat img = *(Mat*)pUserData;
	
	// 위치값 이미지에 설정
	img.setTo(pos);
	imshow("image", img);
}

위 함수를 실행하면 이미지의 밝기값을 변경할 수 있는 트랙바가 생성됩니다.