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

使用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;
http://www.lryc.cn/news/2383538.html

相关文章:

  • 03-Web后端基础(Maven基础)
  • LLM驱动下的软件工程再造:驾驭调试、测试与工程化管理的智能新范式
  • 大语言模型与人工智能:技术演进、生态重构与未来挑战
  • SpringSecurity授权、认证
  • 蓝桥杯19682 完全背包
  • DeepSeek源码解构:从MoE架构到MLA的工程化实现
  • leetcode 3355. 零数组变换 I 中等
  • 【VLNs篇】02:NavGPT-在视觉与语言导航中使用大型语言模型进行显式推理
  • (T_T),不小心删掉RabbitMQ配置文件数据库及如何恢复
  • 创建react工程并集成tailwindcss
  • TDengine 安全部署配置建议
  • Axure全链路交互设计:快速提升实现能力(基础交互+高级交互)
  • 为什么wifi有信号却连接不上?
  • 蓝桥杯框架-LED蜂鸣器继电器
  • uniapp-商城-64-后台 商品列表(商品修改---页面跳转,深浅copy应用,递归调用等)
  • Dify的大语言模型(LLM) AI 应用开发平台-本地部署
  • 使用教程:8x16模拟开关阵列可级联XY脚双向导通自动化接线
  • 移动端前端调试调研纪实:从痛点出发,到 WebDebugX 的方案落地
  • 8 种快速易用的Python Matplotlib数据可视化方法
  • 【android bluetooth 协议分析 02】【bluetooth hal 层详解 3】【高通蓝牙hal主要流程介绍-上】
  • C# 深入理解类(实例构造函数)
  • RabbitMQ——消息确认
  • 测试W5500的第2步_使用ioLibrary库创建TCP客户端
  • 深度学习之用CelebA_Spoof数据集搭建一个活体检测-训练好的模型用MNN来推理
  • 【Java】泛型在 Java 中是怎样实现的?
  • 开源安全大模型Foundation-Sec-8B实操
  • 【JavaWeb】MySQL
  • 微信小游戏流量主广告自动化浏览功能案例5
  • 【C++ Primer 学习札记】函数传参问题
  • 软件的技术架构、应用架构、业务架构、数据架构、部署架构