我正在尝试将图像数据从char转换为c++中的double,例如
Mat img = imread(image_file);
Mat img_double;
img.convertTo(img_double, CV64FC3);
然后我认为img_double应该在DOUBLE中存储图像数据,我尝试了img_double.depth(),它显示为6,这是正确的。然而,我如何访问DOUBLE数据??img_double。数据仍然是uchar*类型。有人能帮帮我吗?谢谢!
C/c++使用unsigned char
作为一堆字节的通用数据类型。因此,在cv::Mat
中使用uchar数据指针避免了为每种类型的图像更改该指针的声明,从而避免了cv::Mat
的子类化,并允许通过memcpy
或指针影响直接传输数据。
强制类型转换返回库用户所需的数据类型。
注意OpenCV 2。x为您提供了模板化函数cv::Mat::ptr<type>(ìnt rowIndex)
,用于获取指向给定行开头的指针。例如,指向双精度数据类型的灰色图像的第6行开头的指针是这样做的:
double *rowPtr = my_mat.ptr<double>(6)
可以通过以下方式访问img_double
的数据:
img_double.at<Vec3d>(i, j)[0] -> B
img_double.at<Vec3d>(i, j)[1] -> G
img_double.at<Vec3d>(i, j)[2] -> R
所以要访问img
和double_img
的像素值,你可以这样做
printf("%d %d %dn", img.at<Vec3b>(0, 0)[0], img.at<Vec3b>(0, 0)[1], img.at<Vec3b>(0, 0)[2]);
printf("%f %f %fn", double_img.at<Vec3d>(0, 0)[0], double_img.at<Vec3d>(0, 0)[1], double_img.at<Vec3d>(0, 0)[2]);
img_data始终是uchar(它是字节-这就是所有内存),图像类型只是跟踪您想要将其视为的类型和范围。
Opencv CV是/是一个C库,所以没有办法让数据实际上自动转换为其他类型,但你总是可以只是强制转换它。