如何使用cuda进行图像矫正

普通矫正

相机矫正我们经常会用到,如果没有gpu加速,实际上矫正会很吃力,我们先用普通的矫正

	cv::Mat undistort(cv::Mat img, cv::Mat K, cv::Mat D, int w, int h, float scale = 0.6){cv::Mat Knew = K.clone();//Knew = K.copy()if (scale != 0){Knew.at<double>(0, 0) = Knew.at<double>(0, 0) * scale;Knew.at<double>(1, 1) = Knew.at<double>(1, 1) * scale;}cv::Size size(w, h);cv::Mat map1, map2, dst;int alpha = 0;//cv::Mat NewCameraMatrix = getOptimalNewCameraMatrix(K, D,//	size, alpha, size, 0);cv::fisheye::initUndistortRectifyMap(K, D, cv::Mat(), Knew, size, CV_16SC2, map1, map2);cv::remap(img, dst, map1, map2, cv::INTER_LINEAR);return dst;}

cuda 加速

问题就是cpu吃紧,下面我们还是使用带有cuda的gpu进行加速

#include <opencv2/opencv.hpp>
#include <opencv2/core/cuda.hpp>
#include <opencv2/cudaarithm.hpp>
#include <opencv2/cudawarping.hpp>
#include <opencv2/cudafilters.hpp>// CUDA 核函数:实现畸变校正
__global__ void distortCorrectionKernel(cv::cuda::PtrStep<float> src, cv::cuda::PtrStep<float> dst, float* mapX, float* mapY, int width, int height) {int x = threadIdx.x + blockIdx.x * blockDim.x;int y = threadIdx.y + blockIdx.y * blockDim.y;if (x < width && y < height) {float newX = mapX[y * width + x];float newY = mapY[y * width + x];dst(y, x) = src(newY, newX);}
}
int calc()
int main() {// 读取相机的畸变参数cv::Mat cameraMatrix, distCoeffs;// 假设已经将相机的畸变参数填充到 cameraMatrix 和 distCoeffs 中// 图像大小cv::Size imageSize(640, 480);// 计算畸变校正映射cv::Mat mapX, mapY;cv::initUndistortRectifyMap(cameraMatrix, distCoeffs, cv::Mat(), cv::getOptimalNewCameraMatrix(cameraMatrix, distCoeffs, imageSize, 1, imageSize, 0),imageSize, CV_32FC1, mapX, mapY);// 将映射表上传到 GPUcv::cuda::GpuMat mapX_GPU, mapY_GPU;mapX_GPU.upload(mapX);mapY_GPU.upload(mapY);// 加载输入图像到 GPUcv::cuda::GpuMat srcImage_GPU;// 假设您已经将输入图像加载到 srcImage_GPU 中// 创建输出图像的 GPU 矩阵cv::cuda::GpuMat dstImage_GPU(srcImage_GPU.size(), srcImage_GPU.type());// 在 GPU 上执行畸变校正dim3 block(32, 32);dim3 grid((srcImage_GPU.cols + block.x - 1) / block.x, (srcImage_GPU.rows + block.y - 1) / block.y);distortCorrectionKernel<<<grid, block>>>(srcImage_GPU, dstImage_GPU, mapX_GPU.ptr<float>(), mapY_GPU.ptr<float>(), srcImage_GPU.cols, srcImage_GPU.rows);cudaDeviceSynchronize();// 下载结果到 CPUcv::Mat dstImage;dstImage_GPU.download(dstImage);// 现在您可以在 CPU 上使用校正后的图像了return 0;
}

对于有cuda来说,这样做非常好,因为我们并不是只有一个算法放到cuda上做,而是具有很多算法需要经过cuda,对于这样的程序来说,我们直接使用,速度是最快的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/821562.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

强化学习(二)马尔科夫决策过程 MDP

文章目录 1. 什么是马尔科夫过程2. 强化学习与MDP的关系3. 价值函数的贝尔曼方程3.1 状态价值函数的贝尔曼方程3.2 动作价值函数的贝尔曼方程3.3 价值函数递推关系的转换 4. 最优价值函数5. MDP计算最优值函数实例 1. 什么是马尔科夫过程 马尔科夫过程&#xff08;Markov Deci…

【网络编程】UDP实现回显服务器

一.网络编程的基本术语. 客户端 客户端是为用户提供本地服务的程序&#xff0c;通常位于用户设备上。也称为用户端&#xff0c;是相对于服务器而言的。它主要指安装在用户设备上的程序&#xff0c;这些程序能够与服务器进行通信&#xff0c;从而获取服务或者执行特定功能。在…

Spark安装教程

Spark安装教程 文章目录 Spark安装教程1. 检查jdk版本2. 获取Spark版本安装资源3.环境变量4.配置文件5. 重启Hadoop集群(使配置生效)6. 启动Spark集群6.1 查看Spark服务6.2 访问Spark WEB UI 7. 启动 Spark-Shell 测试 Scala 交互式环境8. 测试Spark On Yarn9.关闭Spark集群 1.…

OpenHarmony实战开发-Grid和List内拖拽交换子组件位置。

介绍 本示例分别通过onItemDrop()和onDrop()回调&#xff0c;实现子组件在Grid和List中的子组件位置交换。 效果图预览 使用说明&#xff1a; 拖拽Grid中子组件&#xff0c;到目标Grid子组件位置&#xff0c;进行两者位置互换。拖拽List中子组件&#xff0c;到目标List子组件…

STM32-ADC(独立模式、双重模式)

ADC简介 18个通道&#xff1a;外部信号源就是16个GPIO回。在引脚上直接接模拟信号就行了&#xff0c;不需要侄何额外的电路。引脚就直接能测电压。2个内部信号源是内部温度传感器和内部参考电压。 逐次逼近型ADC: 它是一个独立的8位逐次逼近型ADC芯片&#xff0c;这个ADC0809是…

性能测试 Jmeter 非 GUI 模式 -CLI 命令详解

我们在使用Jmeter做性能测试的时候&#xff0c;大部分同学用的是图形化界面进行脚本编写和执行性能测试的。但是其实真正在公司执行性能测试的时候&#xff0c;我们基本上不会用图形化界面去执行测试&#xff0c;这是因为工具渲染这些图形本身会让Jmeter结果存在很多不稳定的因…

FMEA赋能可穿戴设备:打造安全可靠的未来科技新宠!

在科技日新月异的今天&#xff0c;可穿戴设备已成为我们生活中不可或缺的一部分。它们以其便携性、智能化和个性化的特点&#xff0c;深受消费者喜爱。然而&#xff0c;随着可穿戴设备市场的快速扩张&#xff0c;其安全性和可靠性问题也日益凸显。为了确保产品质量&#xff0c;…

微信小程序全局配置

全局配置文件及常用的配置项 小程序根目录下的 app.json 文件是小程序的全局配置文件。常用的配置项如下&#xff1a; ① pages 记录当前小程序所有页面的存放路径 ② window 全局设置小程序窗口的外观 ③ tabBar 设置小程序底部的 tabBar 效果 ④ style 是否启用新版的组件样…

图灵奖2023:Avi Wigderson的开创性贡献揭示计算中的随机性和伪随机性

文章目录 每日一句正能量前言背景什么是理论计算机科学&#xff1f;为什么随机性很重要&#xff1f;三篇影响深远的论文Avi Wigderson在计算复杂性理论方面的贡献及其对现代计算的影响Avi Wigderson对随机性和伪随机性在计算中作用的理解及其实际应用Avi Wigderson的学术生涯和…

Spring、SpringMVC、SpringBoot核心知识点(持续更新中)

Spring、SpringMVC、SpringBoot核心知识点&#xff08;持续更新中&#xff09; Spring Bean 的生命周期Spring 的 IOC 与 AOPSpring Bean 循环依赖Spring MVC 处理请求的过程Spring Boot 自动装配原理Spring Boot 启动流程 Spring Bean 的生命周期 参考文章&#xff1a;一文读…

HBase的数据模型与架构

官方文档&#xff1a;Apache HBase – Apache HBase™ Homehttps://hbase.apache.org/ 一、HBase概述 1.概述 HBase的技术源自Google的BigTable论文&#xff0c;HBase建立在Hadoop之上&#xff0c;是一个高可靠性、高性能、面向列、可伸缩的分布式存储系统&#xff0c;用于…

mac上 Sublime Text 无法使用 Package Control

我也不知道什么时候用不了的&#xff0c;平时就是用来看看文本文件&#xff0c;因为觉得这个玩意真的很快 今天想安装一个包&#xff0c;发现 cmd shift P 是出来那个窗口了&#xff0c;但是输入什么都没反应&#xff0c;于是在 github 上找到了解决方案 打开终端执行以下命…

vivado 在硬件管理器中调试 AXI 接口

在硬件管理器中调试 AXI 接口 IP integrator 中的 System ILA IP 支持您在 FPGA 上对设计执行系统内调试。在 Versal 器件上 &#xff0c; System ILA 核已被废 弃。现在 &#xff0c; 在含 AXIS 接口的标准 ILA 中支持接口调试。如需监控 IP integrator 块设计中的…

安达发|体育产业体育装备生产车间APS排产软件

在体育产业中&#xff0c;体育装备的生产是保障运动员成绩和安全的关键一环。随着市场需求的多样化和个性化&#xff0c;传统的生产排程方法已经难以满足现代体育装备生产的复杂性和灵活性。因此&#xff0c;应用高级排产软件&#xff08;APS&#xff09;进行生产计划和控制成为…

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型)

