Opencv mat 截断所有双条目

  • 本文关键字:mat Opencv c++ opencv mat
  • 更新时间 :
  • 英文 :


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

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()

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

访问/修改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循环也可以。

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

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() 访问器略快。

相关内容

  • 没有找到相关文章

最新更新