opencv+CUDA9.1+vs2015环境搭建,编译opencv库,调用GPU加速运算

2023-05-16

1.准备工作(需要用的软件安装)

1.1安装VS2015

CUDA是以VS为基础的,因此要先安装VS。安装CUDA的时候会自动检测VS的版本。安装步骤较简单,下载在线安装程序之后双击即可,配置栏有关C++的都勾上,其中最重要的一项为VC++,点击下一步安装。

 

1.2安装CUDA

解压和安装路径最好不要改,否则会出现找不到路径之类的不要麻烦。

 CUDA解压完后会自动安装,出现检查系统兼容性的界面。如果你的显卡适用的版本比CUDA版本高,则会出现硬件找不到的错误,不必理会,下一步安装。

我的显卡是GTX1050,CUDA版本是9.1.126,而我安装的CUDA版本是9.1.85,因此会出现找不到硬件,不要紧,点击“继续”安装

同意并继续

选择“自定义”->“下一步”

只勾选"CUDA"

 这里的安装位置不要改,按默认的就行,“下一步"

之后便是等待安装。。。。

安装完:

使用nvcc -V查看是否安装成功

 

 1.3 安装Cmake

百度上下载一个,版本不要太低也不要太高,我用的是3.10.1,下一步安装就行,没特别的。

1.4 下载opencv源码

到opencv官网下载opencv源码。

2.编译opencv源码

安装好以上基础工具之后可以进入下一步编译opencv源码了。

打开Cmake。

 1处为源代码路径,2处为Cmake配置后的路径。配置好之后点击configure。

选择“Visual Studio 14 2015 win64 ” 和 “use  defalut native compilers"   后点击Finish,等待配置完毕。 如果你的CUDA安装正确会检测到你的CUDA版本。在配置过程中会联网下载点东西,如果这时候网络不好的话会报错,在Cmake编译的Log文件中有需要下载的文件和文件对应的网址,可以等网络好的时候再联网下载,将下载好的文件放入原位置即可。

配置完成之后点击生成(注意勾选WITH_CUDA)

生成完毕之后在 “ Configuring done"下面会出现”Generating done"。之后直接点击“Open Project",便会使用VS2015打开工程。

在 VS2015界面  点击 “ 生成”->“配置管理器”,在配置管理器中选择 “ALL_BUILD"和”INSTALL“ ,生成即可 。这个时候看电脑速度了,我电脑是I7-8750H ,GTX1050 编译了四个多小时。

编译成功后在自己选的Cmake的Build路径下会出现一个install文件夹,这个就是咱编译后生成的文件。

3.运行CUDA代码测试

3.1配置opencv运行环境

   opencv运行环境配置不难,主要有两个步骤:

3.1.1  配置系统环境变量

按照下图顺序进入到环境变量对话框,添加生成bin路径。

 3.1.2 VS2015包含库路径配置

按照自己的平台添加属性表,我的是Debug X64平台,因此在Debug|X64下添加一个“OpencvProjectySheet"。在“OpencvProjectySheet"中的”VC++“目录中添加包含目录和库目录。

在”链接器“中添加宏定义。

 这些库文件全是自己通过VS2015编译出来的。这个也是检查自己编译是否成功的标准,如果编译不成功,则没有库文件;编译成功则有需要的库文件。

3.2测试例程(代码)

3.2.1测试代码

/*直接在cu文件中实现cuda与opencv混合编程*/
#include "cuda_runtime.h"
#include "device_launch_parameters.h"
#include <stdio.h>
#include <opencv2/opencv.hpp>
#include <iostream>
#include <opencv2/cudaobjdetect.hpp>

