【问题标题】:OpenCV Image data type conversion in C++C++ 中的 OpenCV 图像数据类型转换
【发布时间】:2013-03-18 16:08:26
【问题描述】:

例如,我正在尝试在 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* 类型。有谁能够帮我?谢谢!

【问题讨论】:

标签: c++ opencv


【解决方案1】:

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

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

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

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

【讨论】:

  • 后续问题,它如何存储“double”等其他数据类型,而uchar表示的所有数据?是否“秘密”为数据分配更多字节,但将数据类型保持为 uchar?
  • 没关系,Shafik Yaghmour 提到的 stackoverflow.com/a/1735135 帖子中对此进行了解释
【解决方案2】:

您可以通过以下方式访问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 可能更有帮助。

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2023-03-31
      • 1970-01-01
      • 2011-02-03
      • 2019-07-21
      • 2018-01-05
      • 2018-12-06
      • 2015-06-26
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多