RD77MS2 三菱iQ-R系列2轴简单运动模块(SSCNETⅢ/H型) RD77MS2用户手册,RD77MS2外部连接,RD77MS2规格。RD77MS2参数说明&#xff1a;2轴;SSCNETⅢ/H连接&#xff0c;位置控制、同步控制、速度.转矩控制、轨迹控制;控制单位mm、inch、degree、pulse;定位数据600数据轴。 RD77MS2图…

APIGateway的认证

APIGateway的支持的认证如下&#xff1a; 我们从表格中可以看到&#xff0c;HTTP API 不支持资源策略的功能&#xff0c;另外是通过JWT的方式集成Cognito的。 对于REST API则是没有显示说明支持JWT认证&#xff0c;这个我们可以通过Lambda 自定义的方式来实现。 所以按照这个…

AR、VR、MR 和 XR——它们的含义以及它们将如何改变生活

我们的工作、娱乐和社交方式正在发生巨大变化。远程工作的人比以往任何时候都多,屏幕已成为学习和游戏的领先平台。这种演变为元宇宙铺平了道路——如今,像 Meta Quest 2 这样的流行设备将您无缝地带入一个身临其境的世界,您可以在其中购物、创作和玩游戏、与同事协作、探索…

Ubuntu 部署ChatGLM3大语言模型

