使用原始相机 byte[] 数组实现增强现实

发布于 2024-11-18 15:54:12 字数 335 浏览 3 评论 0原文

我正在开发一个增强现实应用程序,因此我需要捕获相机预览,为其添加视觉效果,并将其显示在屏幕上。我想使用 PreviewCallbackonPreviewFrame 方法来执行此操作。这为我提供了一个包含原始图像数据(YUV420 编码)的 byte[] 变量以供使用。

尽管我搜索了多个小时的解决方案,但我找不到一种方法将此 byte[] 变量转换为我可以使用甚至在屏幕上绘制的任何图像格式。

我最好将 byte[] 数据转换为某种可用于计算和绘图的 RGB 格式。

有没有正确的方法来做到这一点?

I'm developing an Augmented Reality app, so I need to capture the camera preview, add visual effects to it, and display it on screen. I would like to do this using the onPreviewFrame method of PreviewCallback. This gives me a byte[] variable containing raw image data (YUV420 encoded) to work with.

Even though I searched for a solution for many hours, I cannot find a way to convert this byte[] variable to any image format I can work with or even draw on the screen.

Preferably, I would convert the byte[] data to some RGB format that can be used both for computations and drawing.

Is there a proper way to do this?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

能怎样 2024-11-25 15:54:12

几个月前,当我不得不做一些事情时,我偶然发现了同样的问题
相机帧上的边缘检测。这对我来说非常有效。
尝试一下。

public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) 
        {
            camera.setPreviewCallback(new PreviewCallback() {

                public void onPreviewFrame(byte[] data, Camera camera) {

                    Camera.Parameters parameters = camera.getParameters();

                    int width = parameters.getPreviewSize().width;
                    int height = parameters.getPreviewSize().height;

                    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
                    Rect rect = new Rect(0, 0, width, height); 
                    YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,width,height,null);
                    yuvimage.compressToJpeg(rect, 100, outstr);
                    Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
                }
}
}

您现在可以将位图用于所有处理目的。
获取感兴趣的像素,您就可以轻松地进行 RGB
或者上面有HSV的东西。

I stumbled upon the same issue a few months back when I had to do some
edge detection on the camera frames. This works perfectly for me.
Try it out.

public void surfaceChanged(SurfaceHolder holder,int format, int width,int height) 
        {
            camera.setPreviewCallback(new PreviewCallback() {

                public void onPreviewFrame(byte[] data, Camera camera) {

                    Camera.Parameters parameters = camera.getParameters();

                    int width = parameters.getPreviewSize().width;
                    int height = parameters.getPreviewSize().height;

                    ByteArrayOutputStream outstr = new ByteArrayOutputStream();
                    Rect rect = new Rect(0, 0, width, height); 
                    YuvImage yuvimage=new YuvImage(data,ImageFormat.NV21,width,height,null);
                    yuvimage.compressToJpeg(rect, 100, outstr);
                    Bitmap bmp = BitmapFactory.decodeByteArray(outstr.toByteArray(), 0, outstr.size());
                }
}
}

You can use the bitmap for all your processing purposes now.
Get the interested pixel and you can comfortably do your RGB
or HSV stuff on it.

过气美图社 2024-11-25 15:54:12

Imran Nazar 编写了有关增强现实的两部分教程,您可能会发现它很有用。尽管他最终使用了 NDK,第一部分大部分第二部分详细介绍了您需要的内容仅使用爪哇。

我相信 Bitmap.createBitmap 是您需要的方法。

Imran Nazar has writen a two part tutorial on augmented reality which you may find useful. Although he eventually uses the NDK, the first part and most of the second part detail what you need using just Java.

I believe Bitmap.createBitmap is the method you need.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文