1.新建cuda项目

2. 添加环境
vc++目录-->包含目录添加

D:\Program Files\opencv\opencv-3.4.5\build_cuda\install\include\opencv2
D:\Program Files\opencv\opencv-3.4.5\build_cuda\install\include\opencv
D:\Program Files\opencv\opencv-3.4.5\build_cuda\install\include

vc++目录-->库目录

D:\Program Files\opencv\opencv-3.4.5\build_cuda\install\lib

链接器-->输入-->附加依赖项
加入D:\Program Files\opencv\opencv-3.4.5\build_cuda\install\lib下的所有lib文件,可以通过python代码来输出,然后复制到依赖项中

import ospath = r'D:\Program Files\opencv\opencv-3.4.5\build_cuda\install\lib'for file in os.listdir(path):if file.split('.')[-1] == 'lib':print(file)

3.代码这里我只能两幅图片进行了融合,两幅图片的单应性变换在上一个博客
里已经完成,我直接拿来用的,融合的原理是一样的,这部分代码我只进行了cuda加速,上次使用numpy矩阵融合4.8s,这次使用cuda融合只需要1s。有不明白的地方可以参考下我的另一篇博客

// main.cpp
#include <iostream>
#include <string>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/flann/flann.hpp"
#include<opencv2/calib3d/calib3d.hpp>
#include<opencv2/opencv.hpp>#include "opencv2/core/cuda.hpp"
#include<math.h>
#include<ctime>
using namespace cv::cuda;
using namespace std;
using namespace cv;#include <iostream>
#include <opencv2/opencv.hpp>using namespace cv;void swap_rb(const GpuMat& src1, const GpuMat& src2, GpuMat& dst, int left_x, int right_x, Stream& stream = Stream::Null());
int main()
{Mat right = imread("srcImg.jpg");Mat left = imread("warpImg.jpg");namedWindow("src", WINDOW_NORMAL);namedWindow("gpu", WINDOW_NORMAL);int left_x = 313, right_x = 1079;imshow("src", right);clock_t start, finish;start = clock();GpuMat gpuRight, gpuLeft,output;gpuRight.upload(right);gpuLeft.upload(left);swap_rb(gpuRight, gpuLeft, output, left_x, right_x);Mat image;output.download(image);finish = clock();cout <<"blend time:"<< (finish - start) / CLOCKS_PER_SEC <<"s"<< endl;cout << "img.size:" << image.size() << endl;imshow("gpu", image);waitKey(0);return 0;}
// swap_rb.cpp
#include <iostream>
#include <string>
#include "opencv2/core/core.hpp"
#include "opencv2/features2d/features2d.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/flann/flann.hpp"
#include<opencv2/calib3d/calib3d.hpp>
#include<opencv2/opencv.hpp>
#include "opencv2/core/cuda.hpp"
#include <opencv2/core/cuda_stream_accessor.hpp>using namespace cv::cuda;
using namespace std;
using namespace cv;#include <iostream>
#include <opencv2/opencv.hpp>
void swap_rb_caller(const PtrStepSz<uchar3>& src, const PtrStepSz<uchar3>& src1, PtrStep<uchar3> dst, int left_x, int right_x, cudaStream_t stream);
void swap_rb(const GpuMat& src, const GpuMat& src1, GpuMat& dst,int left_x, int right_x, Stream& stream = Stream::Null())
{CV_Assert(src.type() == CV_8UC3);dst.create(src.size(), src.type());cudaStream_t s = StreamAccessor::getStream(stream);swap_rb_caller(src, src1, dst, left_x, right_x, s);
}
//kernel.cu
#include "cuda_runtime.h"
#include "device_launch_parameters.h"#include <stdio.h>
#include<math.h>
#include <iostream>
#include <sstream>
#include <opencv2/opencv.hpp>
#include <ctime>
#include "opencv2/core/cuda.hpp"using namespace std;
using namespace cv;
using namespace cv::cuda;//自定义内核函数
__global__ void swap_rb_kernel(const PtrStepSz<uchar3> src1, const PtrStepSz<uchar3> src2,PtrStep<uchar3> dst, int left_x, int right_x)
{int j = threadIdx.x + blockIdx.x * blockDim.x;int i = threadIdx.y + blockIdx.y * blockDim.y;int src1pix = src1(i,j).x + src1(i,j).y + src1(i,j).z;int src2pix = src2(i,j).x + src2(i,j).y + src2(i,j).z;if (i>=0 && j>=0  ){//if (j < left_x)if(src2pix==0){            dst(i, j) = src1(i, j);        }else if (src1pix==0)//(j >= right_x){dst(i, j) = src2(i, j);        }else{//float d = (j - left_x) / (float)X;float srcLen = abs(j-left_x);float warpLen = abs(j-right_x);float d = srcLen/(srcLen+warpLen);dst(i, j).x = (uchar)(src1(i, j).x * (1 - d) + src2(i, j).x * d);dst(i, j).y = (uchar)(src1(i, j).y * (1 - d) + src2(i, j ).y * d);dst(i, j).z = (uchar)(src1(i, j).z * (1 - d) + src2(i, j).z * d);//printf("HelloWorld! CPU %d %d %d\n", dst(i, j).x, dst(i, j).x, dst(i, j).x);//    dst(i, j) = (uchar)(src1(i, j) * (1 - d) + src2(i - Y, j - left)[k] * d);}}
}void swap_rb_caller(const PtrStepSz<uchar3>& src, const PtrStepSz<uchar3>& src1, PtrStep<uchar3> dst, int left_x, int right_x, cudaStream_t stream)
{dim3 block(32,8);dim3 grid((src.cols + block.x - 1)/block.x,(src.rows + block.y - 1)/block.y);swap_rb_kernel<<<grid,block,0,stream>>>(src, src1, dst, left_x, right_x);if(stream == 0)cudaDeviceSynchronize();
}


图片融合 c++ cuda加速相关推荐

  1. CUDA加速图像融合

    在这篇文章之前我们已经介绍过一篇图像拼接过程中使用CUDA加速融合,但是还存在着一些不足,需要配置C++的一些编译环境,这个比较麻烦,实际应用麻烦一些.本文在这里借助python.pytorch.cu ...

  2. 用好CUDA加速 6款视频软件评测与指南

    从2008年下半年开始和GTX280的发布,NVIDIA的GPU从传统的单一3D渲染角色快速像通用并行处理器+3D渲染角色转变.近一年来,基于NVIDIA CUDA架构GPU的应用情况已经非常清晰.基 ...

  3. 使用c++onnxruntime部署yolov5模型并使用CUDA加速(超详细)

    文章目录 前言 1.Yolo简介 2.onnxruntime简介 3.Yolov5模型训练及转换 4.利用cmake向C++部署该onnx模型 总结 前言 接到一个项目,需要用c++和单片机通信,还要 ...

  4. 写一个python函数 用cuda加速

    好的,下面是一个用 CUDA 加速的 Python 函数的示例: import numpy as np import cupy as cpdef accelerate_with_cuda(x, y): ...

  5. python+opencv+图像特效(图像灰度处理、颜色翻转、图片融合,边缘检测,浮雕效果,颜色映射)

    原图 图像灰度处理 #方式1 import cv2 #读取彩色原图 img0=cv2.imread('E:/python_cv/01.jpg',1) #读取灰度图 img1=cv2.imread('E ...

  6. nvidia显卡加速matlab,利用nvidia cuda加速simulink S-function

    本帖最后由 蓝云风翼 于 2010-9-15 21:54 编辑 #define S_FUNCTION_NAME simuCuda /* Defines and Includes */ #define ...

  7. Ubuntu18.04安装opencv4.5.1+contrib 支持cuda加速(附带编译好的opencv4.5.1及缺失文件)

    先前准备: 1.最好不要改动ubuntu默认的python2与3的版本,容易出问题.需要选择时用python,python3,python3.x选择即可. 2.ubuntu18.04 pc端装机自带的 ...

  8. CUDA加速计算矩阵乘法进阶玩法(共享内存)

    CUDA加速计算矩阵乘法&进阶玩法~共享内存 一.基础版矩阵乘法 二.为什么可以利用共享内存加速矩阵乘法 1.CUDA内存读写速度比较 2.申请共享内存 三.改进版矩阵乘法(利用共享内存) 一 ...

  9. opencv dnn模块 示例(15) opencv4.2版本dnn支持cuda加速(vs2015异常解决)

    opencv在4.2.0版本正式发布,DNN深度神经网络模块集成Google Summer of Code的项目CUDA后端支持.(详细changelog) 1.编译 常规编译过程,这里使用软硬件环境 ...

最新文章

  1. HTML5学习笔记(二):HTML基础学习之一
  2. 你的大脑里有AI吗?
  3. 黑马程序员 oc对象的方法成员变量
  4. Tornado 学习笔记
  5. SIEM比以往更重要的5个原因
  6. java安装后启动程序在哪_java – 有没有办法在安装后使用一些“帮助应用程序”立即启动应用程序?...
  7. [mount]linux 挂载时 mount: wrong fs type, bad option, bad superblock on /dev/sdb
  8. 删除字符,用外部函数
  9. yuki翻译器钩子_最新YUKI GALGAME翻译器下载地址电脑版-CC软件
  10. 宝立食品IPO股价八连涨 是业绩支撑还是资本迷局?
  11. 幼儿园故事导入语案例_幼儿园活动教案导入语
  12. CCF201809-1 卖菜(JAVA)
  13. 使用frp端口映射实现内网穿透(SSH、HTTP服务)
  14. 【好书推荐】《只有偏执狂才能生存》—安迪.格鲁夫
  15. 【3】三剑客:grep
  16. 兼容NVIDIA Jetson Xavier AGX/Orin的GMSL 设计与调试
  17. mysql中工资表,MySQL操作工资表,获取累计工资和月平均工资
  18. 计算机网络的便件功能
  19. Win7 Print Spooler服務自动关闭
  20. 纽约大学 计算机科学 录取分数线,上海纽约大学

热门文章

  1. 安卓 网络工具_小米公布MIUI适配计划,支持10台机型升级安卓Q,9款今年内测
  2. VERTU广告登陆央视:情怀与创新的恪守之道
  3. win10搜索框突然不能使用了
  4. 电子元器件:三极管参数笔记(持续记录)
  5. Ambari学习13_安装ambari的时候遇到的ambari和hadoop问题集
  6. 【吉大刘大有数据结构绿皮书】向LinkedList类中增加一个函数Contrary,功能为将其所有结点按相反次序链接。
  7. 浪潮服务器NF5280m5 raid硬盘驱动 配置,raid和系统
  8. (C语言)啥?4除以2等于0?
  9. 网络与协议2022 - Practice Questions - Block 1
  10. 用CSS定义每段首行缩进2个字符