Opencv慢代码:有问题吗?

时间:2012-05-07 12:12:26

标签: c++ image opencv

这是一个我尝试改善图像颜色的功能。它有效,但它真的很慢......也许有人有更好的主意?

static Mat correctColor(Mat AImage) {
    Mat copyImage;
    AImage.copyTo(copyImage);
    Mat imgLab;
    cvtColor(copyImage, imgLab, CV_BGR2Lab);


    for (int y = 0; y < imgLab.rows; y++) {
        for (int x = 0; x < imgLab.cols; x++) {
            //get pixel value                
            imgLab.ptr<uchar > (y)[x * 3] = imgLab.ptr<uchar > (y)[x * 3]*0.3;
        }
    }
    cvtColor(imgLab, copyImage, CV_Lab2BGR);

    Mat img(copyImage.rows, copyImage.cols, CV_32FC3);
    copyImage.convertTo(img, CV_32FC3, 1 / 255.);        
    blur(img, img, Size(255, 255));
    Mat img32(copyImage.rows, copyImage.cols, CV_32FC3);
    copyImage.convertTo(img32, CV_32FC3, 1 / 255.);

    img.mul(img, 2);        
    divide(img32, img, img);

    img.convertTo(copyImage, CV_8U, 255.0);

    return copyImage;
 }

5 个答案:

答案 0 :(得分:1)

首先,您应该通过引用传递参数,因为您已经在代码中创建了一个克隆。

答案 1 :(得分:1)

主要问题是你在内存中创建原始图像的几个副本:AImage,copyImage,imgLab,img,img32。

首先应该是@Eric建议的优化(通过引用传递):

static Mat correctColor(Mat& AImage) {

至于你的其余代码,看看你是否可以减少你使用的副本数量。

OpenCV有一个 GPU模块,它在GPU中实现了几个功能,包括cv::blur()。此实现基于CUDA框架,因此,如果您的图形卡是NVIDIA,那么您很幸运:gpu::blur()

答案 2 :(得分:1)

优化的最佳方式是从您花费最多时间的地方开始。因此,我强烈建议您分析此代码,以确切了解代码的哪些部分最耗时。

现在,关于如何改进的一些一般性想法:

  • 如果有机会摆脱转换为Lab,请执行此操作。
  • 不要使用花车。有许多其他方法可以进行数学运算,没有浮点数。因此,首先尝试ucher(摆脱规范化步骤),然后,如果近似太差,转换为无符号短路,然后返回到uchar,当所有计算完成时。
  • 尝试寻找另一种操作而不是分裂。这是您可以在计算机上执行的最昂贵的数学运算之一。也许您可以移位,或找到具有类似结果的操作。
  • 不要通过ptr访问元素。在SO上搜索快速Mat访问。
  • 在255x255窗口上模糊是一个杀手。我怀疑它需要95%的处理时间。你真的不能让它变小吗?或使用盒式过滤器?或者根本不使用它?或者在互联网上查看FFT滤波器实现。它比opencv使用的简单窗口方法快得多。

答案 3 :(得分:0)

改善图像颜色?您应该尝试使用Histogram Equalization。查找 equalizeHist()函数。

答案 4 :(得分:-1)

除了对计划的优化。您可以在编译时添加编译器优化标志,如-o3-NDEBUG