Ubuntu 部署ChatGLM3大语言模型 ChatGLM3 是智谱AI和清华大学 KEG 实验室联合发布的对话预训练模型。 源码&#xff1a;https://github.com/THUDM/ChatGLM3 部署步骤 1.服务器配置 Ubuntu 20.04 8核(vCPU) 32GiB 5Mbps GPU NVIDIA T4 16GB 硬盘 100GiB CUDA 版本 12.2.2/…

适用于 Windows 的 10 个顶级 PDF 编辑器 [免费和付费]

曾经打开PDF文件&#xff0c;感觉自己被困在数字迷宫中吗&#xff1f;无法编辑的文本、无法调整大小的图像以及签署感觉像是一件苦差事的文档&#xff1f;好吧&#xff0c;不用再担心了&#xff01;本指南解开了在 Windows 上掌握 PDF 的秘密&#xff0c;其中包含 10 款适用于 …

04 MySQL --DQL 专题--Union、exists

1. UNION、UNION ALL UNION 关键字的作用&#xff1f; 合并两个或多个 SELECT 语句的结果。发挥的作用与 or 非常相似 UNION关键字生效的前提&#xff1f; 每个 SELECT 语句必须拥有相同数量的列。每个 SELECT 语句中的列的顺序必须相同。列必须拥有相似的数据类型。 SELEC…