当前位置: 首页 > 知识库问答 >
问题:

显示实时相机预览Android中的YUV值

滕鸿畴
2023-03-14

这个问题已经问了很多次了,但我似乎找不到我到底想要什么。我试图创建一个相机应用程序,我想在日志中显示YUV或RGB值时,我把相机指向一些颜色。对于RGB或相应的YUV颜色格式,该值必须为0...255范围。我可以管理它们之间的转换,因为在堆栈溢出方面有许多这样的例子。但是,我不能将这些值存储到3个单独的变量中并在日志中显示它们。

package com.example.virus.bpreader;

public class CaptureVideo extends SurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback {

private SurfaceHolder mHolder;
private Camera mCamera;
private int[] pixels;

public CaptureVideo(Context context, Camera cameraManager) {
    super(context);

    mCamera = cameraManager;
    mCamera.setDisplayOrientation(90);

    //get holder and set the class as callback
    mHolder = getHolder();
    mHolder.addCallback(this);
    mHolder.setType(SurfaceHolder.SURFACE_TYPE_NORMAL);
}

@Override
public void surfaceCreated(SurfaceHolder holder) {

    //when the surface is created, let the camera start the preview
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();
        mCamera.cancelAutoFocus();

        Camera.Parameters params = mCamera.getParameters();
        //get fps
        params.getSupportedPreviewFpsRange();
        //get resolution
        params.getSupportedPreviewSizes();
        //stop auto exposure
        params.setAutoExposureLock(false);

        // Check what resolutions are supported by your camera
        List<Camera.Size> sizes = params.getSupportedPictureSizes();
        // Iterate through all available resolutions and choose one
        for (Camera.Size size : sizes) {
            Log.i("Resolution", "Available resolution: " + size.width + " " + size.height);
        }
        //set resolution at 320*240
        params.setPreviewSize(320,240);

        //set frame rate at 10 fps
        List<int[]> frameRates = params.getSupportedPreviewFpsRange();
        int last = frameRates.size() - 1;
        params.setPreviewFpsRange(10000, 10000);
        //set Image Format
        //params.setPreviewFormat(ImageFormat.NV21);
        mCamera.setParameters(params);


    } catch (IOException e) {
        e.printStackTrace();
    }


}

@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
    //need to stop the preview and restart on orientation change
    if (mHolder.getSurface() == null) {
        return;
    }
    //stop preview
    mCamera.stopPreview();

    //start again
    try {
        mCamera.setPreviewDisplay(holder);
        mCamera.startPreview();
    } catch (IOException e) {
        e.printStackTrace();
    }


}

@Override
public void surfaceDestroyed(SurfaceHolder holder) {
    //stop and release
    mCamera.startPreview();
    mCamera.release();
}

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

    int frameHeight = camera.getParameters().getPreviewSize().height;
    int frameWidth = camera.getParameters().getPreviewSize().width;
    // number of pixels//transforms NV21 pixel data into RGB pixels
    int rgb[] = new int[frameWidth * frameHeight];
    // convertion
    int[] myPixels = decodeYUV420SP(rgb, data, frameWidth, frameHeight);

    Log.d("myPixel", String.valueOf(myPixels.length));

}

//yuv decode
int[] decodeYUV420SP(int[] rgb, byte[] yuv420sp, int width, int height) {

    final int frameSize = width * height;
    int r, g, b, y1192, y, i, uvp, u, v;
    for (int j = 0, yp = 0; j < height; j++) {
        uvp = frameSize + (j >> 1) * width;
        u = 0;
        v = 0;
        for (i = 0; i < width; i++, yp++) {
            y = (0xff & ((int) yuv420sp[yp])) - 16;
            if (y < 0)
                y = 0;
            if ((i & 1) == 0) {
                // above answer is wrong at the following lines. just swap ***u*** and ***v***
                u = (0xff & yuv420sp[uvp++]) - 128;
                v = (0xff & yuv420sp[uvp++]) - 128;
            }

            y1192 = 1192 * y;
            r = (y1192 + 1634 * v);
            g = (y1192 - 833 * v - 400 * u);
            b = (y1192 + 2066 * u);

            r = Math.max(0, Math.min(r, 262143));
            g = Math.max(0, Math.min(g, 262143));
            b = Math.max(0, Math.min(b, 262143));

            // combine RGB
            rgb[yp] = 0xff000000 | ((r << 6) & 0xff0000) | ((g >> 2) & 0xff00) | ((b >> 10) | 0xff);
        }
    }
return rgb;
}
}

任何帮助都将不胜感激。

共有1个答案

景品
2023-03-14

如果问题是要从RGB数组中获得R,G和B的独立值,请检查这里。

希望有帮助!

 类似资料:
  • 在android中,如何在媒体录制器启动前显示预览界面。我的应用程序具有视频录制功能,当我导航到视频录制片段时,它会显示黑屏,当我使用开始按钮开始录制时,相机预览是显示和录制开始。 如何在录制之前开始预览.我已经添加了我在片段的onCreateView()中使用的代码- 我在“开始”按钮上使用的代码- 所以我可以用上面的代码重新编码视频,但不能在录制开始前显示预览。请帮我找到我想去的地方。因为在录

  • 我一直在努力在Android上制作我的自定义相机活动,但当旋转相机时,表面视图的纵横比会变得混乱。 在我的oncreate for the activity中,我设置了framelayout,它保存了显示相机参数的曲面视图。 然后,在曲面视图中,我设置要显示的相机参数 您可以看到,当手机旋转时,乐高男会变得更高、更瘦: 如何确保相机视图的纵横比正确?

  • 我使用相机仅显示预览(不拍照或录制视频)。 该应用程序始终处于竖屏状态(横向模式被禁用)。相机预览始终旋转90度ccw,我无法更改它(无论是还是和。 预览总是这样旋转还是依赖于设备?如果在纵向模式下总是这样,我可以在之后旋转图像。 或者有没有办法正确设置摄像头?我读了很多关于这个的帖子,但没有一个答案对我有用(Galaxy s2,Android v2.3)

  • 请帮助正确配置Android摄像头(在HTC Desire 2.3.3上测试),以便在旋转(人像)模式下从摄像头预览。预览必须占用屏幕的一半以下,它的宽度必须等于设备的宽度,缩放必须根据相机的纵横比动态设置。我的当前代码: 活动布局: AndroidManifest配置为肖像: 你可以看到图像的比例不对。如何使以适当的比例显示旋转和缩放相机预览? 部分代码取自Mixare开源项目,http://w

  • 我正在用Exoplayer以横向模式录制视频,并以纵向模式显示预览,同时在连续录制视频的时候改变方向,反之亦然,在播放器预览时显示空白屏幕。我使用ExoPlayer2.9.6作为Gradle的依赖项,并使用android OS版本10。

  • 我的意图是有一个方形相机预览。 我没有1:1比例的相机预览可用(我在Nexus 5模拟器中),所以我的最佳尺寸可用为640 x 480,所以为了适应正方形预览,我将SurfaceView尺寸设置为与纵横比相等,但将屏幕外的边距偏移一半,以在屏幕上只保留裁剪的正方形。表面视图本身的大小和偏移量是正确的,但是相机预览本身仍然在正方形内显示压缩后的预览,而不是以正确的纵横比部分地在屏幕外显示。 有什么想