OpenGL ES详解——YUV数据渲染

Android OpenGLES2.0 渲染ffmpeg解码后的视频 平台:Android 版本:OpenGL SE 2.0 OpenGL SE 和 EGL相关概念介绍请参考 https://www.2cto.com/kf/201806/752471.html 流程: 当前已有条件:H264已解码完的数据。 显示控件为:SurfaceView。 PS: 本文只适合android ffmpeg软解码后的视频渲染,其他情况请大家搜索其他大佬的博客 OpenGL 需要渲染... 阅读详情
AI摘要

本文详细介绍了如何在OpenGL ES中实现YUV数据的渲染,包括YUV格式原理、与RGB的转换公式、GL_LUMINANCE的应用、YUV视频读取方法、着色器编写及多纹理加载技术,重点讲解了YUV420P数据分离与片段着色器中的色彩空间转换过程。

目录

一、YUV介绍

1. 为什么使用YUV

2. YUV 格式

二、YUV转RGB公式

三、YUV渲染

1. GL_LUMINANCE介绍

2. 获取 YUV 视频

3. 读取YUV文件数据

4. 着色器编写

5. 纹理加载和绘制

四、源码下载


一、YUV介绍

YUV是一种图像颜色编码方式。

相对于常见且直观的RGB颜色编码,YUV的产生自有其意义,它基于人眼对亮度比色彩的敏感度更高的特点,使用Y、U、V三个分量来表示颜色,并通过降低U、V分量的采样率,尽可能保证图像质量的情况下,做到如下3点:

  • 占用更低的存储空间
  • 数据传输效率更高
  • 兼容黑白与彩色显示

在说 yuv 之前,就不得不说 RGB 图像空间,顾名思义,RGB 是值图像的每一个像素都有 R、G,B 三个值,且三个值一次排列存储;但不一定说一定是按照 R,G,B 顺序排列,也可以是 B,G,R 这样的顺序。其中 R,G,B 的位深为 8 bit。
在这里插入图片描述

我们常见的图片处理,都是用 R,G,B 的图像格式,比如bitmap,比如图像的存储,基本使用 R,G,B

1. 为什么使用YUV

我们知道,视频是由一张张图片组成,假设有一个 1920 * 1080 分辨率、帧率为60帧的视频,如果不进行压缩处理,并且使用RGB进行存储的话,仅仅一分钟的视频就能达到 ( 1920 * 1080 * 8 * 60 * 60 )bit (约等于56G),这显然是很夸张的。
但R,G,B这三个颜色是彼此是由相关性的,不利于编码压缩,所以,我们需要另外一种图像格式,来解决图像压缩问题,这个时候,yuv 就被提升来了。

yuv 图像格式将亮度信息 Y 和 色彩信息 UV 分离开来,Y 表示亮度,是图像的总体轮廓,即我们常说的灰度值,UV 表示色度,主要描绘图像的色彩信息,即颜色饱和度。如下图(图片来源wiki百科):

yuv 最早用于电视系统和模拟视频领域,它兼容了黑白电视和彩色电视,如果你家有vcd,dvd 这种设备,就会发现有 YCbCr(YUV) 这种接口,如果是黑白电视,值需要接入Y分量即可。

从很早的时候,人们就发现,人类对亮度信息比较敏感,而对色彩信息不那么敏感,比如我们降低一些颜色值,并不影响人对这张图像感官。因此,yuv 的编码压缩,又可以分为 YUV 4:4:4、YUV 4:2:2、YUV 4:2:0 这几种常用的类型。

2. YUV 格式

YUV 4:4:4、YUV 4:2:2、YUV 4:2:0,指的是U,V 分量像素点的个数和采集方式,其中又以 YUV 4:2:0 最为常用。

可以这样简单理解:

  • YUV 4:4:4:每一个 Y 就对应一个 U 和一个 V分量
  • YUV 4:2:2:每两个 Y 共用一个 U、一个 V 分量
  • YUV 4:2:0:每四个 Y 共用一个 U、V分量

如下图:

其中,YUV 又有不同的存储方式:

  • packed :packed格式是先连续存储所有的Y分量,然后依次交叉储存U、V分量;
  • planar:planar格式也会先连续存储所有的Y分量,但planar会先连续存储U分量的数据,再连续存储V分量的数据,或者先连续存储V分量的数据,再连续存储U分量的数据:

二、YUV转RGB公式

