了解openCV代码段

izi*_*izi 1 c c++ opencv

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

...............
 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);
Run Code Online (Sandbox Code Playgroud)

据我所知,我们创建了一个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);
Run Code Online (Sandbox Code Playgroud)

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

ypn*_*nos 5

  1. imread采用const char*第一个参数,你不能std::string直接传递给它
  2. OpenCV将矩阵存储为BGR.所以imread也遵守这个频道顺序(文档可能会误导,不要混淆图像格式读取(RGB)与内部表示(BGR)).基于你的cuda标签,我想有人想将图像数据传递给GPU.GPU通常使用RGBA格式.它不仅关于BGR < - > RGB,而且关于交错格式的四个信道.
  3. Mat::ptr()模板化(它不投射!),因为护垫你隐藏的数据类型.代码是有风险的,因为它只是假设imread会创建一个Mat_<uchar>,所以这是正确的访问类型.最好首先从a开始cv::Mat_<uchar>,然后Mat_<T>::operator[]用来获取指向第一行的指针等.
  4. 我不知道你的代码中接下来会发生什么,但如果不考虑步幅(步骤),可能会出现错误.