【问题标题】:offset converting float to uchar in cv::Mat在 cv::Mat 中将浮点数转换为 uchar 的偏移量
【发布时间】:2013-03-12 14:18:50
【问题描述】:

在加速某些进程的过程中(无法命名,抱歉),我尝试创建一个

cv::Mat_<uchar> discretization;

现在当我得到一个浮动的深度图时

cv::Mat_<float> depth_map;
discretization = depth_map / resolution_mtr;

其中 resolution_mtr 是一个浮点数。目前它的值为0.1。 当我这样做时,对于深度图中的 0.48 值,我得到离散化值 5。我的理解是它应该是 4 。我想它是四舍五入到最近的 uchar。有没有办法在不进入 for 循环的情况下解决这个问题? 基本上我想在离散化中使用底值而不是四舍五入。

【问题讨论】:

  • 为什么要将浮点除法的结果赋值给uchar
  • 基本上它是一种分箱值以加快进一步处理的方式
  • 我可以使用 int,但我不希望它能解决问题

标签: c++ opencv


【解决方案1】:

为什么不定义一个继承类 CvNoRoundMat 并覆盖它的 operator+ 呢?

【讨论】:

    【解决方案2】:

    你可以从结果中减去 0.5。

    这段代码

    float resolution_mtr = 0.1;
    float vals[] = {0.48, 0.4, 0.38, 0.31};
    cv::Mat_<float> depth_map(1,4,vals);
    cv::Mat_<uchar> discretization( depth_map  / resolution_mtr - 0.5);
    
    std::cout << "depth_map: " << depth_map << std::endl;
    std::cout << "discretization: " << discretization << std::endl;  
    

    会给你以下结果:

    depth_map: [0.47999999, 0.40000001, 0.38, 0.31]
    discretization: [4, 4, 3, 3]
    

    【讨论】:

    • 是的,但是 depth_map 也有 Nan 和 0 vals。如果为 0,则结​​果将是错误的。否则,呵呵!我怎么没想到呢!
    • 我只看到 nan 的问题,使用 0 它可以正常工作,因为 int(0.0/0.1-0.5) = int(-0.5) = 0
    猜你喜欢
    • 2020-10-29
    • 1970-01-01
    • 2011-09-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-12-29
    相关资源
    最近更新 更多