首先我们回顾一下YUV转RGB的公式,之前说过,不同的转换标准,运用不同的公式:

三、YUV渲染

从之前OpenGL 的纹理教程中,我们是把一张图片,通过纹理的方式,传递给片段着色器,最终通过纹理采样,复制给片段颜色值,呈现出来的。
现在使用 YUV ,该如何处理呢?我们知道,视频最终的呈现还是RGB格式的数据,因此,我们需要把 YUV 的数据,所以需要在片段着色器赋值之前,把YUV转换成 RGB。

1. GL_LUMINANCE介绍

在OpenGL 的api 中,可以发现有个 GL_LUMINANCE 格式,它表示只取一个颜色通道,这样的话,就可以把 YUV 拆分成3个通道来读取,然后我们设置 3个纹理,把 YUV 数据传入其中,并最终把这三个通道合并在一起。

2. 获取 YUV 视频

为了方便演示,我们使用 YUV420P 的视频,即4个Y共用一个U,V 分量,且存储是先存储Y,然后是U,最后再存储V分量。
这里我们可以用 ffmepg 的命令,轻松把一个 MP4 的视频转换成 YUV,由于 YUV 比较大,记得修改分辨率,这样小一些:

ffmpeg -i input.mp4 -s 288x512 -r 30 -pix_fmt yuv420p out.yuv

3. 读取YUV文件数据

之后,就可以通过不断读取这个yuv文件,拿到y,u,v的数据,假设视频大小为 wxh ,则先读取 wh 个y,再读取 wh/4 个u,再读取 w*h/4 个 v;一帧读取完后,就进行渲染,然后再重复操作,直到文件被读取完毕。
我们把文件放在 assert 文件夹下:

 /**
  * i420为yuv数据,注意 w,h 为视频或图片宽高
  */
    fun setYuvData(i420: ByteArray, width: Int, height: Int) {
        yBuffer?.clear();
        uBuffer?.clear();
        vBuffer?.clear();
        // 该函数多次被调用的时,不要每次都new,可以设置为全局变量缓存起来
        var y = ByteArray(width * height)
        var u = ByteArray(width * height / 4)
        var v = ByteArray(width * height / 4)
        System.arraycopy(i420, 0, y, 0, y.size);
        System.arraycopy(i420, y.size, u, 0, u.size);
        System.arraycopy(i420, y.size + u.size, v, 0, v.size);
        yBuffer = ByteBuffer.wrap(y);
        uBuffer = ByteBuffer.wrap(u);
        vBuffer = ByteBuffer.wrap(v);
        yuvWidth = width;
        yuvHeight = height;
    }

4. 着色器编写

位置和纹理坐标如下:

    private val POINT_RECT_DATA = floatArrayOf(
        // 前三个数字为顶点坐标(x, y, z),后两个数字为纹理坐标(s, t)
        // 第一个三角形
        0.8f, 0.5f, 0f, 1f, 0f,
        0.8f, -0.5f, 0f, 1f, 1f,
        -0.8f, -0.5f, 0f, 0f, 1f,
        // 第二个三角形
        0.8f, 0.5f, 0f, 1f, 0f,
        -0.8f, -0.5f, 0f, 0f, 1f,
        -0.8f, 0.5f, 0f, 0f, 0f
    )

顶点着色器中,获取位置和纹理坐标数据:

#version 300 es

layout(location = 0) in vec4 a_Position;
layout(location = 1) in vec2 a_TextureCoordinates;

out vec2 texture_coord;

void main() {
    gl_Position = a_Position;
    texture_coord = a_TextureCoordinates;
}

片段着色器中,设置三个纹理,用来读取 yuv分量的数据:

#version 300 es

precision mediump float;

in vec2 texture_coord;
layout(location = 0) uniform sampler2D sampler_y;
layout(location = 1) uniform sampler2D sampler_u;
layout(location = 2) uniform sampler2D sampler_v;

out vec4 out_color;

void main() {
    float y = texture(sampler_y, texture_coord).r;
    float u = texture(sampler_u, texture_coord).g- 0.5;
    float v = texture(sampler_v, texture_coord).b- 0.5;

    vec3 rgb;
    rgb.r = y + 1.540*v;
    rgb.g = y - 0.183*u - 0.459*v;
    rgb.b = y + 1.818*u;
    out_color = vec4(rgb, 1);
}

