opencv에서 재공하는 API를 이용해 밝기 보정 프로그램을 만들어 본다.
-
코드의 상세 내용을 설명하고 가장 마지막에 전체 코드를 공개한다.
- 이미지 파일을 읽어오는 내용
- 이미지를 그레이 스케일로 읽어들이고 그 내용을 img 라는 Mat 클래스에 저장
- img 파일이 비어있을 경우 프로그램 종료
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (img.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
- image라는 이름으로 창을 하나 만든다.
- createTrackbar 를 호출하여 트랙바가 있는 창을 만든다.
- level은 트랙바 이름, image는 창 이름, 0, 200 은 트랙바의 최소, 최대값
- on_level_change는 트랙바에서 값이 바뀌었을 때 불리는 콜백 함수
- setTrackbarPos 호출로 초기 트랙바의 커서 위치를 설정한다.
namedWindow("image");
createTrackbar("level", "image", 0, 200, on_level_change, (void*)&img);
setTrackbarPos("level", "image", 100);
- on_level_change 함수 설명
- userdata는 밝기를 변경할 이미지를 의미한다. 트랙바를 생성할 당시 인자로 넘겨준 이미지와 같다.
- pos 에서 100을 빼주는 이유는 트랙바의 커서가 100일 때 이미지의 밝기는 초기 이미지와 같게하기 위해서이다.
- 이후 코드는 100을 기준으로 작거나 커지면 이미지는 어두워지거나 밝아지게 하기 위해 이미지에 b 값을 더해준다.
void on_level_change(int pos, void* userdata)
{
Mat img = *(Mat*)userdata;
int b = pos - 100;
Mat dst = img + b;
imshow("image", dst);
}
- 아래는 전체 코드이다.
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace cv;
using namespace std;
void on_level_change(int pos, void* userdata);
int main()
{
Mat img = imread("lenna.bmp", IMREAD_GRAYSCALE);
if (img.empty()) {
cerr << "Image load failed!" << endl;
return -1;
}
namedWindow("image");
createTrackbar("level", "image", 0, 200, on_level_change, (void*)&img);
setTrackbarPos("level", "image", 100);
imshow("image", img);
waitKey();
destroyAllWindows();
}
void on_level_change(int pos, void* userdata)
{
Mat img = *(Mat*)userdata;
int b = pos - 100;
Mat dst = img + b;
imshow("image", dst);
}