C++ Opencv慢代码:有什么问题吗?

C++ Opencv慢代码:有什么问题吗?,c++,image,opencv,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

这里有一个函数,我试图改善图像的颜色。它能工作,但它真的很慢…也许有人有更好的主意

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;
 }
static Mat correctColor(Mat AImage){
版画图像;
copyTo(copyImage);
Mat imgLab;
cvtColor(copyImage、imgLab、CV_BGR2Lab);
对于(int y=0;y
首先,您应该通过引用传递参数,因为您已经在代码中创建了一个克隆。

改进图像颜色?你应该试试看。查找equalizeHist()函数。

主要问题是您正在内存中创建原始图像的多个副本:AImage、copyImage、imgLab、img、img32

第一个优化应该是@Eric建议的(通过引用):

至于代码的其余部分,请查看是否可以减少使用的副本数


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

最佳优化方法是从您花费最多时间的地方开始。因此,我强烈建议您分析这段代码,以准确地知道代码的哪些部分最耗时

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

  • 如果有任何机会摆脱转换成实验室,就去做吧
  • 不要使用浮动。没有浮点运算,还有很多其他的数学方法。因此,首先尝试使用uchar(摆脱规范化步骤),然后,如果近似值太差,则转换为无符号短,然后在所有计算完成后返回uchar
  • 尝试查找另一个操作,而不是divide。这是你在计算机上能做的最昂贵的数学运算之一。也许您可以移位位,或者找到具有类似结果的操作
  • 请勿通过ptr访问元件。在SO上搜索以快速访问Mat
  • 255x255窗口上的模糊是一个杀手。我怀疑这需要你95%的处理时间。你真的不能把它变小吗?还是使用盒式过滤器?还是根本不用它?或者在互联网上寻找FFT滤波器的实现。它比opencv使用的简单窗口方法快得多
除了对程序进行优化之外。您可以在编译时添加编译器优化标志,如
-o3
-NDEBUG

这应该更好地发布到网站上,因为这不是“改进”的灵丹妙药。改进不是数学定义的术语;)好。。。你说得对但是均衡对于这类任务非常有用。为什么不通过ptr访问元素呢@通过image.ptr访问元素比原始指针访问慢(提取指向图像数据的原始指针,并通过指针索引访问)
static Mat correctColor(Mat& AImage) {