我正在使用SurfaceView捕获图像并在public void onPreviewFrame4(byte []数据,相机相机)中获取Yuv Raw预览数据
我必须在onPreviewFrame上执行一些图像预处理,所以我需要将Yuv预览数据转换为RGB数据,而不是图像预处理并返回到Yuv数据.
我使用了两个函数来编码和解码Yuv数据到RGB,如下所示:
public void onPreviewFrame(byte[] data, Camera camera) {
Point cameraResolution = configManager.getCameraResolution();
if (data != null) {
Log.i("DEBUG", "data Not Null");
// Preprocessing
Log.i("DEBUG", "Try For Image Processing");
Camera.Parameters mParameters = camera.getParameters();
Size mSize = mParameters.getPreviewSize();
int mWidth = mSize.width;
int mHeight = mSize.height;
int[] mIntArray = new int[mWidth * mHeight];
// Decode Yuv data to integer array
decodeYUV420SP(mIntArray, data, mWidth, mHeight);
// Converting int mIntArray to Bitmap and
// than image …
Run Code Online (Sandbox Code Playgroud) 如何将返回的Bitmap转换BitmapFactory.decodeFile()
为YUV格式(simillar到相机的onPreviewFrame()返回字节数组)?
我正在开发基于的相机应用程序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) 在我的应用程序中,我们需要显示从服务器接收到我们的Android应用程序的视频帧,
服务器发送视频数据@ 50帧/秒,在WebM中编码,即使用libvpx对图像进行编码和解码,
现在从libvpx解码后得到YUV数据,我们可以在图像布局上显示,
目前的实现是这样的,
在JNI/Native C++代码中,我们将YUV数据转换为RGB数据在Android框架中调用
public Bitmap createImgae(byte[] bits, int width, int height, int scan) {
Bitmap bitmap=null;
System.out.println("video: creating bitmap");
//try{
bitmap = Bitmap.createBitmap(width, height,
Bitmap.Config.ARGB_8888);
bitmap.copyPixelsFromBuffer(ByteBuffer.wrap(bits));
//}catch(OutOfMemoryError ex){
//}
System.out.println("video: bitmap created");
return bitmap;
}
Run Code Online (Sandbox Code Playgroud)
要创建位图图像,
使用以下代码在imageView上显示图像,
img = createImgae(imgRaw, imgInfo[0], imgInfo[1], 1);
if(img!=null && !img.isRecycled()){
iv.setImageBitmap(img);
//img.recycle();
img=null;
System.out.println("video: image displayed");
}
Run Code Online (Sandbox Code Playgroud)
我的查询是,总的来说这个功能需要大约40毫秒,有没有办法优化它,
1 - 有没有办法向imageView显示YUV数据?
2 - 还有其他方法可以从RGB数据创建图像(位图图像),
3 - 我相信我总是在创建图像,但我想我应该只创建一次位图,并在我们收到时始终提供/提供新的缓冲区.
请分享您的观点.
我有一个原始的YUV视频文件,我想在Adobe CS6 Premiere中进行一些基本的编辑,但它无法识别该文件.我想用ffmpeg把它转换成Premiere会接受的东西,但我希望这是无损的,因为之后我会再次以YUV格式需要它.我想到了avi,mov和prores,但我似乎无法弄清楚ffmpeg的正确命令行以及如何确保它是无损的.
谢谢你的帮助.
我写了一个从YUV_420_888到Bitmap的转换,考虑到以下逻辑(据我所知):
总结该方法:内核的坐标x和y与Y平面(2d分配)的非填充部分的x和y以及输出位图的x和y都是一致的.然而,U平面和V平面具有与Y平面不同的结构,因为它们使用1个字节覆盖4个像素,此外,可能具有多于一个的PixelStride,此外它们可能也有一个可以与Y平面不同的填充.因此,为了通过内核有效地访问U和V,我将它们放入1-d分配并创建索引"uvIndex",该索引给出了在给定的1-d分配中相应的U-和V的位置( x,y)坐标(非填充)Y平面(以及输出位图).
为了保持rs-Kernel的精简,我通过LaunchOptions限制x范围来排除yPlane中的填充区域(这反映了y平面的RowStride,因此可以在内核中忽略).所以我们只需要考虑uvIndex中的uvPixelStride和uvRowStride,即用于访问u值和v值的索引.
这是我的代码:
Renderscript内核,名为yuv420888.rs
#pragma version(1)
#pragma rs java_package_name(com.xxxyyy.testcamera2);
#pragma rs_fp_relaxed
int32_t width;
int32_t height;
uint picWidth, uvPixelStride, uvRowStride ;
rs_allocation ypsIn,uIn,vIn;
// The LaunchOptions ensure that the Kernel does not enter the padding zone of Y, so yRowStride can be ignored WITHIN the Kernel.
uchar4 __attribute__((kernel)) doConvert(uint32_t x, uint32_t y) {
// index for accessing the uIn's and vIn's
uint uvIndex= uvPixelStride * (x/2) + uvRowStride*(y/2);
// get the y,u,v values
uchar yps= rsGetElementAt_uchar(ypsIn, x, y);
uchar …
Run Code Online (Sandbox Code Playgroud) 我正在寻找旋转从预览Callblack收到的YUV帧预览,到目前为止我已经创建了这个帖子,其中包含一个算法来旋转帧预览,但是正在弄乱预览图像 相机像素旋转
旋转图像的另一种方法是从YUV图像中创建一个jpg,创建一个位图,旋转一个位图并获得位图的字节数组,但我真的需要YUV格式(NV21).
仅供参考.我问这个的原因是因为我有一个支持旋转的相机应用程序,但框架预览仅以横向模式返回.
在API 21中的Camera2中是否有相同的Camera.PreviewCallback,比映射到SurfaceTexture并拉出位图更好?我需要能够以YUV的形式从相机中提取预览数据吗?
android yuv android-hardware android-camera android-5.0-lollipop
公式说:
Y = 0.299 * R + 0.587 * G + 0.114 * B;
U = -0.14713 * R - 0.28886 * G + 0.436 * B;
V = 0.615 * R - 0.51499 * G - 0.10001 * B;
Run Code Online (Sandbox Code Playgroud)
例如,如果U变量变为负数怎么办?
U = -0.14713 * R - 0.28886 * G + 0.436 * B;
Run Code Online (Sandbox Code Playgroud)
假设R和G(1)的最大值和B = 0那么,我有兴趣在OpenCV中实现这个对流函数,那么,如何处理负值?使用浮动图像?无论如何请解释我,可能是我不明白的东西..
我正在编写一个应用摄像头的应用程序,将其转换为rgb,以便进行一些处理.
它适用于使用NV21 Yuv格式的旧相机实现.我遇到的问题是使用新的Yuv格式YUV_420_888.在新的Camera2 Api中,图像不再正确转换为RGB,后者发送YUV_420_888 yuv格式而不是NV21(YUV_420_SP)格式.
有人可以告诉我如何将YUV_420_888转换为RGB?
谢谢