如何使用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,对于这样的程序来说,我们直接使用,速度是最快的

相关推荐
NAGNIP3 小时前
一文搞懂深度学习中的通用逼近定理!
人工智能·算法·面试
冬奇Lab4 小时前
一天一个开源项目(第36篇):EverMemOS - 跨 LLM 与平台的长时记忆 OS,让 Agent 会记忆更会推理
人工智能·开源·资讯
冬奇Lab4 小时前
OpenClaw 源码深度解析(一):Gateway——为什么需要一个"中枢"
人工智能·开源·源码阅读
AngelPP8 小时前
OpenClaw 架构深度解析:如何把 AI 助手搬到你的个人设备上
人工智能
宅小年8 小时前
Claude Code 换成了Kimi K2.5后,我再也回不去了
人工智能·ai编程·claude
九狼8 小时前
Flutter URL Scheme 跨平台跳转
人工智能·flutter·github
ZFSS8 小时前
Kimi Chat Completion API 申请及使用
前端·人工智能
天翼云开发者社区9 小时前
春节复工福利就位!天翼云息壤2500万Tokens免费送,全品类大模型一键畅玩!
人工智能·算力服务·息壤
知识浅谈10 小时前
教你如何用 Gemini 将课本图片一键转为精美 PPT
人工智能
Ray Liang10 小时前
被低估的量化版模型,小身材也能干大事
人工智能·ai·ai助手·mindx