EasyAR 作为 OpenCV Mat 访问相机帧

Posted

技术标签:

【中文标题】EasyAR 作为 OpenCV Mat 访问相机帧【英文标题】:EasyAR access Camera Frames as OpenCV Mat 【发布时间】:2017-09-10 03:12:15 【问题描述】:

我正在使用 EasyAR 在 android 上使用 C++ 开发应用程序,我正在尝试使用 opencv,我想要实现的是:获取从相机获取的 easyAR 帧作为 Mat 并执行使用 opencv 进行一些处理,然后返回要查看的帧。

为什么要这么做?索性我只是在EasyAR摄像头框架跨平台接入之后(我觉得真的很快,我刚建了样例HelloAR)

在示例 HelloAR 中,有一行 auto frame = streamer->peek();

    有没有办法将其转换为在 openCV 中使用?

    ios 和 Android(最低 API 16)中是否有其他方法可以从 c++ 访问相机帧?

感谢您的帮助,谢谢。

这里是示例链接,我使用的是 HelloAR http://s3-us-west-2.amazonaws.com/easyar/sdk/EasyAR_SDK_2.0.0_Basic_Samples_Android_2017-05-29.tar.xz

【问题讨论】:

【参考方案1】:

好的,我设法解决了这个问题 所以简单的 frame(EasyAR 中的 Frame 类)包含一个图像向量(可能是同一帧的不同图像),访问该向量会返回一个 Image 对象,该对象带有一个名为 data (字节数组)的方法,可用于初始化 Mat在opencv中

这是为任何搜索相同内容的人澄清的代码

unsigned char* imageBuffer = static_cast<unsigned char*>(frame->images().at(0)->data());

int height = frame->images()[0]->height(); // height of the image
int width = frame->images()[0]->width(); // width of image
// Obtained Frame is YUV21 by default, so convert that to RGBA
cv::Mat _yuv(height+height/2, width, CV_8UC1, imageBuffer);
cv::cvtColor(_yuv, _yuv, CV_YUV2RGBA_NV21);

【讨论】:

以上是关于EasyAR 作为 OpenCV Mat 访问相机帧的主要内容,如果未能解决你的问题,请参考以下文章

Mat的单通道作为矩阵Opencv

opencv 将数据从 *Mat 复制到 Mat

使用 OpenCV 多通道 Mat 沿通道方向访问像素

Qt 信号槽 cv::Mat 无法读取内存访问冲突

OpenCV for Android:使用 Imgproc.cvtColor 将相机预览从 YUV 转换为 RGB

OpenCV Mat 数据成员访问