使用opencv';s calcHist和UMat用于计算百分位

使用opencv';s calcHist和UMat用于计算百分位,opencv,opencl,percentile,Opencv,Opencl,Percentile,我正在编写一个函数,该函数获取给定百分比的图像(灰色)。 为此,我想将calcHist()与UMat结合使用,以加速我的代码。 但是在我尝试过的所有方法中,当我使用UMat(而不是Mat)时,花费了更多的时间 我是新来的-任何帮助都将不胜感激 这是我的密码: int CalcPercentile(UMat gray, float fPercent) { int hSize = 256; UMat hist; Mat histMat; calcHist(v

我正在编写一个函数,该函数获取给定百分比的图像(灰色)。 为此,我想将calcHist()与UMat结合使用,以加速我的代码。 但是在我尝试过的所有方法中,当我使用UMat(而不是Mat)时,花费了更多的时间

我是新来的-任何帮助都将不胜感激

这是我的密码:

int CalcPercentile(UMat gray, float fPercent)
{
    int hSize = 256;    
    UMat hist;
    Mat histMat;

    calcHist(vector<UMat>{gray}, vector<int>{0}, UMat(), hist, vector<int>{hSize}, vector<float>{0,255}); 
    int iNumPixels = gray.rows * gray.cols;
    float fSumFreqNeeded = (float)iNumPixels * fPercent;

    histMat = hist.getMat(ACCESS_READ); // or: hist.copyTo(histMat);

    int iSumFreq = 0, iVal;

    for (iVal = 0; iVal < iHistSize; iVal++)
    {
        int iCurrFreq = (int)(histMat.at<float>(iVal));
        iSumFreq += iCurrFreq;
        if (iSumFreq >= fSumFreqNeeded)
            break;
    }
    return iVal;
}
int CalcPercentle(UMat灰色,浮点百分比)
{
int-hSize=256;
乌马特历史;
Mat-histMat;
calcHist(向量{gray},向量{0},UMat(),hist,向量{hSize},向量{0255});
int iNumPixels=gray.rows*gray.cols;
float fsumfrequencneeded=(float)iNumPixels*f百分比;
histMat=hist.getMat(ACCESS_READ);//或:hist.copyTo(histMat);
int iSumFreq=0,iVal;
对于(iVal=0;iVal=fsumFreqRequired)
打破
}
返回iVal;
}
使用Mat而不是UMat的相应函数要快得多。
(但我的代码使用UMat灰度图像作为输入-再次转换为Mat需要花费太多时间)

是的,将数据移动到显卡内存和从显卡内存移动数据会产生很大的开销。如果你只想计算一幅图像的直方图,那么你将一无所获(正如你所发现的,情况恰恰相反)。只有当你有足够的工作要做时,它才有意义,因此GPU并行进行大量计算的能力超过了这个开销。谢谢你的回答!我很惊讶地意识到这一点,因为柱状图并行计算的情况似乎非常简单。因此,我认为有一种快速的方法可以通过UMat实现。