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

相关推荐
晓数1 小时前
“平价”微智码初尝试
人工智能·jetbrains
新加坡内哥谈技术1 小时前
MCP:人工智能时代的HTTP?探索AI通信新标准
人工智能·自然语言处理·chatgpt
0x2113 小时前
[论文阅读]REPLUG: Retrieval-Augmented Black-Box Language Models
论文阅读·人工智能·语言模型
JOYCE_Leo164 小时前
一文详解卷积神经网络中的卷积层和池化层原理 !!
人工智能·深度学习·cnn·卷积神经网络
~央千澈~5 小时前
对鸿蒙 Next 系统“成熟论”的深度剖析-优雅草卓伊凡
人工智能
Donvink5 小时前
【视频生成模型】通义万相Wan2.1模型本地部署和LoRA微调
人工智能·深度学习·aigc·音视频
訾博ZiBo5 小时前
AI日报 - 2025年04月29日
人工智能
爱喝奶茶的企鹅5 小时前
Ethan独立开发产品日报 | 2025-04-27
人工智能·程序员·开源
极小狐5 小时前
如何对极狐GitLab 议题进行过滤和排序?
人工智能·git·机器学习·gitlab