using namespace std;
using namespace cv;
using namespace cuda;
#ifdef _DEBUG
#pragma comment ( lib,"opencv_core340d.lib")
#pragma comment ( lib,"opencv_highgui340d.lib")
#pragma comment ( lib,"opencv_calib3d340d.lib")
#pragma comment ( lib,"opencv_imgcodecs340d.lib")
#pragma comment ( lib,"opencv_imgproc340d.lib")
#pragma comment ( lib,"opencv_cudaimgproc340d.lib")
#pragma comment ( lib,"opencv_cudaarithm340d.lib")
#pragma comment ( lib,"cudart.lib")
#else
#pragma comment ( lib,"opencv_core340.lib")
#pragma comment ( lib,"opencv_highgui340.lib")
#pragma comment ( lib,"opencv_calib3d340.lib")
#pragma comment ( lib,"opencv_imgcodecs340.lib")
#pragma comment ( lib,"opencv_imgproc340.lib")
#pragma comment ( lib,"opencv_cudaimgproc340.lib")
#pragma comment ( lib,"opencv_cudaarithm340.lib")
#pragma comment ( lib,"cudart.lib")
#endif

//出错处理函数
#define CHECK_ERROR(call){\
    const cudaError_t err = call;\
    if (err != cudaSuccess)\
    {\
        printf("Error:%s,%d,",__FILE__,__LINE__);\
        printf("code:%d,reason:%s\n",err,cudaGetErrorString(err));\
        exit(1);\
    }\
}

 

int main(int argc, char **argv)
{
    
    VideoCapture cap;
    //cap.open("rtsp://admin:admin@192.168.1.108:80/cam/realmonitor?channel=1&subtype=0");
    cap.open(0);
    if(!cap.isOpened())    
        return -1;

    Mat frame;
    cuda::GpuMat  cu_dst;

    Ptr<cuda::CascadeClassifier> cascade_gpu = cuda::CascadeClassifier::create("D:\\opencv3_4_0\\sources\\data\\haarcascades_cuda\\haarcascade_frontalface_default.xml");

    vector<Rect> faces;

    while (1)
    {
        cap >> frame;
        if (frame.empty())
            break;

        cuda::GpuMat image_gpu(frame);

        cascade_gpu->detectMultiScale(image_gpu, cu_dst);
        
        cascade_gpu->convert(cu_dst, faces);

        for (int i = 0; i < faces.size(); ++i)
            rectangle(frame, faces[i], Scalar(255));

        imshow("faces", frame);
        //等待用户按键
        waitKey(1);

    };

    cap.release();
    return 0;
    /*以下代码是用 一张图片进行测试的*/
    /*
    Ptr<cuda::CascadeClassifier> cascade_gpu = cuda::CascadeClassifier::create("D:\\opencv3_4_0\\sources\\data\\haarcascades_cuda\\haarcascade_frontalface_default.xml");
    Mat image_cpu = imread("D:\\opencv_work\\006.jpg");
    imshow("image_cpu", image_cpu);
    GpuMat image_gpu(image_cpu);
    GpuMat objbuf;
    cascade_gpu->detectMultiScale(image_gpu, objbuf);
    std::vector<Rect> faces;
    cascade_gpu->convert(objbuf, faces);
    for (int i = 0; i < faces.size(); ++i)
        cv::rectangle(image_cpu, faces[i], Scalar(255));
    imshow("Faces", image_cpu);
    waitKey(0);
    destroyAllWindows();
    return 0;
    */
}

3.2.2 实验结果

调用摄像头进行人脸识别,使用Opencv的CascadeClassifier分类器做运算量是及其大的,但从右侧可以看到CPU的占用率很低,说明主要的运算不在CPU,能快速执行这样大运算量的地方也只有GPU了。

可以用CPU执行同样的算法对比一下,右侧的CPU占用率极高。通过任务管理器看的话CPU占用会达到100%。

进一步对比,cuda的CascadeClassifier识别命中率不如CPU的CascadeClassifier。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

