#include "opencv2/imgproc/imgproc.hpp" #include "opencv2/highgui/highgui.hpp" #include using namespace cv; using namespace std; int _brightness = 100; int _contrast = 100; Mat image; /* brightness/contrast callback function */ void updateBrightnessContrast( int /*arg*/, void* ) { int histSize = 64; int brightness = _brightness - 100; int contrast = _contrast - 100; /* * The algorithm is by Werner D. Streidt * (http://visca.com/ffactory/archives/5-99/msg00021.html) */ double a, b; if( contrast > 0 ) { double delta = 127.*contrast/100; a = 255./(255. - delta*2); b = a*(brightness - delta); } else { double delta = -128.*contrast/100; a = (256.-delta*2)/255.; b = a*brightness + delta; } Mat dst, hist; image.convertTo(dst, CV_8U, a, b); imshow("image", dst); calcHist(&dst, 1, 0, Mat(), hist, 1, &histSize, 0); Mat histImage = Mat::ones(200, 320, CV_8U)*255; normalize(hist, hist, 0, histImage.rows, CV_MINMAX, CV_32F); histImage = Scalar::all(255); int binW = cvRound((double)histImage.cols/histSize); for( int i = 0; i < histSize; i++ ) rectangle( histImage, Point(i*binW, histImage.rows), Point((i+1)*binW, histImage.rows - cvRound(hist.at(i))), Scalar::all(0), -1, 8, 0 ); imshow("histogram", histImage); } void help() { cout << "\nThis program demonstrates the use of calcHist() -- histogram creation.\n" "Call:\n" "demhist [image_name -- Defaults to baboon.jpg]\n" << endl; } int main( int argc, char** argv ) { // Load the source image. HighGUI use. image = imread( argc == 2 ? argv[1] : "baboon.jpg", 0 ); if( image.empty() ) { help(); return -1; } help(); namedWindow("image", 0); namedWindow("histogram", 0); createTrackbar("brightness", "image", &_brightness, 200, updateBrightnessContrast); createTrackbar("contrast", "image", &_contrast, 200, updateBrightnessContrast); updateBrightnessContrast(0, 0); waitKey(); return 0; }