如何使用cuda进行图像矫正

普通矫正

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

c 复制代码
	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进行加速

c 复制代码
#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);

    // 将映射表上传到 GPU
    cv::cuda::GpuMat mapX_GPU, mapY_GPU;
    mapX_GPU.upload(mapX);
    mapY_GPU.upload(mapY);

    // 加载输入图像到 GPU
    cv::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();

    // 下载结果到 CPU
    cv::Mat dstImage;
    dstImage_GPU.download(dstImage);

    // 现在您可以在 CPU 上使用校正后的图像了

    return 0;
}

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

相关推荐
skywsp5 分钟前
Agent智能体架构设计-知识整理
大数据·人工智能
IT_陈寒5 分钟前
Vue动态组件缓存的坑你踩过了吗?
前端·人工智能·后端
彩虹洋葱5 分钟前
system_prompt 设为空、goal 设为 None,Claude 在虚拟荒岛跑了 30 小时:它开始给自己设目
人工智能
点PY12 分钟前
《VLM-FO1》论文精读
人工智能
BSD_CGQ20 分钟前
人形机器人触觉放量,柔性压力传感器采购该核验什么?
人工智能·机器人·压力传感器·源头工厂·柔性薄膜压力传感器
内容营销专家刘鑫炜24 分钟前
AI搜索实战专家刘鑫炜:做AI搜索第一步,首先得让 AI 看到你
大数据·人工智能
鬼手爱剪辑36 分钟前
短剧AI 配音技术的难点、原理、开源和闭源软件汇总-2026 年
人工智能
田里的水稻37 分钟前
PyTorch_Dataloader\TensorBoard---数据加载与可视化
人工智能·pytorch·python·神经网络·机器学习
卿卿的产品经理日记44 分钟前
【AI产品经理实战】Day 38|try-except 踩坑实录:报错是数据
人工智能·笔记·python·学习·产品经理
cxj75141 小时前
GEO 工程化实践:关键页面的快慢双轨更新与多引擎引用维护
人工智能·geo·geo优化