RGB转YUV420算法的效率
我编写了一种将RGB图像转换为YUV420的算法.我花了很长时间试图使它更快,但是我没有其他任何提高其效率的方法这样做的方法(算法在C ++中,但C和汇编器也是选项) namespace { // lookup tables int lookup_m_94[] = { 0, -94, -188, -282, -376, -470, -564, -658, -752, -846, -940, -1034, -1128, -1222, -1316, -1410, -1504, -1598, -1692, -1786, -1880, -1974, -2068, -2162, -2256, -2350, -2444, -2538, -2632, -2726, -2820, -2914, -3008, -3102, -3196, -3290, -3384, -3478, -
2 2023-05-23
编程技术问答社区
Numpy点积
我的图像用numpy阵列表示,即每个像素是一个阵列[r,g,b]. 现在,我想使用矩阵乘法在YUV中将其转换,并尝试不使用循环. self.yuv=self.rgb self.yuv=dot([[ 0.299, 0.587, 0.114 ], [-0.14713, -0.28886, 0.436 ], [ 0.615, -0.51499, -0.10001]], self.yuv[:,:]) 我得到错误 - 对象未对齐.我想那是因为self.yuv [i,j]不是垂直向量.旋转无济于事. 有什么想法? 解决方案 您的矩阵具有Shape (3, 3),而您的图像具有Shape (rows, cols, 3)和np.dot在a的最后一个轴上的总乘积和b的次要轴." 最简单的解决方案是逆转np.dot内部操作数的顺序并转换您的转换矩阵: rgb2yuv =
2 2023-05-22
编程技术问答社区
当一次对多个YuvImage使用compresstojpeg时出现内存不足的情况
我正在构建一个可缓冲 n 相机帧的应用程序,当用户点击按钮时,使用所有保存的框架保存照片时,都会应用效果. 我要保存照片并在 asynctask上处理帧.当我执行它时,我从屏幕上删除所有内容,仅留下 textview 显示保存照片的进度. 当前 asynctask doInBackground看起来像这样: protected Void doInBackground(Integer... params) { int w = mBuffer.get(0).getWidth(); int h = mBuffer.get(0).getHeight(); int lineHeight = h / mBuffer.size(); int currentHeight = 0; Log.d("output", "saving photo "+w+", "+h); for (int i = 0; i
2 2023-05-15
编程技术问答社区
改进SSE(SSSE3)YUV到RGB的代码
我希望优化我为将YUV转换为RGB的一些SSE代码(均和包装的YUV功能). 我目前正在使用SSSE3,但是如果以后的SSE版本有有用的功能,则可以. 我主要对如何解决处理器摊位等感兴趣. 任何人都知道有任何对SSE代码进行静态分析的工具? ; ; Copyright (C) 2009-2010 David McPaul ; ; All rights reserved. Distributed under the terms of the MIT License. ; ; A rather unoptimised set of ssse3 yuv to rgb converters ; does 8 pixels per loop ; inputer: ; reads 128 bits of yuv 8 bit data and puts ; the y values converted to 16 bit in xmm0 ; the u values con
0 2023-05-12
编程技术问答社区
苹果A4上的YUV转RGBA,我应该使用着色器还是NEON?
我使用OpenGL ES和FFMPEG编写了Apple TV的媒体播放器框架. 转换为RGBA是在OpenGL ES上渲染所必需的,使用SWSCALE的软转换非常缓慢,因此使用Internet上的信息我提出了两个想法:使用neon(例如 here )或使用fragment着色器和gl_luminance和gl_luminance_alpha. 我几乎对OpenGL一无所知,第二个选项仍然不起作用:) 您能给我任何指导如何进行吗? 预先感谢您. 解决方案 绝对值得学习OpenGL ES2.0着色器: 您可以在GPU和CPU之间加载平衡(例如,在GPU呈现当前帧时,随后帧的视频解码). 视频框架在任何情况下都需要转到GPU:如果您的视频具有4:2:0采样Chrominance. 您可以免费使用GPU硬件插装器免费获得4:2:0的Chrominance上采样. (您的着色器应配置为对Y>和C{b,r}纹理使用相同的顶点坐标,实际上将色彩纹理拉伸到同一区域.) 在i
6 2023-05-11
编程技术问答社区
CVOpenGLESTextureCacheCreateTextureFromImage返回错误 6683
我目前正在尝试使用YUV420格式(Bi-Planar)在OpenGL中绘制图像.我收到原始数据,并试图将其解析为cvpixelbuffer,然后使用cvopengEngleStextextextextextextexlecachecreateTextureFromimage通过上述缓冲区.虽然我在cvpixelbuffer中解析时不会收到任何错误,但是当试图传递到cvopengEnglestextextextextextextextexecreateTeTextureFromimage时,我会收到错误(-6683).我正在尽力遵循Apple的Glcameraripple示例代码 - 再次,我正在使用原始图像数据而不是来自相机的数据. 希望有人可以解释我在这里缺少的是什么 - 我认为这是一个缺失的属性... fyi,平面0是y平面,平面1是紫外线平面 - 紫外线平面应为y平面的宽度和高度的一半. size_t numPlanes = image->GetNumPlane
4 2023-05-11
编程技术问答社区
如何在OpenGL ES中显示YUV格式的数据而不转换RGB?
我正在研究iOS的OpenGL ES. 我想知道可以在不转换RGB的情况下显示YUV格式的数据. 在大多数情况下,YUV数据必须转换RGB才能显示.但是,转换过程非常慢,因此,这并不能顺利显示. 因此,我想尝试在不转换为RGB的情况下进行分配数据. 是否可以?如果可能的话,我该怎么办? 请让我提供建议. 解决方案 我认为,在OpenGl ES中不可能显示YUV数据而不转换为RGB数据. 其他解决方案 您可以使用OpenGL ES 2.0着色器轻松地进行此操作.我将此技术用于我的YUV")带到RGB.您可以在单独的GL_LUMINANCE纹理中将每个{Y, Cb, Cr}通道都有,或者如果您的色彩数据已经交织在一起,则可以使用{Cb, Cr}纹理组合质感(Apple称此为Bi-Planar格式). 请参阅我对问题的相关答案 yuv to apple a4上的rgba,我应该在stackoverflow上使用着色器或霓虹灯吗? 您也可以使用ES 1.1的固定渲染管
0 2023-05-11
编程技术问答社区
安卓MediaCodec输出格式。GLES外部纹理(YUV / NV12)到GLES纹理(RGB)。
我目前正在尝试在Android上开发视频播放器,但正在使用颜色格式挣扎. 上下文: i通过 MediaStractor/MediaCodec 的标准组合提取和解码视频.因为我需要提取的框架作为opengles纹理(rgb),我设置了我的解码器( mediacodec ),以便它为外部GLES纹理( gl_texture_external_oes)提供. )通过surfaceTexture.我知道我的HW解码器的数据输出在 nv12 ( yuv420semiplanar )格式中,我需要通过渲染将其转换为RGB(用碎片着色器做一个转换). MediaCodec ---> GLES外部纹理(NV12) [1] --->渲染---> GLES纹理(RGB) 我挣扎的点是:如何访问GLES外纹理中包含的特定Y,U和V值( [1] ).我不知道如何设置GLES纹理内存,也不知道如何访问它(除了" texture()和" texelfetch()" GLSL函数外, 有没有办法访
6 2023-05-11
编程技术问答社区
用于OpenGL ES中YUV420到RGB转换的纹理
我必须使用Freescale IMX53处理器上的AMD GPU(OpenGL ES 2.0,EGL)将YUV420P图像转换为RGB Colorspace. Linux OS,无X11.为了实现这一目标,我应该能够创建一个持有YUV420P数据的合适图像:这可以是YUV420P/YV12图像类型或3个简单的8位图像,每个组件一个(y,u,v). glteximage2d被排除在外,因为它很慢,所以yuv420p帧是实时视频解码 @25fps的结果,而使用glteximage2d,我们无法保持所需的帧率. 有一个替代方法:eglcreateimagekhr/gleglimageTargetTexture2does.唯一的问题是这些无法处理适合YUV420/YV12数据的任何图像格式. EGLint attribs[] = { EGL_WIDTH, 800, EGL_HEIGHT, 480, EGL_IMAGE_FORMAT_FSL, EGL_FORMAT_Y
2 2023-05-10
编程技术问答社区
使用OpenGL ES着色器将YUV转换为RGB
我只想用一个包含YUV数据的一个采样器将YUV转换为OpenGL ES着色器中的RGB.我的代码如下: 1)我将YUV数据发送到纹理: GLES20.glTexImage2D(GLES20.GL_TEXTURE_2D, 0, GLES20.GL_LUMINANCE, mData.w, mData.h * 3 / 2, 0, GLES20.GL_LUMINANCE, GLES20.GL_UNSIGNED_BYTE, ByteBuffer.wrap(mData.yuv)); 2)我的顶点着色器: attribute vec4 position; attribute vec2 inputTextureCoordinate; attribute mediump float width; varying vec2 v_texCoord; varying mediump vec2 v_vuTexCoord; varying me
14 2023-05-10
编程技术问答社区
CVOpenGLESTextureCacheCreateTextureFromImage返回-6683(kCVReturnPixelBufferNotOpenGLCompatible)
我分别从视频框架中提取了y u v数据,并将它们保存在data[0],data[1],data[2];中640*480;现在我创建pixelBuffer如下: void *pYUV[3] = {data[0], data[1], data[2]}; size_t planeWidth = {640, 320, 320}; size_t planeHeight = {480, 240, 240}; size_t planeBytesPerRow = {640, 320, 320}; CVReturn renturn = CVPixelBufferCreateWithPlanarBytes(kCFAllocatorDefault, 640, 480, kCVPixelForma
6 2023-05-10
编程技术问答社区
iOS-如何使用openGL绘制YUV图像
当前,我正在尝试使用OpenGL绘制图像(图像经常更新,因此必须重新绘制).以前,我将图像从YUV转换为RGB,然后使用此新图像使用OpenGL绘制.一切都很好,但是转换过程并不是特别快. 我现在正在尝试更改代码,以便在OpenGL着色器中处理转换.环顾四周之后,我找到了几个代码片段(尤其是着色器和我的大部分效果功能),这帮助我获得了基线,但我似乎实际上无法正确地绘制图像 - 看到是黑色图像. 很有可能我缺少一些非常简单和重要的东西 - 我对OpenGL的体验相当有限.如果有人可以看一下,看看他们是否认识到任何错误,请告诉我. 我应该指出,我正在尝试支持iOS 4.x,所以cvopengeNlectextextextextecachecreateTextlextureftromimage不应该是可用的(而且即使我愿意,我也不是真正积极的设置,即使我想使用它). 任何帮助将不胜感激.下面的代码 - 我的顶点着色器: attribute vec4 positi
0 2023-05-10
编程技术问答社区
使用GLSL将RGB转为YUV
我正在寻找可以将RGB框架(例如像素格式为argb)转换为yuv(例如yuv420)的示例GLSL片段着色器代码. 想象一下1920x1080尺寸的RGB框架.我喜欢使用片段着色器将其转换为YUV框架. 您可以指出我可以在Ubuntu框上编译并运行的代码吗? 解决方案 供将来参考,可以在 gstreamer gst-plugins-gl代码库:) 其他解决方案 首先,您应该知道您的问题的措辞很差.没有人会写您的示例代码.您可以使用搜索引擎(甚至搜索此站点)以从RGB转换为YUV. . 我写了一个与您要寻找的答案相似的答案/9234854#9234854">在这里.它从RGB转换为YIQ,对色调进行了一些转换并转换.如果您需要的话,您可以将Y'CBCR矩阵用于颜色转换而不是yiq. 不过,它并没有向下转换为4:2:0.不过,这应该很容易做到.一旦以Y'CBCR格式,您可以根据您认为合适的方式对适当的频道进行下样本.我建议先在这些频道上进行低通滤波器,以
2 2023-05-10
编程技术问答社区
OpenGL 使用着色器将NV12转换为RGB24
我尝试编写一个应用程序以在OpenGL中显示YUV映像.我使用此片段(static long int crv_tab[256]; static long int cbu_tab[256]; static long int cgu_tab[256]; static long int cgv_tab[256]; static long int tab_76309[256]; static unsigned char clp[1024]; //for clip in CCIR601 void init_yuv420p_table() { long int crv,cbu,cgu,cgv; int i,ind; static int init = 0; if (init == 1) return; crv = 104597; cbu = 132201; /* fra matrise i global.h */ cgu = 25675; cgv = 53279; for (i = 0; i
2 2023-05-10
编程技术问答社区
glPopMatrix()大叫 "setup_hardware_state中不支持纹理格式"
我正在尝试在私人视频播放器中进行一些优化,以提高性能,因为播放MP4文件在CPU上很重,因为视频帧已在YV12中编码和OpenGL不提供显示此格式的本机方法.目前,有一个代码在CPU上运行,将YV12转换为RGB,然后将图像发送到GPU进行显示,这会消耗100%的CPU处理. 我目前正在研究如何解码YV12帧而无需编写着色器进行YV12-> RGB转换.据我所知,一种方法是通过 gl_mesa_ycbcr_texture ,显然是由我的系统支持的(glxinfo报告). 在此Fedora盒中,我有一个 ATI Technologies Inc Rv610视频设备[Radeon HD 2400 Pro] ,这是一张不错的视频卡.然后,我下载了但是,当我执行此修改后的应用程序时,它会输出: The MESA driver reports *unsupported texture format in setup_hardware_state* 我注意到当从Display(
0 2023-05-10
编程技术问答社区
如何在Cocoa OpenGL程序中显示一个原始YUV帧
我已被分配给编写示例原始YUV文件并在可可opengl程序中显示的程序的任务. 我是我工作的实习生,几乎没有任何线索如何开始.我一直在阅读Wikipedia和Yuv上的文章,但是我找不到有关如何打开RAW YUV文件,提取数据并将其转换为RGB并将其显示在视图窗口中的任何良好源代码. . 本质上,我需要在任务的以下方面的帮助 - 如何从样本YUV文件中提取YUV数据 - 如何将YUV数据转换为RGB颜色空间 - 如何在OpenGL中显示RGB颜色空间. (我认为这是我可以随时间弄清楚的,但是我真的需要前两个点的帮助) 请告诉我要使用的课程,或将我指向我可以了解YUV图形/视频显示的地方 解决方案 此答案不正确,请参阅其他答案和评论.下面留下的原始答案以获得后期. 您无法直接显示它.您需要将其转换为RGB纹理.正如您可能是从 wikipedia 上,Yuv Color Space上有很多变化.确保您使用的是正确的. 对于每个像素,从YUV到RGB的转
0 2023-05-10
编程技术问答社区
通过GLSL将YV12转换为RGB的问题
我正在尝试完成 yv12 to rgb转换提到在这篇文章中着色器. 我的应用程序从磁盘上加载了原始的YV12帧,并尝试使用GLSL着色器执行转换.但是,所得图像是垂直翻转的,并且存在一些颜色问题.我认为问题可能是该图像被读取为char(1个字节)的数组,然后转换为GLushort(2个字节)的数组.你怎么看? 这就是原始Yuv框架的样子: 这是我得到的输出: 我正在共享以下应用程序的源代码: #include #include #include #include #include #include #include #include #include #include #ifndef SEEK_SET # define SEEK_SET
0 2023-05-10
编程技术问答社区
在OpenCV中叠加/合并两个(及以上)YUV图像
我调查并删除了我以前的问题(有没有办法避免从YUV转换为BGR?).我想在生成的,更大的图像上叠加几个图像(格式为yuv)(例如它是画布),并通过网络库(opal)向前发送它,而无需将其转换为BGR. 这是代码: Mat tYUV; Mat tClonedYUV; Mat tBGR; Mat tMergedFrame; int tMergedFrameWidth = 1000; int tMergedFrameHeight = 800; int tMergedFrameHalfWidth = tMergedFrameWidth / 2; tYUV = Mat(tHeader->height * 1.5f, tHeader->width, CV_8UC1, OPAL_VIDEO_FRAME_DATA_PTR(tHeader)); tClonedYUV = tYUV.clone(); tMerge
2 2023-05-10
编程技术问答社区
适用于Android的OpenCV: 用Imgproc.cvtColor将相机预览从YUV转换为RGB
如果我尝试转换相机预览YUV字节数组,我会遇到运行时错误 与imgproc.cvtcolor(myuv_mat,mrgba_mat,imgproc.color_yuv420sp2rgba,4)的RGB(a)字节阵列 在OnPreviewFrame(字节[]数据,相机相机)中: preview.java: mCamera.setPreviewCallback(new PreviewCallback() { public void onPreviewFrame(byte[] data, Camera camera) { // Pass YUV data to draw-on-top companion System.arraycopy(data, 0, mDrawOnTop.mYUVData, 0, data.length); mDrawOnTop.inval
2 2023-05-10
编程技术问答社区
cpp rgb到yuv422的转换
我正在尝试以RGB/RGBA格式(可以更改)转换为YUV422格式的图像(最初是从qimage). 我最初的目的是使用OpenCv cvtcolor "> cvtcolor "> cvtcolor 但这不能使RGB/RGBA转换为422格式. 我搜索了替代方案,甚至考虑根据 this ,但它的工作原理不够快. 我搜索了另一个库,并找到了此帖子不太相关. 所以我的问题是我对RGB-> YUV422转换有什么好选择?如果他们在GPU而不是CPU上进行转换会更好. 预先感谢 解决方案 我使用OpenCL解决了我的问题,然后以下内容:教程:用opencl和c ++ 简单启动 I changed the conversion to be Format_ARGB32_Premultiplied to YUV422 but it can be easily changed to any format. openclwrapper.h: class Ope
8 2023-05-10
编程技术问答社区