OpenCV C ++中的图像数据类型转换

时间:2013-03-18 03:00:51

标签: c++ opencv

我正在尝试将图像数据从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.data仍然是uchar *类型。有谁能够帮我?谢谢!

3 个答案:

答案 0 :(得分:1)

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

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

请注意,OpenCV 2.x为您提供了一个模拟函数cv::Mat::ptr<type>(ìnt rowIndex),以获取指向给定行开头的指针。 例如,指向双数据类型的灰色图像的第6行的开头的指针由以下内容完成:

double *rowPtr = my_mat.ptr<double>(6)

答案 1 :(得分:0)

img_data总是uchar(它是字节 - 这就是所有内存)图像类型只是跟踪你想要它的类型和范围。

Opencv CV本身就是一个C库,所以没有办法让数据实际上自动转换为其他类型,但你总是可以把它转换成它。

答案 2 :(得分: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

因此要访问imgdouble_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]);

This可能会更有帮助。