【发布时间】:2015-07-21 22:05:32
【问题描述】:
// 700 ms
cv::Mat in(height,width,CV_8UC1);
in /= 4;
替换为
//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;
}
}
什么会导致这种行为?是由于opencv将带有标量乘法的Mat“提升”为带有Mat乘法的Mat,还是针对arm的特定失败优化? (NEON 已启用)。
【问题讨论】:
-
你可以试试*= 1.0f/4.0; ?你没有初始化元素顺便说一句
-
浮点乘法的结果与整数除法相同,在我对每像素乘法和整个垫子乘法的测试中,不确定性/差异约为 20%。
-
你能运行 perf 吗? perf.wiki.kernel.org/index.php/Main_Page
-
也许你可以确认它,但看起来 cv::Mat 只有
operator /用于双精度标量值。那么你机器的双精度除法计算可能比 int 除法慢 20 倍左右? -
您使用的是 openCV 调试库还是发布库?您是在调试模式还是发布模式下编译代码?有/没有优化,强制单精度等?我们在谈论什么样的矩阵大小?
标签: c++ opencv java-native-interface arm neon