可以看到,我们使用了三个纹理textureY,textureU,textureV,然后用了三个变量 y,u,v 用来接收纹理数据。
前面说到,OpenGL 的分量,除了包含位置信息{x,y,z,w},还有颜色(r,g,b,a)和纹理信息(s,t,r,q):

  • x,y,z,w: 与位置相关的分量
  • r,g,b,a: 与颜色相关的分量
  • s,t,p,q: 与纹理坐标相关的分量

当我们设置 sampler2D 的类型为 GL_LUMINANCE,所以 texture().r 拿到的是yuv 的第一个颜色向量的第一个分量信息,就是y;

那这个 0.5 是什么?为啥要减去它?
先看到YUV与RGB 的转换公式,这里用高清模式(BT709),颜色空间为 Limited Range 的转换公式:

可以看到,有个转换偏差值,而 U,V 默认是127 ,Y 的偏移量为0。8 个 bit 位的取值范围是 0 ~ 255,由于在 shader 中纹理采样值需要进行归一化(注意,纹理的范围是[0,1]),所以 UV 分量的采样值需要分别减去 0.5 ,确保 YUV 到 RGB 正确转换。

5. 纹理加载和绘制

编写完着色器,就可以编写纹理对象了。首先,设置纹理的下标:

private val textures = IntArray(3)
 //三个纹理,需要设置纹理的下标
GLES30.glUniform1i(mShaderProgram!!.getTextureYLocation(), 0)
GLES30.glUniform1i(mShaderProgram!!.getTextureULocation(), 1)
GLES30.glUniform1i(mShaderProgram!!.getTextureVLocation(), 2)

设置纹理的对象:


GLES30.glGenTextures(3, textures, 0)
for (i in 0..2) {
    GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textures[i])

    //纹理环绕
    GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_S, GLES30.GL_REPEAT)
    GLES30.glTexParameteri(GLES30.GL_TEXTURE_2D, GLES30.GL_TEXTURE_WRAP_T, GLES30.GL_REPEAT)

    //纹理过滤
    GLES30.glTexParameteri(
        GLES30.GL_TEXTURE_2D,
        GLES30.GL_TEXTURE_MIN_FILTER,
        GLES30.GL_NEAREST
    )
    GLES30.glTexParameteri(
        GLES30.GL_TEXTURE_2D,
        GLES30.GL_TEXTURE_MAG_FILTER,
        GLES30.GL_LINEAR
    )

    //解绑纹理对象
    GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, 0)
}

前面3.章节,已经拿到了 yuv 的数据,这里,我们使用 glTexImage2D 把数据设置给纹理:

    override fun onDrawFrame(gl: GL10?) {
        if (yBuffer == null || uBuffer == null || vBuffer == null) {
            return;
        }
        GLES30.glClear(GLES30.GL_COLOR_BUFFER_BIT)
        //1.加载纹理y
        GLES30.glActiveTexture(GLES30.GL_TEXTURE0); //激活纹理0
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textures[0]); //绑定纹理
        GLES30.glTexImage2D(
            GLES30.GL_TEXTURE_2D, 0, GLES30.GL_LUMINANCE, yuvWidth,
            yuvHeight, 0, GLES30.GL_LUMINANCE, GLES30.GL_UNSIGNED_BYTE, yBuffer
        )// 赋值
        // sampler_y的location=0, 把纹理0赋值给sampler_y
        GLES30.glUniform1i(mShaderProgram!!.getTextureYLocation(),0); 
        //2.加载纹理u
        GLES30.glActiveTexture(GLES30.GL_TEXTURE1);
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textures[1]);
        GLES30.glTexImage2D(
            GLES30.GL_TEXTURE_2D, 0, GLES30.GL_LUMINANCE, yuvWidth / 2,
            yuvHeight / 2, 0, GLES30.GL_LUMINANCE, GLES30.GL_UNSIGNED_BYTE, uBuffer
        );
        // sampler_u的location=1, 把纹理1赋值给sampler_u
        GLES30.glUniform1i(mShaderProgram!!.getTextureULocation(),1); 

        // 3.加载纹理v
        GLES30.glActiveTexture(GLES30.GL_TEXTURE2);
        GLES30.glBindTexture(GLES30.GL_TEXTURE_2D, textures[2]);
        GLES30.glTexImage2D(
            GLES30.GL_TEXTURE_2D, 0, GLES30.GL_LUMINANCE, yuvWidth / 2,
            yuvHeight / 2, 0, GLES30.GL_LUMINANCE, GLES30.GL_UNSIGNED_BYTE, vBuffer
        );
        // sampler_v的location=2, 把纹理1赋值给sampler_v
        GLES30.glUniform1i(mShaderProgram!!.getTextureVLocation(),2); 
        // 4.绘制
        GLES30.glDrawArrays(
            GLES30.GL_TRIANGLES,
            0,
            POINT_RECT_DATA.size / (POSITION_COMPONENT_COUNT + TEXTURE_COORDINATES_COMPONENT_COUNT)
        );
    }
