1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889 |
- /**
- * @function calcHist_Demo.cpp
- * @brief Demo code to use the function calcHist
- * @author
- */
- #include "opencv2/highgui.hpp"
- #include "opencv2/imgcodecs.hpp"
- #include "opencv2/imgproc.hpp"
- #include <iostream>
- using namespace std;
- using namespace cv;
- /**
- * @function main
- */
- int main(int argc, char** argv)
- {
- //! [Load image]
- CommandLineParser parser( argc, argv, "{@input | lena.jpg | input image}" );
- Mat src = imread( samples::findFile( parser.get<String>( "@input" ) ), IMREAD_COLOR );
- if( src.empty() )
- {
- return EXIT_FAILURE;
- }
- //! [Load image]
- //! [Separate the image in 3 places ( B, G and R )]
- vector<Mat> bgr_planes;
- split( src, bgr_planes );
- //! [Separate the image in 3 places ( B, G and R )]
- //! [Establish the number of bins]
- int histSize = 256;
- //! [Establish the number of bins]
- //! [Set the ranges ( for B,G,R) )]
- float range[] = { 0, 256 }; //the upper boundary is exclusive
- const float* histRange[] = { range };
- //! [Set the ranges ( for B,G,R) )]
- //! [Set histogram param]
- bool uniform = true, accumulate = false;
- //! [Set histogram param]
- //! [Compute the histograms]
- Mat b_hist, g_hist, r_hist;
- calcHist( &bgr_planes[0], 1, 0, Mat(), b_hist, 1, &histSize, histRange, uniform, accumulate );
- calcHist( &bgr_planes[1], 1, 0, Mat(), g_hist, 1, &histSize, histRange, uniform, accumulate );
- calcHist( &bgr_planes[2], 1, 0, Mat(), r_hist, 1, &histSize, histRange, uniform, accumulate );
- //! [Compute the histograms]
- //! [Draw the histograms for B, G and R]
- int hist_w = 512, hist_h = 400;
- int bin_w = cvRound( (double) hist_w/histSize );
- Mat histImage( hist_h, hist_w, CV_8UC3, Scalar( 0,0,0) );
- //! [Draw the histograms for B, G and R]
- //! [Normalize the result to ( 0, histImage.rows )]
- normalize(b_hist, b_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
- normalize(g_hist, g_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
- normalize(r_hist, r_hist, 0, histImage.rows, NORM_MINMAX, -1, Mat() );
- //! [Normalize the result to ( 0, histImage.rows )]
- //! [Draw for each channel]
- for( int i = 1; i < histSize; i++ )
- {
- line( histImage, Point( bin_w*(i-1), hist_h - cvRound(b_hist.at<float>(i-1)) ),
- Point( bin_w*(i), hist_h - cvRound(b_hist.at<float>(i)) ),
- Scalar( 255, 0, 0), 2, 8, 0 );
- line( histImage, Point( bin_w*(i-1), hist_h - cvRound(g_hist.at<float>(i-1)) ),
- Point( bin_w*(i), hist_h - cvRound(g_hist.at<float>(i)) ),
- Scalar( 0, 255, 0), 2, 8, 0 );
- line( histImage, Point( bin_w*(i-1), hist_h - cvRound(r_hist.at<float>(i-1)) ),
- Point( bin_w*(i), hist_h - cvRound(r_hist.at<float>(i)) ),
- Scalar( 0, 0, 255), 2, 8, 0 );
- }
- //! [Draw for each channel]
- //! [Display]
- imshow("Source image", src );
- imshow("calcHist Demo", histImage );
- waitKey();
- //! [Display]
- return EXIT_SUCCESS;
- }
|