>

2016년 9월 26일 월요일

using opencv histogram cv::calcHist()

The example in opencv distribution is not clear.
Here I added some more to make it clear.

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

#include <iostream>

using namespace cv;
using namespace std;

int _brightness = 100;
int _contrast   = 100;

Mat image;

/* brightness/contrast callback function */
static void updateBrightnessContrast( int /*arg*/, void* )
{
    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);

    int nImages = 1;
    int channels[1] = {0};
    const int histDim = 1;
    int histSize[histDim] = {64};
    float hist_range[] = {0,256};
    const float *ranges[] = { hist_range };
    calcHist(&dst, nImages, channels, Mat(), 
             hist, histDim/*dimension of the histogram*/, 
             histSize, ranges);

    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[0]);

    for( int i = 0; i < histSize[0]; i++ )
        rectangle( histImage, Point(i*binW, histImage.rows),
                   Point((i+1)*binW, histImage.rows - cvRound(hist.at<float>(i))),
                   Scalar::all(0), -1, 8, 0 );
    imshow("histogram", histImage);
}
static void help()
{
    std::cout << "\nThis program demonstrates the use of calcHist() -- histogram creation.\n"
              << "Usage: \n" << "demhist [image_name -- Defaults to baboon.jpg]" << std::endl;
}

const char* keys =
{
    "{1| |baboon.jpg|input image file}"
};

int main( int argc, const char** argv )
{
    help();

    CommandLineParser parser(argc, argv, keys);
    string inputImage = parser.get<string>("1");

    // Load the source image. HighGUI use.
    image = imread( inputImage, 0 );
    if(image.empty())
    {
        std::cerr << "Cannot read image file: " << inputImage << std::endl;
        return -1;
    }

    namedWindow("image", 0);
    namedWindow("histogram", 0);

    createTrackbar("brightness", "image", &_brightness, 200, updateBrightnessContrast);
    createTrackbar("contrast", "image", &_contrast, 200, updateBrightnessContrast);

    updateBrightnessContrast(0, 0);
    waitKey();

    return 0;

}

2016년 9월 4일 일요일

Using OpenCV3.x in OpenFrameworks0.9.3, Mac OS X

0. Well, you need to install opencv3.1 somewhere in your computer. In my case, I installed it in /usr/local/ocv3 because I have opencv2.x version previously installed. All the opencv3.x files are in /usr/local/ocv3.

1. In your Xcode project, find the file Project.xconfig, and put the search path as shown in the image below.

2. Likewise, put the library files in the opencv3 folder, which was created by yourself.


3. Now, you can use opencv in openframeworks.


In the following, 
 - An image named 'bikers.jpg' is loaded into bikersImage, which is an instance of ofImage
 - The image information of bikersImage  is put into cvImg, which is an instance of cv::Mat
 - In ofApp::update() function, some image processing is applied to cvImg. In this case cv::blur() enforces box filtering.
 - To display the filtered result on the screen, you need bikersImage.update(), which updates its texture memory for display. 
 - In ofApp::display() function, the command bikersImage.update(0,0) will show you a very much blurred image, I am sure.


EOF