Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.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
更快的平均值计算(openCV,C+;+;) 我计算C++中图像中的多平方区域的平均值。因此,我在图像上移动了一个平方区域,并用openCV“mean”函数计算平均值,但用标准平均值计算(见下文)代替了它,这出乎意料地更快。然而,在安卓设备上需要约8毫秒,因为平均计算大约需要400次(每次平均计算需要约0.025毫秒)_C++_Performance_Opencv_Mean - Fatal编程技术网

更快的平均值计算(openCV,C+;+;) 我计算C++中图像中的多平方区域的平均值。因此,我在图像上移动了一个平方区域,并用openCV“mean”函数计算平均值,但用标准平均值计算(见下文)代替了它,这出乎意料地更快。然而,在安卓设备上需要约8毫秒,因为平均计算大约需要400次(每次平均计算需要约0.025毫秒)

更快的平均值计算(openCV,C+;+;) 我计算C++中图像中的多平方区域的平均值。因此,我在图像上移动了一个平方区域,并用openCV“mean”函数计算平均值,但用标准平均值计算(见下文)代替了它,这出乎意料地更快。然而,在安卓设备上需要约8毫秒,因为平均计算大约需要400次(每次平均计算需要约0.025毫秒),c++,performance,opencv,mean,C++,Performance,Opencv,Mean,因此,此功能几乎需要相同的时间。是否只有在计算大量重叠区域时,求和表才有用。因为在我的例子中,我只触摸每个像素进行一次计算 您可以通过预先计算一个“”,在恒定时间内(独立于矩形大小)计算任意矩形上的平均值 您需要计算一个表,其中元素(i,j)是矩形中从(0,0)到(i,j)的所有原始数据的总和,这可以在对数据的一次传递中完成 一旦有了表格,就可以在恒定时间内计算(x0,y0)和(x1,y1)之间的值之和: tab(x0, y0) + tab(x1, y1) - tab(x0, y1) - tab

因此,此功能几乎需要相同的时间。是否只有在计算大量重叠区域时,求和表才有用。因为在我的例子中,我只触摸每个像素进行一次计算

您可以通过预先计算一个“”,在恒定时间内(独立于矩形大小)计算任意矩形上的平均值

您需要计算一个表,其中元素
(i,j)
是矩形中从
(0,0)
(i,j)
的所有原始数据的总和,这可以在对数据的一次传递中完成

一旦有了表格,就可以在恒定时间内计算
(x0,y0)
(x1,y1)
之间的值之和:

tab(x0, y0) + tab(x1, y1) - tab(x0, y1) - tab(x1, y0)
要理解算法的工作原理,首先考虑一维情况更容易:要在恒定时间内计算从
v[x0]
v[x1]
的值之和,可以使用

st[0] = v[0];
for (int i=1; i<n; i++) st[i] = st[i-1] + v[i];
st[0]=v[0];

对于(int i=1;i,您可以从以下位置使用优化版本的函数menCalc:


因为使用了不同的SIMD,比如SSE、AVX等,所以速度更快。

您应该看看,因为您标记了OpenCV,您可以在OpenCV中使用它,谢谢您的这个想法!我只是在实现和测量运行时,如果性能有改进的话。我会在之后发布我的结果。也称为积分图像。我认为它还用于Viola-Jones人脸检测算法。
tab(x0, y0) + tab(x1, y1) - tab(x0, y1) - tab(x1, y0)
st[0] = v[0];
for (int i=1; i<n; i++) st[i] = st[i-1] + v[i];
SIMD_API void SimdValueSum(const uint8_t * src, size_t stride, 
    size_t width, size_t height, uint64_t * sum);