我正在尝试将图像数据从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 *类型。有谁能够帮我?谢谢!
答案 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
因此要访问img
和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]);
This可能会更有帮助。