Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/148.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ OpenCV与Matlab的执行时间和优化_C++_Performance_Matlab_Opencv_Image Processing - Fatal编程技术网

C++ OpenCV与Matlab的执行时间和优化

C++ OpenCV与Matlab的执行时间和优化,c++,performance,matlab,opencv,image-processing,C++,Performance,Matlab,Opencv,Image Processing,我将实现一篇论文中提出的均衡。 该方法包括用公式替换每个通道的每个值 在本演示文稿的第16张幻灯片中 首先,我用两种方法在Matlab中实现了这个均衡函数:首先,我计算每个通道的直方图(计数),以便知道 小于[0 255]范围内特定值的值数。或者,在第二种方式中,我使用了一些矩阵运算(RIs),这是发布版本吗?不,我正在使用Visual Studio 2013,这些是在我编写项目代码时执行调试版本的结果。我见过Visual Studio的调试版本比发布版本慢100倍的情况(是的,慢100倍!)。

我将实现一篇论文中提出的均衡。 该方法包括用公式替换每个通道的每个值 在本演示文稿的第16张幻灯片中 首先,我用两种方法在Matlab中实现了这个均衡函数:首先,我计算每个通道的直方图(计数),以便知道
小于[0 255]范围内特定值的值数。或者,在第二种方式中,我使用了一些矩阵运算(RIs),这是发布版本吗?不,我正在使用Visual Studio 2013,这些是在我编写项目代码时执行调试版本的结果。我见过Visual Studio的调试版本比发布版本慢100倍的情况(是的,慢100倍!)。您不应比较调试生成时间。如果切换到版本生成以进行基准测试,请记住,您不能混合调试和发布,这意味着确保整个项目是在版本中生成的,包括您使用的所有DLL。对于Visual Studio,混合调试和发布通常是不安全的,因为这会导致您拥有多个独立堆(这会导致堆损坏)。好吧,你认为这只是因为它是调试版本…如果我想尝试版本的性能,我只需要切换到发布并运行?然后我将再次切换到调试并继续开发代码
//I have an RGB image in the Mat 'image'

    Mat channel[3];

    // Splitting method 1
    split(image, channel);
    Mat Red, Green, Blue;
    Blue = channel[0];
    Green = channel[1];
    Red = channel[2];

    //Splitting method 2
    // Separate the image in 3 places ( B, G and R )
//  vector<Mat> bgr_planes;
//  split(image, bgr_planes);

    double maxB, maxG, maxR, Npx;
    double min;
    double coeffB, coeffG, coeffR;
    Mat newB, newG, newR;
    Mat mapB, mapG, mapR;
    int P_Bi, P_Gi, P_Ri;
    Mat rangeValues;
    double intpart;
    double TIME;

    int histSize = 256;

    /// Set the ranges ( for B,G,R) )
    float range[] = { 0, 256 };
    const float* histRange = { range };

    bool uniform = true; bool accumulate = false;

    Mat countB, countG, countR;

    //Start the timer for the method 1
    TIME = (double)getTickCount();
    // Compute the histograms
    calcHist(&Blue, 1, 0, Mat(), countB, 1, &histSize, &histRange, uniform, accumulate);
    calcHist(&Green, 1, 0, Mat(), countG, 1, &histSize, &histRange, uniform, accumulate);
    calcHist(&Red, 1, 0, Mat(), countR, 1, &histSize, &histRange, uniform, accumulate);

    // Get the max from each channel
    minMaxLoc(Blue, &min, &maxB);
    minMaxLoc(Green, &min, &maxG);
    minMaxLoc(Red, &min, &maxR);

    //Number of pixels
    Npx = Blue.rows * Blue.cols;

    // Compute the coefficient of the formula
    coeffB = maxB / Npx;
    coeffG = maxG / Npx;
    coeffR = maxR / Npx;

    //Initialize the new channels
    newB = Mat(Blue.rows, Blue.cols, Blue.type(), cvScalar(0));
    newG = Mat(Green.rows, Green.cols, Green.type(), cvScalar(0));
    newR = Mat(Red.rows, Red.cols, Red.type(), cvScalar(0));

    //For each value of the range
    for (int value = 0; value < 255; value++)
    {
        mapB = (Blue == value)/255;
        mapG = (Green == value)/255;
        mapR = (Red == value)/255;

        //Number of pixels less or equal then 'value'
        rangeValues = countB(Range(0, value+1), Range(0, 1));
        P_Bi = cv::sum(rangeValues)[0];

        rangeValues = countG(Range(0, value + 1), Range(0, 1));
        P_Gi = cv::sum(rangeValues)[0];

        rangeValues = countR(Range(0, value + 1), Range(0, 1));
        P_Ri = cv::sum(rangeValues)[0];

        //Substitution of the value in the new channel plane
        modf((coeffB * P_Bi), &intpart);
        newB = newB + mapB * intpart;

        modf((coeffG * P_Gi), &intpart);
        newG = newG + mapG * intpart;

        modf((coeffR * P_Ri), &intpart);
        newR = newR + mapR * intpart;
    }


    TIME = 1000 * ((double)getTickCount() - TIME) / getTickFrequency();
    cout << "Method 1 - elapsed time: " << TIME << "milliseconds." << endl;

    //Here it takes 2380 milliseconds
    //....
    //....
    //....

    //Start timer of method 2
    TIME = 0;
    TIME = (double)getTickCount();

    //Get the max
    minMaxLoc(Blue, &min, &maxB);
    minMaxLoc(Green, &min, &maxG);
    minMaxLoc(Red, &min, &maxR);

    Npx = Blue.rows * Blue.cols;

    coeffB = maxB / Npx;
    coeffG = maxG / Npx;
    coeffR = maxR / Npx;

    newB = Mat(Blue.rows, Blue.cols, Blue.type(), cvScalar(0));
    newG = Mat(Green.rows, Green.cols, Green.type(), cvScalar(0));
    newR = Mat(Red.rows, Red.cols, Red.type(), cvScalar(0));

    Mat mask = cvCreateImage(Blue.size(), IPL_DEPTH_8U, 1);

    for (int value = 0; value < 255; value++)
    {

        mapB = (Blue == value) / 255;
        mapG = (Green == value) / 255;
        mapR = (Red == value) / 255;

        //Instead, there i used matrices operations
        mask = (Blue <= value)/255;
        P_Bi = cv::sum(mask)[0];

        mask = (Green <= value) / 255;
        P_Gi = cv::sum(mask)[0];

        mask = (Red <= value) / 255;
        P_Ri = cv::sum(mask)[0];


        modf((coeffB * P_Bi), &intpart);
        newB = newB + mapB * intpart;

        modf((coeffG * P_Gi), &intpart);
        newG = newG + mapG * intpart;

        modf((coeffR * P_Ri), &intpart);
        newR = newR + mapR * intpart;
    }

    //End of the timer
    TIME = 1000 * ((double)getTickCount() - TIME) / getTickFrequency();
    cout << "Method 2 - elapsed time: " << TIME << "milliseconds." << endl;
    //Here it takes 4651 milliseconds