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);
}