效果图如下:

四、源码下载

Android OpenGL ES创建绘制YUV格式图片和视频项目源码

下载地址:

https://download.youkuaiyun.com/download/github_27263697/90113852

参考文章

Android OpenGL ES 学习(十一) –渲染YUV视频以及视频抖音特效_android 视频渲染-优快云博客

Android使用OpenGL 3.0绘制yuv图片示例_android opengl绘制yuv-优快云博客

https://juejin.cn/post/7160304816877469733

OpenGL 渲染 YUYV(YUV422) OpenGL渲染YUYV(YUV422) 阅读详情

相关推荐

AndroidUSBCamera进阶玩法:用OpenGL给USB摄像头添加实时滤镜(附完整Demo)

本文深入探讨了基于AndroidUSBCamera库,利用OpenGL ES技术为USB摄像头实现实时滤镜的进阶开发方案。内容涵盖从项目架构解析、OpenGL渲染管线构建,到黑白、灵魂出窍等多种滤镜效果的具体实现与性能优化,并提供了多路摄像头同步特效处理与完整Demo框架,为Android平台上的专业图像处理应用开发提供了实战指南。

weixin_28338005的博客 560

FFmpeg+OpenGL ES+OpenSL ES打造Android视频播放器

FFmpeg+OpenGL ES+OpenSL ES打造Android视频播放器教程,该课程基于C++语言,用FFmpeg、OpenGL ES、OpenSL ES和MediaCodec打造Android视频播放器。以录播课形式讲解课程所涉及的知识点和整体流程,每节课都有相关的PPT和源码资料,并用通俗易懂的方式讲解课程。适合人群 有一定的C++基础和Android开发经验。

OpenGL/OpenGL ES入门:渲染YUV数据实践

1.yuv的字节数 现有宽为w高为h的一个视频,现在定义了一个data[] bytes变量并存储了这个视频的一帧数据。 bytes数组中,先连续存储每个像素的灰度信息,y通道占w*h个字节; 然后顺序存储颜色数据,u和v分别占一个字节,每个颜色数据共占2个字节,所以uv通道占(w/2)(h/2)2=w*h/2个字。 2.纹理 2.1 纹理的组成 y通道的数据生成一个opengl纹理; uv通道的数据生成一个opengl纹理; 两个纹理作为渲染时的输入,在渲染过程中由GPU组装还原出来视频画面。

qq_34754747的博客 5343

OpenGL实现RGB到YUV的转化

采用OpenGLES2.0规范,在GPU硬件上实现高效率的RGB数据到YUV数据的转化

Android OpenGL开发实践 - GLSurfaceView对YUV格式数据的处理

