当前位置: 首页 > news >正文

使用glsl 来做视频矫正

描述、优点

  使用glsl来代替opencv的undistort 和 鱼眼矫正,并且最后使用opencv的LUT给glsl 来使用,来达到加速的目的,并且做到和opencv 一模一样的效果,达到实时视频的加速矫正。

  优点: 没有cuda,也可以做到实时视频矫正,包含各类板子和amd的cpu,intel核显

矫正的基本作用就是消除径向畸变和切向畸变

鱼眼镜头使用等距畸变模型​(EQUIDISTANT),而普通镜头使用布朗-康拉德模型。二者的关键区别在于:
在这里插入图片描述
下面分别说明普通镜头和鱼眼镜头

1 顶点和片段着色器

1.1 顶点着色器

#version 330 core
layout(location = 0) in vec2 position;
layout(location = 1) in vec2 texCoord;
out vec2 vTexCoord;void main() {gl_Position = vec4(position, 0.0, 1.0);vTexCoord = texCoord;
}

1.2 片段着色器

小于70度左右的摄像头使用opencv的undistort函数
片段着色器最重要的就是opengl的坐标系,观察一下顶点数据

 // 顶点数据float vertices[] = {// 位置              // 纹理坐标-1.0f, -1.0f, 0.0f,  0.0f, 0.0f,1.0f, -1.0f, 0.0f,  1.0f, 0.0f,1.0f,  1.0f, 0.0f,  1.0f, 1.0f,-1.0f,  1.0f, 0.0f,  0.0f, 1.0f};

纹理坐标是 0,0 到 1.0,0.0 到 1.0.1,0 到 0.0,1.0 , 也就是左下角,右下角,右上角,左上角,,首先转换成像素坐标,坐标是从下到上的, 而图像坐标,或者我们说opencv 坐标Y轴是从上到下的。

1.3 undistort

#version 330 core
uniform sampler2D inputImage;
uniform mat3 cameraMatrix;
uniform mat3 cameraMatrixInv;
uniform vec4 distortionCoeffs;
uniform vec2 imageSize;in vec2 vTexCoord;
out vec4 fragColor;void main() {//-----------------------------------------------------------// 第一步:将纹理坐标转换为OpenCV像素坐标//-----------------------------------------------------------// OpenGL纹理坐标 -> OpenCV像素坐标 (Y翻转)vec2 pixelCoord = vec2(vTexCoord.x * imageSize.x, (1.0 - vTexCoord.y) * imageSize.y);//-----------------------------------------------------------// 第二步:转换为相机坐标系(应用内参逆变换)//-----------------------------------------------------------vec3 cameraCoord = cameraMatrixInv * vec3(pixelCoord, 1.0);vec2 xyn = cameraCoord.xy / cameraCoord.z;//-----------------------------------------------------------// 第三步:应用畸变模型//-----------------------------------------------------------float x = xyn.x;float y = xyn.y;float r2 = x*x + y*y;// 径向畸变float radial = 1.0 + distortionCoeffs.x*r2 + distortionCoeffs.y*r2*r2;// 切向畸变vec2 tangential = vec2(2.0*distortionCoeffs.z*x*y + distortionCoeffs.w*(r2 + 2.0*x*x),distortionCoeffs.z*(r2 + 2.0*y*y) + 2.0*distortionCoeffs.w*x*y);vec2 distorted = xyn * radial + tangential;

相关文章:

  • 单细胞转录组(2)单细胞测序原理
  • 【Linux网络与网络编程】12.NAT技术内网穿透代理服务
  • 【前端基础】HTML元素隐藏的四个方法(display设置为none、visibikity设置为hidden、rgba设置颜色、opacity设置透明度)
  • DeepSeek 赋能社会科学:解锁研究新范式
  • 现在市面上三大常用的拓客软件好用吗?
  • 机器学习,深度学习,神经网络,深度神经网络之间有何区别?
  • PostgreSQL内幕剖析——结构与架构
  • C++类与对象--1 特性一:封装
  • 深入浅出IIC协议 - 从总线原理到FPGA实战开发 -- 第一篇:I2C总线协议深度解剖
  • CentOS 下 FTP 与 NFS 服务深度解析:从基础配置到实战应用
  • 深度学习推理引擎---OpenVINO
  • Android核心系统服务:AMS、WMS、PMS 与 system_server 进程解析
  • 如何在纷杂的环境当中保持保持独立思考能力?
  • linux c++头文件生成源文件 使用python脚本 配置vim快捷键
  • Unity3D仿星露谷物语开发44之收集农作物
  • OAuth2.0
  • 6to4、6over4的类比解释
  • 使用tensorRT10部署低光照补偿模型
  • MySQL相关
  • [强化学习的数学原理—赵世钰老师]学习笔记02-贝尔曼方程
  • 广东缉捕1名象牙走私潜逃非洲“红通”逃犯
  • 新华每日电讯:博物馆正以可亲可近替代“高冷范儿”
  • 查幽门螺杆菌的这款同位素长期被海外垄断,秦山核电站实现突破
  • “三个集中”之后:图说浦东新区28次撤乡并镇
  • 文化润疆|为新疆青少年提供科普大餐,“小小博物家(喀什版)”启动
  • 山东:小伙为救同学耽误考试属实,启用副题安排考试