【问题标题】:Opencv mat truncates all double entriesOpencv mat 截断所有双条目
【发布时间】:2015-04-13 18:19:14
【问题描述】:

我正在填充我的cv::Mat matrix(size, size, cv::DataType<double>::type);(也尝试过CV_64FCV_64FC1 都产生相同的结果)。我正在遍历size 并这样做:matrix.data[x*size+y] = someFunc(); 其中someFunc() 返回一个双精度值。问题是由于某种原因,矩阵截断了双精度并仅存储整数部分。为了测试,我创建了以下 sn-p

cv::Mat mat(10, 10,  CV_64F);
for (int i=0; i<10; ++i){
    for (int j=0; j<10; ++j){
        mat.data[i*10 + j] = 1.9;
        std::cout << double(mat.data[i*10+j]) << std::endl; // outputs 1
    }
}

我做错了什么?我应该如何正确填充双精度的cv::Mat()

【问题讨论】:

    标签: c++ opencv mat


    【解决方案1】:

    cv::Mat::data 是指向unsigned char 的指针。以这种方式访问​​数据时,您需要格外注意,即将其转换为 double,以便添加到其中的偏移量是正确的。

    访问/修改cv::Mat 元素的推荐方法如下:

    cv::Mat mat( 10, 10, CV_64F );
    mat.at<double>( y, x ) = 123.; // Careful y before x!
    

    当您提前知道数据的类型时,您可以使用基于模板的cv::Mat_,它有几个方便的typedefs。上述情况可改写为:

    cv::Mat1d mat( 10, 10 ); // 1 - one channel, d - double
    mat( y, x ) = 123.;
    

    如果所有元素最初都设置为相同的值,也可以使用;

    double value = 1.9;
    cv::Mat1d mat = value * cv::Mat1d::ones( 10, 10 );
    

    但是,当然,像您正在使用的那样的双 for-loop 也可以。

    再次强调,请注意上面(y,x)-access 运算符中y- 和x- 坐标的顺序。我有太多人做错了,浪费时间。

    【讨论】:

      【解决方案2】:

      Mat::data 是一个unsigned char*。在您的情况下,在访问每个矩阵元素之前将其转换为 double 就足够了:

      ((double*)mat.data)[i*10 + j] = 1.9;
      

      std::cout << ((double*)mat.data)[i*10+j] << std::endl;
      

      请注意,这比使用 Mat::at() 访问器要快一些。

      【讨论】:

      • 我怀疑,如果它是一个指向char的指针,那么mat.data[x] = &amp;mat.data[0] + x因为&amp;mat.data[0]是char,我将在内存中推进1byte * x而不是8byte * x,因为我需要.. .
      • Mat::datauchar* 类型,这是事实。
      • 您可以了解更多关于如何访问 Mat 元素here
      猜你喜欢
      • 1970-01-01
      • 2011-04-11
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-05-08
      • 2012-03-18
      • 2015-01-04
      • 1970-01-01
      相关资源
      最近更新 更多