Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.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
C++ (opencv rc1)是什么导致Mat乘法比每像素乘法慢20倍?_C++_Opencv_Java Native Interface_Arm_Neon - Fatal编程技术网

C++ (opencv rc1)是什么导致Mat乘法比每像素乘法慢20倍?

C++ (opencv rc1)是什么导致Mat乘法比每像素乘法慢20倍?,c++,opencv,java-native-interface,arm,neon,C++,Opencv,Java Native Interface,Arm,Neon,替换为 // 700 ms cv::Mat in(height,width,CV_8UC1); in /= 4; //40毫秒 cv::垫入(高度、宽度、cv_8UC1); 对于(int y=0;y

替换为

// 700 ms
cv::Mat in(height,width,CV_8UC1);
in /= 4;
//40毫秒
cv::垫入(高度、宽度、cv_8UC1);
对于(int y=0;y

什么会导致这种行为?这是由于opencv将带有标量乘法的Mat“升级”为带有Mat乘法的Mat,还是arm的特定失败优化?(霓虹灯已启用)。

通过测量cpu时间尝试了相同的方法

//40 ms
cv::Mat in(height,width,CV_8UC1);
for (int y=0; y < in.rows; ++y)
{
    unsigned char* ptr = in.data + y*in.step1();
    for (int x=0; x < in.cols; ++x)
    {
        ptr[x] /= 4;
    }
}
您会看到结果的不同,可能是因为
mat.divide()
执行浮点除法并舍入到下一个。虽然在更快的版本中使用整数除法,但速度更快,但结果不同

此外,openCV计算中存在饱和转换,但我猜更大的计算负载差异将是双精度除法。

这是一个非常老的问题(我几年前报告过),许多基本操作都需要额外的时间。不仅是分部,还有加法、abs等。。。我不知道这种行为的真正原因。更奇怪的是,像addWeighted这样本应花费更多时间的操作实际上非常高效。试试这个:

value: 255
1: 0.016
value: 64
2: 0.016
value: 64
3: 0.003
value: 63
它每像素执行多个操作,但运行速度比添加函数和循环实现快几倍


这是我的bug追踪器。

你能试试*1.0f/4.0?您没有初始化元素BTW浮点乘法的结果与整数除法相同,在我对每像素和整个mat乘法的测试中,不确定性/差异约为20%。您能运行perf吗?也许您可以确认它,但看起来cv::Mat只有双精度标量值的
运算符/
。所以您的机器的双精度除法计算可能比整数除法慢20倍左右?您使用的是openCV调试库还是发行库?您是否在调试或发布模式下编译代码?有/没有优化,强制单精度等?我们讨论的是什么样的矩阵大小?你能给每个元素加4:乘以0.25吗?IIRC对我来说也是“快”的,这意味着除了flop/intop计算性能之外,还有其他一些事情在进行。在我的机器上,乘/除一个浮点大约是无符号字符除以4的2倍(顺便说一句,这是位移位)。被双精度除法与float相同,我不信任它:)对于我的设置和opencv版本,addWeighted相当慢,这是另一个问题。这更奇怪,因为我刚刚检查了它,发现addWeighted快得多。您使用的是什么版本的OpenCV?您还可以用其他函数做同样的实验吗?例如abs()。
value: 255
1: 0.016
value: 64
2: 0.016
value: 64
3: 0.003
value: 63
addWeighted(in, 1.0/4, in, 0, 0, in);