Opencv mat截断所有双项
Opencv mat truncates all double entries
我正在填充我的 cv::Mat matrix(size, size, cv::DataType<double>::type);
(也试过 CV_64F
和 CV_64FC1
都产生相同的结果)。我遍历 size
并执行此操作: matrix.data[x*size+y] = someFunc();
其中 someFunc()
returns 为双倍。问题是由于某种原因,矩阵截断了 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()
?
cv::Mat::data
是指向 unsigned char
的指针。以这种方式访问数据时,您要格外注意,即将其转换为双倍,以便您添加的偏移量是正确的。
access/modify 个 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()
访问器要快一些。
我正在填充我的 cv::Mat matrix(size, size, cv::DataType<double>::type);
(也试过 CV_64F
和 CV_64FC1
都产生相同的结果)。我遍历 size
并执行此操作: matrix.data[x*size+y] = someFunc();
其中 someFunc()
returns 为双倍。问题是由于某种原因,矩阵截断了 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()
?
cv::Mat::data
是指向 unsigned char
的指针。以这种方式访问数据时,您要格外注意,即将其转换为双倍,以便您添加的偏移量是正确的。
access/modify 个 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()
访问器要快一些。