缓慢运行的方向转换代码

Slow running orientation transform code

本文关键字:转换 代码 方向 运行 缓慢      更新时间:2023-10-16

我在OpenCV编写的倒角匹配器的图像处理阶段做了一些处理,似乎70%的时间花在一个函数上:

void ImageProcessor::CarryOutOrientationTransform(int iReadBin, int iUpdateBin)
{
    cv::MatIterator_<float> lUpdateImageIterator;
    cv::MatConstIterator_<float> lReadImageIterator;
    for(lUpdateImageIterator = 
         mOrientationBins[iUpdateBin].begin<float>(),
        lReadImageIterator = 
         mOrientationBins[iReadBin].begin<float>();
        lReadImageIterator != mOrientationBins[iReadBin].end<float>();
        lUpdateImageIterator++, lReadImageIterator++)
    {
        if( *lReadImageIterator + mOrientationCost < *lUpdateImageIterator)
        {    
            *lUpdateImageIterator = *lReadImageIterator+mOrientationCost;
        }
    }
}

函数的调用方式如下:

//Transform over the image clockwise 1.5 times
for(int lI = 0; 
    lI <= mNumberOfOrientationBins + (mNumberOfOrientationBins-1)/2; 
    lI++)
{
    CarryOutOrientationTransform
    ( lI % mNumberOfOrientationBins,
      (lI+1) % mNumberOfOrientationBins );
}

,反向逆时针。

ImageProcessing::mOrientationBins是一个

std::vector<cv::Mat> mOrientationBins;

其余时间用于进行线分割和分箱,在所有20个箱上进行距离变换,然后对所有图像进行积分。(我禁用了匹配)。与其他方面相比,花在方向转换上的时间似乎大得不合理。Cachegrind还报告说,L1和LL的失败次数远远高于其他代码。我不能理解这个,因为迭代器是线性遍历的,L1的结合律是2。

花在代码上的时间是合理的还是我错过了技巧?

mOrientationBins[iReadBin].end<float>()移出for循环

我认为如果使用普通的指针样式编写循环,您将获得更多:

void ImageProcessor::CarryOutOrientationTransform(int iReadBin, int iUpdateBin)
{       
    float* updatePtr = (float*)mOrientationBins[iUpdateBin].data;
    float* readPtr = (float*)mOrientationBins[iReadBin].data;
    // here I supposed the matices are continuous. 
    // If not, you must separe it in a double for, accessing with j + i*step
    int i, length = mOrientationBins[iReadBin].cols*
                       mOrientationBins[iReadBin].rows;
    for(i=0;i<length;i++)
    {
        if( readPtr[i] + mOrientationCost < updatePtr[i])
        {    
            updatePtr[i] = readPtr[i] + mOrientationCost;
        }
    }
}

不建议在这样的上下文中使用交互器——它们是干净和安全的,但是有点懒惰。