이번 글에서는 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);
}
위 함수를 실행하면 이미지의 밝기값을 변경할 수 있는 트랙바가 생성됩니다.