2013-03-18 27 views
0

我试图到图像数据从字符转换成C++翻一番,例如OpenCV的图像数据类型的转换

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 *类型中。有谁能够帮助我?谢谢!

+1

我觉得这前一个线程的回答将帮助http://stackoverflow.com/a/1735135 – 2013-03-18 03:31:03

回答

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可能会更有帮助。

+0

这工作,谢谢! – Austin 2013-03-18 19:42:26

0

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

Opencv CV是/心脏的C库,因此无法将数据自动转换为其他类型,但您始终可以将其转换为其他类型。

1

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

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

请注意,OpenCV 2.x为您提供了预期的功能cv::Mat::ptr<type>(ìnt rowIndex)以获取指定给定行的指针。 例如,指针双数据类型的灰度图像的6行的开头是做:

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

后续问题,它如何存储其他数据类型如“double”,而所有数据由uchar表示?它“秘密”分配更多的字节数据,但保持数据类型为uchar? – Austin 2013-03-18 19:39:07

+0

没关系,它在Shafik Yaghmour提到的帖子stackoverflow.com/a/1735135中有解释 – Austin 2013-03-19 01:45:03