一、创建OpenGL ES 环境 在清单中声明OpenGL ES 为了使您的应用程序能够使用OpenGL ES 2.0 API,您必须在清单中添加以下声明: <uses-feature android:glEsVersion="0x00020000" android:required="true" /> 构建GLSurfaceView对象 class MyGLSurfaceView(...

lkl22的专栏 4849

OpenGL ES 3.0 开发(三):YUV 渲染

YUV 渲染原理 前面文章一文掌握 YUV 图像的基本处理介绍了 YUV 常用的基本格式,本文以实现 NV21/NV12 的渲染为例。 前文提到,YUV 图不能直接用于显示,需要转换为 RGB 格式,而 YUV 转 RGB 是一个逐像素处理的耗时操作,在 CPU 端进行转换效率过低,这时正好可以利用 GPU 强大的并行处理能力来实现 YUV 到 RGB 的转换。 YUV 与 RGB 之间的转换公式...

字节流动 4万+

Agora直播后台截图技术:JAVA实现无UI线程安全截帧

屏幕截图是实时音视频系统可观测性的基础能力,其本质是捕获渲染管线中的原始帧数据。原理上需绕过WebRTC线程模型限制,在非UI线程中安全访问GPU纹理(如SurfaceTexture)并完成YUV转RGB、离屏渲染与像素读取。该技术具备毫秒级时序控制、零拷贝内存处理和跨平台一致性等工程价值,广泛应用于直播合规审计、异常定位、AI内容审核等场景。本文聚焦JAVA后端在无Activity环境下,基于Agora Native SDK与OpenGL ES实现稳定截图的核心路径,涵盖SurfaceTexture接管、

weixin_32642109的博客 152

Android美颜相机实战:Camera2+OpenGL ES+OpenCV实现磨皮美白瘦脸

实时图像处理是移动开发中兼具算法与工程挑战的方向,其核心链路涵盖相机采集、GPU渲染与视觉检测。在Android平台,Camera2负责输出YUV帧数据,OpenGL ES则通过片元着色器在GPU上完成磨皮美白等像素级操作,而OpenCV提供离线人脸关键点定位,为瘦脸变形提供坐标依据。将三者组合,可实现一条从预览、特效到相册保存的完整实时美颜管线。这类技术广泛应用于短视频、直播和美颜相机App,也是毕业设计与面试中高频涉及的综合实践项目。本文基于一套可编译运行的Android美颜相机工程,拆解Camera2

weixin_29174013的博客 204

Android平台上基于OpenGl渲染yuv视频

前言 这是我音视频专栏的第一篇实例解析,也算是入门篇,重点讲下如何使用OpenGl去渲染一个yuv视频。 本篇博文涉及的知识点主要有三个:1.yuv的概念 2.基于ndk进行C++程序的基本编写 3.OpenGl纹理的绘制 本文将重点讲知识点1和3,ndk开发部分就不细谈,由于OpenGl知识体系庞大,本文也是根据重点来分析,所以如果没有ndk开发基础和OpenGl基础的读者看本文可能会比较困难......

易水南风的专栏 6936

QT OpenGL高效图像显示:30fps连续帧GPU渲染方案

在Qt应用中实现高帧率图像实时显示,本质是绕过QWidget光栅绘制瓶颈,利用OpenGL管线将图像数据直接上传至GPU纹理进行硬件加速渲染。其核心原理在于构建轻量级QOpenGLWidget封装层,结合OpenGL ES 2.0着色器完成YUV/RGB格式解析、坐标映射与色彩校正,显著降低CPU负载并抑制画面撕裂。该技术具备低延迟(<16ms)、跨平台(x86/ARM)、零拷贝内存传递等工程优势,广泛适用于工业相机采集、SLAM建图可视化、医学影像预览等对实时性敏感的场景。本文详解基于QOpenGLWid

weixin_30036289的博客 149

Android美颜相机毕业设计:CameraX与ML Kit实战指南

图像处理与计算机视觉在移动端应用广泛,其核心原理涉及相机采集、人脸检测与实时渲染。Android平台通过CameraX和ML Kit等框架,降低了开发门槛,使开发者能高效构建美颜相机等应用。这类技术不仅提升用户体验,还广泛应用于直播、社交等领域。本文以毕业设计为背景,详细解析从相机预览到美颜保存的完整链路,涵盖CameraX、ML Kit人脸检测、OpenGL ES渲染等关键技术,并提供避坑指南与进阶技巧,帮助读者快速实现一个可演示的美颜相机App。

weixin_29190573的博客 244

Opengl ES之YUV数据渲染

YUV的格式比较多,我们今天就以YUV420SP为例,而YUV420SP又分为`NV12`和`NV21`两种,因此今天我们的主题就是如何使用Opengl ES对`NV12`和`NV21`数据进行渲染显示。

u012944685的专栏 4197

Qt实时图像显示:用QOpenGLWidget替代QLabel实现60fps低延迟渲染

在Qt图像显示场景中,QLabel依赖CPU软件绘制,面对连续图像流(如工业相机、无人机图传)易出现高CPU占用、丢帧与撕裂等问题。其本质是QWidget渲染栈带来的内存拷贝与合成开销。采用QOpenGLWidget结合OpenGL ES 2.0硬件加速,可绕过Qt绘图管线,通过纹理上传+自定义YUV转RGB着色器实现GPU端实时处理,显著提升帧率稳定性与能效比。该方案兼顾嵌入式资源约束与课设工程落地性,特别适用于OpenCV Mat/FFmpeg AVFrame等原始帧数据的高效上屏。本文详解双缓冲纹理队

weixin_29189381的博客 263

openGL 渲染 yuv 的两种方式 glsl

参考: Fin Render Android NDK cpp 使用 OpenGL ES 渲染预览 YUV 渲染 YUV420P YUV420P 是3-plane,也就是YUV数据段分了三段YYYY-U-V 在 glsl 中创建三个 sampler2D 分别用来保存 Y U V 数据,通过如下的 glsl 代码编译出 OpenGL Progame 实现图像预览 Shader.ve...

qq_38907791的博客 2995

Android使用MediaCodeC与OpenGL硬解码 录制mp4音视频实现源码

将Camera数据显示到OpenGL ES渲染的图像中,并通过MediaCodeC 将 OpenGL ES 缓冲数据,硬编码写入到 mp4 视频文件中,完成视频的录制。 文件介绍请见: https://xiaxl.blog.youkuaiyun.com/article/details/72530314 原理及实现步骤: 1、通过OpenGLES渲染Camera采集数据; 2、通过 MediaCodec.createInputSurface获取一个Surface; 3、通过EGL构建EGLDisplay并绑定Surface; 4、通过 EGL 线程中渲染GL_TEXTURE_EXTERNAL_OES对应的纹理ID; 5、在 EGL 线程完成渲染后,通过eglSwapBuffers交换缓冲,将EGL渲染内容交换到MediaCodeC给定的Surface中,从而完成mp4视频录制。

COMSOL报错调试总结(不定期更新)

COMSOL报错调试总结1. 可定位错误1.1 除零错误1.2 未定义变量值1.3 边界条件/材料属性等缺失2. 难定位错误2.1. 装配期间内存不足 官方给的案例总是非常完美,运行流畅,结果完美。但是自己做模型时候就总是报错,而且不像自己coding的程序那样可以明确定位哪里出了bug。这里把我碰到的一些报错问题以及调试方法记录下来~ 部分来源于以下参考来源: http://wap.sciencenet.cn/blog-1467490-1118453.html?mobile=1 1. 可定位错误 以下错误

jessica0307的博客 8万+

Android NDK cpp 使用 OpenGL ES 渲染预览 YUV

参考网址: OpenGL 下的专业名词解析 OpenGL渲染YUV数据 Android native层的opengltest程序学习例子 由于项目需要把 Camera HAL 层的部分算法移植到 APK 的 native 用 OpenGL ES 增加特效和渲染预览。 需要两个步骤: 从 APK 传输数据到 native 层: Android camera2 API 获取相机的 ...

qq_38907791的博客 2522

字符串相似度比较算法:Jaro–Winkler similarity的原理及实现

前言 在前面的文章中,笔者有对编辑距离以及Levenshtein距离进行详细的说明,其实levenshtein距离是编辑距离的其中一种定义,本文所说的Jaro距离是编辑距离的另外一种定义,它也是对两个字符串的相似度进行衡量,以得出两字符串的相似程度。下面我们一起来学习这个算法的原理以及实现吧。 标题算法定义 下面先说说Jaro distance(又称Jaro similarity),这是由Matt...

蓝天白云梦的csdn博客 1万+

使用OpenGL 和 opengl ES 渲染YUV图片文件的QT示例

头文件:CPlayWidget.hcpp文件:CPlayWidget.cpp默认打开 ./test.yuv文件。

Alon1787的博客 1786

十一、机器学习进阶知识:径向基神经网络(RBFNN)的实现(Python,附源码及数据集)

本文对径向基神经网络(RBFNN)的理论基础及建模步骤进行介绍,之后使用Python实现基于RBFNN的数据预测,通俗易懂,适合新手学习,附源码及实验数据集。

weixin_42051846的博客 1万+

HALCON基于描述符的模板匹配(未标定)

HALCON基于不标定描述符的模板匹配

king_linj的博客 890

在iOS上使用OpenGL ES渲染YUV

转自:http://blog.youkuaiyun.com/cpluser/article/details/41720431 1)创建OpenGL context [[EAGLContext alloc] initWithAPI:kEAGLRenderingAPIOpenGLES2]; 2)layer设置成不透明 _eaglLayer = (CAEAGLLayer*) self.lay

易龙元泰的专栏 3992

EtherCAT报文-BRD(广播读)抓包分析

EtherCAT报文之BRD(广播读)报文Wireshark抓包分析。

kevin1499的博客 1212
上一篇: OpenGL ES详解——文字渲染
下一篇: OpenGL ES详解——Camera2数据渲染
闲暇部落
博客等级 码龄12年 2775粉丝 215原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

闲暇部落

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值