如何在OpenCV中限制浮点类型Mat精度?

时间:2015-06-03 06:48:49

标签: c++ opencv matrix

我有一个CV_32FC1类型的矩阵,我想限制它的精度。例如,它有这样的价值:

[0.00021743798, 0.000174778698, 0.00011652464, 5.826234e-005, 1.561136e-005]

但是我想限制它的精度,使它看起来像这样(就像在Matlab中一样):

[0.0002, 0.0002, 0.0001, 0.0001, 0.0000]

我没有寻找std::setprecision解决方案,而是完全限制内部的矩阵值精度,因为在我的情况下,这将影响与其他矩阵的乘法。改变矩阵类型(至少)没有帮助。我该怎么办?谢谢。

2 个答案:

答案 0 :(得分:2)

可能这些应该起作用(做一些初步检查)

float customPrecision(float in)
{
     char buffer[15];
     int bufLen = sprintf(buffer, "%.4f", in);
     return atof(buffer);
}

我害怕选择缓冲区大小,因为float可以给你23位有效数字,8位指数和1位符号。有人可以帮帮忙选择合适的缓冲区大小。

根据Adi的建议,

float roundtoPrecision(float val,int precision)
{
     // Do initial checks
     float output = roundf(val * pow(10,precision))/pow(10,precision);
     return output;
}

int main()
{
    // your code goes here
    float a[] = {0.00021743798, 0.000174778698, 0.00011652464, 5.826234e-005, 1.561136e-005};

    for (int index = 0; index < 5; index++)
    {

        float val = roundtoPrecision(a[index], 4);
        cout << val << endl;
    }
    return 0;
}

答案 1 :(得分:1)

此功能limit_precision()似乎对我有用:

#include <iostream>
#include <vector>
#include <cmath>

template<typename T>
T limit_precision(T val, int precision) {
    return std::floor((val * std::pow(10, precision) + 0.5)) / std::pow(10, precision); 
}

int main() {
    std::vector<float> v{0.00021743798, 0.000174778698, 0.00011652464, 5.826234e-005, 1.561136e-005};
    for (auto &el : v) { el = limit_precision(el, 4); }
    for (auto el : v) { std::cout << el << ", "; }
    std::cout << std::endl;
}

输出是: 0.0002, 0.0002, 0.0001, 0.0001, 0