OpenCV图像数据类型转换的c++

OpenCV Image data type conversion in C++

本文关键字:c++ 类型转换 数据 图像 OpenCV      更新时间:2023-10-16

我正在尝试将图像数据从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

所以要访问imgdouble_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库,所以没有办法让数据实际上自动转换为其他类型,但你总是可以只是强制转换它。