0

例如,我正在尝试在 C++ 中将图像数据从 char 转换为 double

Mat img = imread(image_file);
Mat img_double;
img.convertTo(img_double, CV64FC3);

然后我认为img_double应该将图像数据存储在DOUBLE中,我尝试了img_double.depth()它显示为6,这是正确的。但是,我如何访问该 DOUBLE 数据?img_double.data 仍然是 uchar* 类型。有谁能够帮我?谢谢!

4

3 回答 3

1

C/C++unsigned char用作一堆字节的通用数据类型。因此,具有 uchar 数据指针cv::Mat可避免更改每种图像类型的 thsi 指针的声明,从而避免子类化cv::Mat并允许通过memcpy或指针影响直接传输数据。

然后使用转换来返回库用户所需的数据类型。

请注意,OpenCV 2.x 为您提供了模板函数cv::Mat::ptr<type>(ìnt rowIndex)来获取指向给定行开头的指针。例如,指向双精度数据类型灰度图像第​​ 6 行开头的指针是通过以下方式完成的:

double *rowPtr = my_mat.ptr<double>(6)
于 2013-03-18T08:08:26.637 回答
0

您可以通过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所以要访问and的像素值double_img,你可以做这样的事情

printf("%d %d %d\n", img.at<Vec3b>(0, 0)[0], img.at<Vec3b>(0, 0)[1], img.at<Vec3b>(0, 0)[2]);
printf("%f %f %f\n", double_img.at<Vec3d>(0, 0)[0], double_img.at<Vec3d>(0, 0)[1], double_img.at<Vec3d>(0, 0)[2]);

可能更有帮助。

于 2013-03-18T06:22:53.943 回答
0

img_data 始终是 uchar (它是字节 - 这就是所有内存)图像类型只是跟踪您想要将其视为什么类型和范围。

Opencv CV 本质上是/曾经是一个 C 库,因此无法将数据实际自动转换为其他类型,但您始终可以直接转换它。

于 2013-03-18T03:46:52.350 回答