【问题标题】:Understanding openCV code snippet了解 openCV 代码片段
【发布时间】:2013-05-09 22:15:54
【问题描述】:

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

...............
 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);

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

【问题讨论】:

  • ...你从哪里得到这个代码 sn-p?
  • 从这里:udacity.com/course/cs344。此代码包含在项目中作为参考。我想了解一下,我没有openCV的经验。
  • 这和 cuda 完全没有关系吧?

标签: c++ c opencv


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

【讨论】:

  • 谢谢你,清楚的事情。现在我还有两个问题。因为,我更专注于 C 我不知道 C++ 模板。 *inputImage = (uchar4 *)imageRGBA.ptr&lt;unsigned char&gt;(0); 是否返回指向某物的指针(我假设是 mat 对象)?你是什​​么意思我的额外步骤?接下来是 cuda 设备上的内存分配。
  • 你得到一个指向矩阵第一个元素的指针。即使您不了解模板,我相信您也可以阅读并理解 docs.opencv.org 上的 OpenCV 文档
  • 但为什么我不能将 std::string 传递给它?文档给出了以下原型C++: Mat imread(const string&amp; filename, int flags=1 ),我尝试在本地机器上将 std::string 传递给它,它完美地工作。
  • OpenCV API 最近对此进行了改进,您的示例可能是为旧版本编写的。
猜你喜欢
  • 1970-01-01
  • 2022-10-02
  • 1970-01-01
  • 2019-04-16
  • 1970-01-01
  • 2015-06-23
  • 2018-06-11
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多