opencv+CUDA9.1+vs2015环境搭建,编译opencv库,调用GPU加速运算 的相关文章

  • 使用BeanCopier抛出NullPointerException溯源

    问题 使用cglib提供的net sf cglib beans BeanCopier进行对象拷贝时 xff0c 抛出如下异常 xff1a Exception in thread span class token string 34 main
  • 自制Alfred/Wox插件推荐

    最近上手Alfred的使用 xff0c 日常工作中存在很多需要高频执行的连续性动作 xff0c 将这一系列动作封装成Workflow xff0c 通过命令触发 xff0c 对提升效率确有很大帮助 自己封装了一些简单的Workflow xff
  • Python删除某一目录下的空文件(夹)

    Python删除某一目录下的空文件 夹 用途 输入文件夹路径 xff0c 将此文件夹下所有的空文件夹和空文件删除 xff0c 算是文件操作的一个习作吧 我拿它做什么就不广而告之了 代码 span class hljs comment cod
  • Win10下pip的安装

    pip简介 pip 是一个安装和管理 Python 包的工具 xff0c 通过pip我们能够轻松地下载和卸载python的第三方包 原料 64位Windows10 专业版python 2 7 12 下载安装包 进入python官方网站 xf
  • Python爬虫爬取动态页面思路+实例(一)

    简介 有时候 xff0c 我们天真无邪的使用urllib库或Scrapy下载HTML网页时会发现 xff0c 我们要提取的网页元素并不在我们下载到的HTML之中 xff0c 尽管它们在浏览器里看起来唾手可得 这说明我们想要的元素是在我们的某
  • zerorpc-python官方入门

    原文地址 xff1a http www zerorpc io 一个易于使用的 xff0c 直观的 xff0c 跨语言的RPC zerorpc是一个在服务端进程上提供分布式通信的轻量级的 可靠的跨语言的库 它基于ZeroMQ和MessageP
  • Python保存json文件并格式化

    背景 最近自己搞些小东西 xff0c 需要用json文件存储些文件属性什么的 xff0c 但是发现用json包里的json dump 方法存json文件的效果好丑 xff08 其实是没仔细看方法 xff09 于是上网找了一份格式化json文
  • No module named 'django.templates'起因和解决

    当我跟着django官网上的教程写到template模板这一部分的时候 xff0c 出现了上述问题 span class hljs constant No span span class hljs class span class hljs
  • Celery ValueError: not enough values to unpack (expected 3, got 0)的解决方案

    背景 最近因项目需要 xff0c 学习任务队列Celery的用法 xff0c 跟着官网写Demo xff0c 出现如题错误 xff0c 最终在github的Issues里找到解决办法 xff0c 记录如下 场景还原 本地环境如下 xff1a
  • 震惊!Selenium分手PhantomJS

    背景 今天本地调试基于Selenium 43 PhantomJS的动态爬虫程序顺利结束后 xff0c 着手部署到服务器上 xff0c 刚买的热乎的京东云 xff0c 噼里啪啦一顿安装环境 xff0c 最后跑的时候报了这么个错误 xff1a
  • 基于labview的姿态测量系统上位机界面编写

    当时学习VB是为了写个上位机去控制LED亮灭 xff0c 相信大家学习51 stm32都是从流水灯开始的 xff0c 就像那句 hello world 一样经典 后来学习了LABVIEW xff0c 决定用它写个界面 当时主要是想用LABV
  • STM32解析SBUS信号例程详解

    文章目录 1 SBUS信号简介2 STM32F7解析SBUS信号例程 xff08 1 xff09 串口配置 xff08 2 xff09 串口中断接收 xff08 3 xff09 信号解析 1 SBUS信号简介 最近在搞一个项目的通信和控制
  • STM32实现四驱小车(二)通信任务——遥控器SBUS通信

    目录 一 遥控器通信原理简介二 SBUS信号解析1 SBUS信号简介2 STM32F7解析SBUS信号 三 通信任务实现 一 遥控器通信原理简介 要实现一个遥控小车当然要有一个遥控器了 xff0c 目前市面上常用的航模遥控器基本都是2 4G
  • STM32实现四驱小车(四)姿态控制任务——偏航角串级PID控制算法

    目录 一 绪论二 角度环串级PID原理1 PID基本算法2 姿态角串级PID原理 三 如何用STM32实现角度 角速度的串级PID控制1 PID算法的代码实现2 串级PID算法的代码实现 四 UCOS III姿态控制任务的实现 一 绪论 这
  • resource not found: ROS path [0]=/opt/ros/kinetic/share/ros ROS path [1]=/opt/ros/kinetic/sh

    问题 xff1a 1 resource not found ROS path 0 61 opt ros kinetic share ros ROS path 1 61 opt ros kinetic sh 2 Running xacro f
  • C++问题及解决记录

    目录 1 xff0c 无法include问题 2 xff0c c 43 43 多线程如何调试 3 opencv两个mat 相减 xff0c 从数学计算上不应为0 xff0c 但是结果为0 4 代码正确但是还是报错的问题 1 xff0c 无法
  • freertos任务管理

    TODO xff08 未完待续 xff09 核心调度器的调度实现部分介绍完成时间片的处理介绍完成任务切换处理介绍完成空闲任务未完成定时器任务未介绍完成通信方式实现未介绍完成 freertos概述 freertos属于小系统实时操作系统 xf
  • docker build

    docker build命令会根据Dockerfile文件及上下文构建新Docker镜像 构建上下文是指Dockerfile所在的本地路径或一个URL xff08 Git仓库地址 xff09 构建上下文环境会被递归处理 xff0c 所以 x
  • FreeRTOS任务间通信方式——队列

    一 三种任务调度方式 优先级抢占式调度 每个任务都赋予了一个优先级每个任务都可以存在于一个或多个状态在任何时候都只有一个任务可以处于运行状态调度器总是在所有处于就绪态的任务中选择具有最高优先级的任务来执行 选择任务优先级 这种任务调度方式是
  • 改变ros bag 中消息的frame_id 和话题名

    1 改变话题名 参考链接 https blog csdn net ethan guo article details 80262650 rosbag play file bag foo 61 bar foo是原topic xff0c bar

