将来自Android NDK的包含NV21帧的AImage* Package 在cv::Mat中

dauxcl2d  于 2023-11-15  发布在  Android
关注(0)|答案(1)|浏览(152)

bounty将在3小时后过期。回答此问题可获得+50信誉奖励。Kartik Aiyer正在寻找来自信誉良好的来源的答案:我正在寻找一个专门提供将Android AImage Package 到cv::Mat中的最有效方法的答案

我正在编写一个基于NDK的应用程序,并将YUV图像数据输入到一个表面,该表面以AImage* 结构传递到我的代码中。如果图像来自相机,它可以是半-NV 21中的平面形成Y的一个平面,然后是宽度相同但高度一半的VU的一个平面。如果图像来自解码器,那么我得到平面YUV 420,因此具有U和V的3个平面1/4的像素数。
我想使用一个接受外部数据指针的构造函数将其 Package 在cv::Mat中。我知道如何检测是否得到半平面或平面的YUV。问题是我不确定来自NDK的所有平面是否是一个连续的块。此外,平面的尺寸不一样,因为UV平面中的像素较少。我如何 Package AImage。以前有人做过类似的事情吗?我必须在cv::Mat中的单个平面中复制数据吗?

yftpprvb

yftpprvb1#

若要将AImage* Package 在cv::Mat中,您必须确定数据是连续的,而且是cv::Mat可以识别的格式。如果数据不是连续的,或是采用不同的格式,您可能需要复制或转换数据。

以下是C++中的一个粗略示例:

  1. // Assuming image is your AImage* object
  2. uint8_t* data = nullptr;
  3. int len = 0;
  4. AImage_getPlaneData(image, 0, &data, &len);
  5. // Assuming you've converted your data to RGB format and it's now contiguous
  6. cv::Mat mat(height, width, CV_8UC3, data);

字符串
这是一个简化的示例,不处理格式转换或数据复制。您需要根据具体需要添加这些内容。
"你可能想:“”
1.了解如何将NV21转换为RGB或将grayscale转换为C++
1.检查数据是否连续,如果不连续,如何将其复制到连续块中
1.使用您的数据测试创建cv::Mat,并查看它是否按预期工作。

展开查看全部

相关问题