c++ - Opencv mat截断所有双项

标签 c++ opencv mat

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

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() double 正确吗?

最佳答案

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 坐标的顺序-上面的访问运算符。我有太多人做错了并且浪费时间。

关于c++ - Opencv mat截断所有双项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29612311/

相关文章:

opencv - 如何在C++ OpenCV代码中将PyObject变量转换为Mat

java - 在 OpenCV 3.2 中返回 Java 中的 Mat 对象

c++ - VC/C++裸属性有什么作用?

C++ 空终止对象数组

c++ - 我们如何更准确地检测人脸

python - Pybind11 cv::Mat 从 C++ 到 Python

python - 如何在我自己的数据集图像上测试 mnist

c++ - 从圆/点获得投资返回率

c++ - 有符号/无符号特征编程

c++ - 简单派生类上的 Linux GCC 链接错误