随机推荐

  • ROS下单目相机标定过程

    下面简单记录一下我利用ros标定相机参数的过程 xff0c Ubuntu 16 04 xff0c 摄像头用的罗技C920 ROSwiki有相机矫正的官方文档 xff0c 有单目的也有立体相机的教程 xff0c 建议直接看原文 xff0c 原
  • ADC与DMA回顾

    12位ADC是一种逐次逼近型模拟数字转换器 它有多达18个通道 xff0c 可测量16个外部和2个内部信号源 各通道的A D转换可以单次 连续 扫描或间断模式执行 ADC的结果可以左对齐或右对齐方式存储在16位数据寄存器中 ADC 的输入时
  • C++实现rviz 2D Pose Estimate 功能设置机器人初始坐标

    1 首先查看设置初始坐标的话题 为 intialpose xff0c 查看消息类型和格式从而决定怎么给它发数据 xff08 1 xff09 首先打开一个可以自动导航的项目文件 xff0c 打开rviz xff0c 点击2D Pose Est
  • PHPWord 导出模版Word文件,无法打开,提示xml pasring error

    最近在处理网站批量导出模版word时 xff0c 遇到一个问题 xff1a 网站是用PHP语言编写的 xff0c 导出模版word xff08 即将用户填写内容动态的插入word相应位置 xff0c 生成 doc或 docx文件 xff09
  • windows多线程分析——Semaphore(信号量)

    Semaphore相当于升级版的Mutex xff0c 因为当CreateSemaphore NULL 1 1 NULL 中第三个参数为1时 xff0c 就相当于是在CreateMutex 看一个CreateSemaphore NULL 1
  • windows下的tensorflow安装教程

    转载 xff1a https www cnblogs com lvsling p 8672404 html https blog csdn net Eppley article details 79297503 一 前言 本次安装tenso
  • TX2学习笔记(1)——NVIDIA Jetson TX2 开箱上电

    期待已久的NVIDIA Jetson TX2终于到货了 xff0c 迫不及待拆箱上电学习学习 xff01 第一次接触这么高配置的板子 xff0c 拆箱上电还是比较束手束脚 xff0c 怕一不小心就弄坏了 xff0c 好在这板子质量确实可以
  • 从零开始Cubemx配置STM32搭载freeRTOS以及lwip实现tcp网络通信(二)

    从零开始Cubemx配置STM32搭载freeRTOS以及lwip实现网络通信 引言CubeMX配置以太网以及LWIP实现一个回环功能 xff08 裸机 xff09 ETH配置LWIP配置 CubeMX配置以太网以及LWIP实现一个回环功能
  • 让电脑使用手机的摄像头做直播

    一 xff0c 软件准备 xff08 1 xff09 直播软件 xff1a bilibili直播姬 xff08 2 xff09 摄像头工具 xff1a DroidCam xff0c PC端和手机端 xff08 提取码 xff1a 43n1
  • pixhawk 开发日记--开发环境搭建

    我用的是Ubuntu20 04 一 源码下载 编译 烧写 1 下载源码 git clone https github com PX4 PX4 Autopilot git recursive 2 下载子仓库代码 git submodule u
  • APM中SBUS信号解析

    一 SBUS信号概述 SBUS信号以串口传输 xff0c 波特率为100000bps 每2ms一帧 xff0c 一帧25个字节 其中第0字节为起始帧 xff0c 固定为0x0F 第24字节为帧尾 第1 22字节为1 16比例通道数据字节 第
  • 使用simulink分析APM日志信息

    一 将bin转化成mat文件 使用mission planner将bin文件转化成mat文件 二 将工作区变量转化成timeserial对象 RCIN TimeSerial 61 timeseries RCIN 3 RCIN 2 1e6 三
  • Alexa The required native libraries are named “libvlc.dll”

    The required native libraries are named 34 libvlc dll 34 and 34 libvlccore dll 34 In the text below lt libvlc path gt re
  • APM 新版电机电调校准

    旧版的APM电机电调校准需要将油门开到最大后给飞控上电 xff0c 使飞控黄灯常亮后断电 xff0c 继续保持最大油门再给飞控上电 xff0c 听到嘀嘀嘀三声后表示收到遥控器最大油门信号 xff0c 之后再将油门打到最低 xff0c 听到滴
  • APM日志格式表

    APM的日志格式文件在libraries AP Logger LogStructure h文件中 xff0c 二进制数据类型对照表如下 xff1a 单位对照表如下 xff1a
  • APM电机输出逻辑之二

    APM 飞控代码用c 43 43 编写 xff0c 代码中用了很多多态的特性 电机输出相关的函数在void Copter motors output 函数中 由于在Copter类中包含了AP MotorsMulticopter类的实例化对象
  • win11安装ubuntu子系统与桌面 填坑记录

    win11安装ubuntu子系统 win11可以直接从应用市场安装ubuntu子系统 详细安装步骤见参考资料 这里列出一些博主遇到的问题 填坑之路 从应用市场获取ubuntu系统时会报0x80240438或者0x80072efd等错误 网络
  • 机械革命电脑安装Ubuntu18.04+win10正版双系统

    一 电脑设置 系统默认安装了Win10 由于win10系统UEFI的限制 xff0c 其他系统无法加载 因此要装双系统 xff0c 必须先把UEFI模式改成Legacy模式 xff0c 并将Security Boot 改为Disabled
  • python+opencv3生成一个自定义纯色图

    一 图像在计算机中存储为矩阵 矩阵上一个点表示一个像素 若矩阵由一系列0 xff5e 255的整数值组成 xff0c 则表现为灰度图 便于理解 xff0c 以下贴出代码 import cv2 import numpy as np img 6
  • opencv+CUDA9.1+vs2015环境搭建,编译opencv库,调用GPU加速运算

    1 准备工作 xff08 需要用的软件安装 xff09 1 1安装VS2015 CUDA是以VS为基础的 xff0c 因此要先安装VS 安装CUDA的时候会自动检测VS的版本 安装步骤较简单 xff0c 下载在线安装程序之后双击即可 xff