标签: libyuv

使用libyuv库缩放YUV图像时出现的问题

我正在开发基于的相机应用程序Camera API 2,我发现使用libyuv有几个问题.我想转换YUV_420_888从ImageReader中检索到的图像,但是我在可重复处理的表面中进行缩放时遇到了一些问题.

本质上:图像以绿色调而不是具有相应的音调(我正在导出.yuv文件并使用http://rawpixels.net/检查它们).

您可以在此处查看输入示例: 在此输入图像描述

我执行缩放后得到的结果: 在此输入图像描述

我认为我在步幅方面做错了,或提供了无效的YUV格式(也许我必须将图像转换为另一种格式?).但是,我无法弄清楚错误在哪里,因为我不知道如何将绿色与缩放算法相关联.

这是我正在使用的转换代码,您可以忽略返回NULL,因为还有与问题无关的进一步处理.

#include <jni.h>
#include <stdint.h>
#include <android/log.h>
#include <inc/libyuv/scale.h>
#include <inc/libyuv.h>
#include <stdio.h>


#define  LOG_TAG    "libyuv-jni"

#define unused(x) UNUSED_ ## x __attribute__((__unused__))
#define  LOGD(...)  __android_log_print(ANDROID_LOG_DEBUG, LOG_TAG, __VA_ARGS__)
#define  LOGE(...)  __android_log_print(ANDROID_LOG_ERROR, LOG_TAG, __VA_ARGS_)

struct YuvFrame {
    int width;
    int height;
    uint8_t *data;
    uint8_t *y;
    uint8_t *u;
    uint8_t *v;
};

static struct YuvFrame i420_input_frame;
static struct YuvFrame i420_output_frame;

extern "C" {

JNIEXPORT jbyteArray JNICALL
Java_com_android_camera3_camera_hardware_session_output_photo_yuv_YuvJniInterface_scale420YuvByteArray(
        JNIEnv *env, …
Run Code Online (Sandbox Code Playgroud)

c++ android image yuv libyuv

27
推荐指数
1
解决办法
2148
查看次数

NV12格式和UV平面

我对NV12格式有点困惑.我正在查看页面以了解格式.我目前理解的是,如果你有一个640 x 480diminsion 的图像或视频,那么Y平面将具有 640 x 480字节,U和V都具有640/2 x 480/2.这并不意味着U平面640/2 x 480/2和V平面640/2 x 480/2都只有640/2 x 480/2字节.所以out缓冲区数组中的总字节数将是.2乘以(640/2) * (480/2)因为uv平面将占用两个字节.

byte [] myArray new byte[(640 * 480) + (2 * (640/2) * (480/2)) ];
Run Code Online (Sandbox Code Playgroud)

所以问题是我以正确的方式理解它?我是以指定NV12格式的格式制作字节数组的.

c# yuv color-space libyuv nv12-nv21

5
推荐指数
1
解决办法
7384
查看次数

在OpenCV中从RGB转换为YUYV

有没有办法从RGB转换为YUYV(YUY 4:2:2)格式?我注意到OpenCV有反向操作,但由于某种原因没有RGB到YUYV.也许有人可以指向那样做的代码(即使在OpenCV库之外)?

UPDATE

我找到了libyuv库,它可以通过BGR到ARGB转换然后ARGB到YUY2格式来工作(希望这与YUYV 4:2:2相同).但它似乎没有用.你碰巧知道yuyv缓冲区尺寸/类型应该是什么样的吗?它的步伐是什么?

澄清YUYV和YUY2是相同的格式,如果它有帮助.

更新2 这是我使用libyuv库的代码:

  Mat frame;
  // Convert original image im from BGR to BGRA for further use in libyuv
  cvtColor(im, frame, CVX_BGR2BGRA);
  // Actually libyuv requires ARGB (i.e. reverse of BGRA), so I swap channels here
  int from_to[] = { 0,3, 1,2, 2,1, 3,0 };
  mixChannels(&frame, 1, &frame, 1, from_to, 4);
  // This is the most confusing part. Not sure what argb_stride suppose to be - length of a row in bytes or size of …
Run Code Online (Sandbox Code Playgroud)

c++ opencv colors video-streaming libyuv

5
推荐指数
1
解决办法
1115
查看次数

直接在android中裁剪YUV420/NV21字节数组

我需要从相机的 onPreviewFrame 中裁剪每一帧。我想直接裁剪它,对字节数组进行操作,而不将其转换为位图。我想直接在阵列上执行此操作的原因是因为它不能太慢或太昂贵。裁剪操作后,我将直接使用输出字节数组,因此不需要任何位图转换。

int frameWidth;
int frameHeight;    

@Override
public void onPreviewFrame(byte[] data, Camera camera) {
    // Crop the data array directly.

    cropData(data, frameWidth, frameHeight, startCropX, startCropY, outputWidth, outputHeight);

}
Run Code Online (Sandbox Code Playgroud)

android crop libyuv

5
推荐指数
1
解决办法
1996
查看次数

将 YUV420Sp 图像逆时针旋转 90 度

我想将 YUV420SP 图像逆时针旋转 90 度。图像大小是 640*480,所以旋转后的图像大小变成了我不想要的 480*640,所以我想提取 480*480 数据(或任何其他正方形大小)并旋转该数据。

我已经看到:在 Android 上旋转 YUV 字节数组

但是这个答案顺时针旋转 90 度。

有人可以建议一些将 YUV420Sp 数据旋转 90(逆时针)或 270 度(顺时针)而不改变图像尺寸的函数。

android rotation matrix yuv libyuv

3
推荐指数
1
解决办法
2464
查看次数

标签 统计

libyuv ×5

android ×3

yuv ×3

c++ ×2

c# ×1

color-space ×1

colors ×1

crop ×1

image ×1

matrix ×1

nv12-nv21 ×1

opencv ×1

rotation ×1

video-streaming ×1