gpt4 book ai didi

c++ - 理解 openCV 代码片段

转载 作者:太空宇宙 更新时间:2023-11-03 22:01:25 25 4
gpt4 key购买 nike

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

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

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

最佳答案

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

关于c++ - 理解 openCV 代码片段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16472038/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com