1

我有一个关于代码和平的问题。

...............
 cv::Mat image;
 image = cv::imread(filename.c_str(), CV_LOAD_IMAGE_COLOR);
   if (image.empty()) {
   std::cerr << "Couldn't open file: " << filename << std::endl;
   exit(1);
 }

 cv::cvtColor(image, imageRGBA, CV_BGR2RGBA);


 imageGrey.create(image.rows, image.cols, CV_8UC1);

 *inputImage = (uchar4 *)imageRGBA.ptr<unsigned char>(0);
 *greyImage  = imageGrey.ptr<unsigned char>(0);

据我了解,我们创建了一个 openCV mat 对象。将图像读入其中。但是为什么我们使用 filename.c_str()?而不仅仅是文件名?为什么我们要从 BGR 转换为 RGBA? cv::cvtColor(image, imageRGBA, CV_BGR2RGBA);我在文档中读到 imread 将图像读取为 RGB 而不是 BGR。最让我们困惑的是这部分:

  *inputImage = (uchar4 *)imageRGBA.ptr<unsigned char>(0);
  *greyImage  = imageGrey.ptr<unsigned char>(0);

这里发生了什么事?为什么我们需要所有这些演员表?我知道这是很多问题,但我真的很想知道这里发生了什么。)

4

1 回答 1

5
  1. imread 将 aconst char*作为第一个参数,您不能将 astd::string直接传递给它
  2. OpenCV 将矩阵存储为 BGR。所以 imread 也遵守这个通道顺序(文档可能会产生误导,不要混淆图像格式读取(RGB)和内部表示(BGR))。根据您的 cuda 标签,我猜有人想将图像数据传递给 GPU。GPU 通常使用 RGBA 格式。它不仅与 BGR<->RGB 有关,还与交错格式的四个通道有关。
  3. 是模板化的Mat::ptr()(它不是强制转换!)因为 Mat 对您隐藏了数据类型。该代码是有风险的,因为它只是假设 imread 会创建 a Mat_<uchar>,因此这是可以访问的正确类型。最好首先从 a 开始cv::Mat_<uchar>,然后用于Mat_<T>::operator[]获取指向第一行的指针等。
  4. 我不知道您的代码接下来会发生什么,但如果不考虑步幅(步骤),则可能存在错误。
于 2013-05-09T22:26:03.557 回答