트랙바를 이용하여 그레이스케일 레벨 표현하기
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);
}
'OpenCV' 카테고리의 다른 글
OpenCV ] setTo(), copyTo() 함수와 마스크 연산 (0) | 2022.08.18 |
---|---|
OpenCV ] 데이터 파일 입출력 (0) | 2022.08.18 |
OpenCV , C++ ] 키보드와 마우스의 이벤트 처리 (0) | 2022.08.16 |
OpenCV , C++ ] 도형 그리기 + 문자열 출력 (0) | 2022.08.16 |
OpenCV , C++ ] 카메라와 동영상 파일 다루기 (0) | 2022.08.16 |