opencv加速

部署运行你感兴趣的模型镜像


微软官方各产品文档: https://learn.microsoft.com/zh-cn/docs/
c++的简单的学习总结文档: https://www.runoob.com/cplusplus/cpp-pointers.html
visual studio : https://visualstudio.microsoft.com/zh-hans/vs/older-downloads/

Visual Studio opencv配置

配置链接:https://blog.youkuaiyun.com/qq_42775328/article/details/122452007
opencv下载链接:https://opencv.org/releases/

opencv安装以及环境配置

1、官网下载安装包XXX.exe,直接进行安装
2、配置(采用2019版本)

1、新建文件夹--》 扩散板右上角缺口检测
2、创建文件夹---》扩散板右上角缺口检测>exe,扩散板右上角缺口检测>lib,扩散板右上角缺口检测>include
3、找到安装好的opencv目录,打开XXX\opencv\opencv\build\include,将include文件夹下的所有文件,拷贝到新创建的include目录下(头文件);
  将XXX\opencv\opencv\build\x64\vc15\lib,文件夹下的所有文件拷贝的新建的lib文件夹下(lib文件);
  将XXX\opencv\opencv\build\x64\vc15\bin,文件夹下所有文件,拷贝到新建的exe文件夹下(dll文件);

打开Visual Studio2019,创建项目,项目地址选择《扩散板右上角缺口检测》文件夹,项目名称随意(这里是damage_detect可以点击解决方案和项目放在同一目录中,如果点击了放在一起,则下面的相对路径..\..\XXX 则要变成..\XXX 的形式,如..\..\lib 需要改成 ..\lib 的形式)
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
右键damage_detect,选择属性>配置管理器—>活动解决方案配置:Release;活动解决方案平台:X64

  • 属性配置->常规->常规属性->输出目录:..\..\exe
  • 属性配置->高级->高级属性->字符集:使用多字节字符集
  • 属性配置->VC++目录->常规->包含目录:..\..\include 回车 ..\..\include\opencv 回车 ..\..\include\opencv2
  • 属性配置->VC++目录->常规->库目录: ..\..\lib
  • 属性配置->连接器->输入->附加依赖项:opencv_world460.lib 回车 opencv_world460d.lib
  • 如果要使用debug模式,debug也需要进行同样的配置
    opencv测试
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;

int main(int argc, char** args)
{
	//1、读取图像
	string path = "D:/Users/User/Desktop/c++/new_test/data/1_891ok5.png";
	Mat img = imread(path, IMREAD_UNCHANGED);
	//显示原图
	namedWindow("img", WINDOW_AUTOSIZE);
	cv::imshow("img", img);
	//判断图像是否为空,为空就结束程序
	if (img.empty())
	{
		printf("this img is empty");
		return -1;
	}

	//进行颜色变换
	Mat output;
	cvtColor(img, output, COLOR_BGR2HSV);
	//定义一个显示窗口
	namedWindow("output", WINDOW_AUTOSIZE);
	imshow("output", output);
	//窗口停留
	waitKey();
	//保存图像
	imwrite("G:/imgtest/result.png", output);
	return 0;
}

其他
在编译已有工程时,需要注意:Windows SDK 版本: 10.0(最新安装的版本) 和 平台工具集: Visual Studio 2019 (v142)两个选项(要和现有版本对应),编译前清理下,不然可能链接到老版本的编译文件。

方法一

  • OpenCV基于OpenCL进行加速,ocl作为一个专门的模块,里边重新构建了一系列可以加速的算子
    但是使用ocl加速后,时间反而边长
#测试结果
ocl run time is:18203ms!
normal run time is:14704ms! 

测试代码:

#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
#include <iostream>
#include<windows.h>

using namespace std;
using namespace cv;
using namespace ocl;

int main(int argc, char** args)
{   

	//1、读取图像
	string path = "D:\\xcs\\opencv加速\\资料包\\new_test\\data/test.jfif";
    
    /////////////////////////////////////////////////////////////////////////////////////
    ocl::setUseOpenCL(true);
    UMat src, bw, blur, edge;

    DWORD start_time1 = GetTickCount();
    src = imread(path).getUMat(ACCESS_RW);
    for (int i = 0; i < 100; i++) {

        cvtColor(src, bw, COLOR_BGR2GRAY);
        GaussianBlur(bw, blur, Size(3, 3), 0);
        Canny(blur, edge, 50, 100, 3);
        //cout << "i is:" << i << endl;//输出运行时间
    }
    DWORD end_time1 = GetTickCount();
    cout << "ocl run time is:" << (end_time1 - start_time1) << "ms!" << endl;//输出运行时间
    
    /////////////////////////////////////////////////////////////////////////////////////
    Mat src1, bw1, blur1, edge1;

    DWORD start_time = GetTickCount();
    src1 = imread(path);
    for (int i = 0; i<100; i++) {
        cvtColor(src1, bw1, COLOR_BGR2GRAY);
        GaussianBlur(bw1, blur1, Size(3, 3), 0);
        Canny(blur1, edge1, 50, 100, 3);
        //cout << "i is:" << i << endl;//输出运行时间
    }
    DWORD end_time = GetTickCount();
    cout << "normal run time is:" << (end_time - start_time) << "ms!" << endl;//输出运行时间

    //imshow("res", edge);
    //waitKey(0);

	return 0;
}

方法二(重新编译):

基础环境安装资源链接:

  • 显卡算力查询:https://developer.nvidia.com/zh-cn/cuda-gpus#compute
  • 显卡驱动下载链接:https://www.nvidia.cn/geforce/drivers/
  • CUDA下载链接:https://developer.nvidia.com/cuda-toolkit-archive
  • CUDNN下载链接:https://developer.nvidia.com/rdp/cudnn-archive
    • 解决登录不了的问题:
      登录如上地址,选择对应的cudnn,点开,选择对应系统的cudnn,然后复制链接(不要直接点,直接点会让登录),然后添加到迅雷下载任务中(如果已经安装迅雷,会自动弹出),点击下载即可
      参考博客:绕过Nvidia官方要求的注册或登陆步骤直接下载cuDNN的方法
      地址:https://blog.youkuaiyun.com/weixin_40392957/article/details/80207366
  • opencv下载地址:https://opencv.org/releases/
    • opencv源码/github:https://github.com/opencv/opencv/
    • 重新编译时需要的opencv_contrib:https://github.com/opencv/opencv_contrib/
    • cmake的cache文件需要梯子,也是编译时需要
  • cmake下载地址:https://cmake.org/download/

需求基础环境:

opencv:4.5.1 -||- CUDA:11.1.105 / cudnn:8.0.5 -||- GPU:3060 -||- VS:2019 -||- cmake:3.25.1
因为有的文件是需要搭梯子的,比如ippicv,有条件的朋友自行解决,没有的网上会有一些下载好的,放在了.cache文件夹里面,并且需要把.cache文件夹放到opencv源码目录里面
在这里插入图片描述在这里插入图片描述

编译步骤方法:

①、将下载好的opencv 4.5.1和opencv_contrib 4.5.1解压,放到一个文件夹里面(opencv451),再到opencv451文件夹新建build文件夹.(opencv-4.5.1和opencv_contrib-4.5.1直接是项目文件,没有多余的目录层,opencv451的上层目录不要有中文)
在这里插入图片描述
②、设置源码路径和cmake编译后代码存储路径,在cmake里添加opencv4.5.1文件夹和build文件夹,如下图。
请添加图片描述
③、点configure(第一次),如果需要在其他平台跑,就在第二个框选择对应平台,默认选x64,配置完成后,点击Finish,并再次点击configure(第二次),开始编译,现在等待ing
请添加图片描述
④、configure done后(配置完成后自动 检索/编译 成功后)

  • 在search框内输入cuda,三个全部将value打勾
    请添加图片描述

  • search框搜MODULES,在OPENCV_EXTRA_MODULES_RATH一项,添加opencv_contrib4.5.1中的modules目录
    请添加图片描述

  • search框搜NON,把OPENCV_ENABLE_NONFREE 的value打勾

  • search框搜world,将build_opencv_world的value打勾,将所有opencv的库都编译在一起不需要自己一一添加每个小模块

  • 如果电脑配置一般,建议找到列表中的“BUILD_TESTS”,“BUILD_PERF_TESTS”,“BUILD_EXAMPLES”,把勾去掉,可以缩短最后生成解决方案的时间,电脑还可以的朋友建议保留。
    请添加图片描述
    ⑤、算力设置,点击configure(第三次),再次等待,会出现Configuring done,

  • 再次搜索框输入cuda,CUDA_ARCH_BIN中将显卡的算力内容改成自己显卡的算力,如果默认,在编译时会比较耗时,同时一些老的算力平台会报警告,如:

nvcc warning : The 'compute_35', 'compute_37', 'compute_50', 'sm_35', 'sm_37' and 'sm_50'
 architectures are deprecated, and may be removed in a future release 
 (Use -Wno-deprecated-gpu-targets to suppress warning).

请添加图片描述

  • 或者cuda_generation设置为auto:
    请添加图片描述
    ⑥、点击confige(第四次),等待Configuring done,然后点击Generate,稍等片刻出现Generating done!然后点击Open Project,它会启动你的Visual Studio
    请添加图片描述
    备注:最好以管理员身份打开vs2019,然后在build文件夹下选择 OpenCV.sln 进行打开。
    其他加快编译选项:
    1)、去掉python,test、java加快后面的编译请添加图片描述
    2)、勾选cuda_fast_math
    请添加图片描述
    3)、去掉setupvars(示例为勾选状态,需要去掉),消除警告
    请添加图片描述
    请添加图片描述
    ⑦、Visual Studio编译(最好以管理员身份打开VS)
  • 使用VS2019打开刚刚编译工程后,会反应一段时间,一定要等待左下角显示的项全部加载完毕才可以继续操作
  • 选择Release x64,接着找到“CmakeTargets”下的“ALL_BUILD”,右键→“生成”,然后开始漫长的等待……
  • 解决方案资源管理器—>CMakeTargets—>INSTALL—>生成”然后又是等,好在这次时间很短。完成后你的build文件夹中会出现一个install文件夹,这就是完成了

备注:VS如果编译报错,多半是cmake没有配置好的原因

测试

测试代码:


#include <opencv2/opencv.hpp>
#include <opencv2/core/ocl.hpp>
#include <iostream>
#include <ctime>
#include <windows.h>
#include <opencv2/core/simd_intrinsics.hpp>
#include <cudaimgproc.hpp>
#include <cudafilters.hpp>
#include <opencv2/cudaimgproc.hpp>
//cuda对应的opencv的头文件大体和原opencv对应api的头文件名类似,前面加了一个cuda,可以通过opencv的头文件找到cuda版本的头文件,查看里面类的用法
using namespace std;
using namespace cv;
using namespace cuda;
using namespace ocl;


int main(int argc, char** args)
{   
	//1、读取图像
	string path = "D:\\xcs\\opencv加速\\资料包\\new_test\\data/test.jfif";

    while (1)
    {
        ///////////////////////////////////////////////////////////////
        DWORD start_time0 = GetTickCount();
        GpuMat dev_img, bw_cuda, blur_cuda, edge_cuda;
        Mat res, src_cuda;
        src_cuda = imread(path);
        dev_img.upload(src_cuda);
        auto filter = createGaussianFilter(CV_8UC1, CV_8UC1, Size(3, 3), 5);
        auto canny = createCannyEdgeDetector(50, 100, 3);
        for (int i = 0; i < 10; i++) {
            cuda::cvtColor(dev_img, bw_cuda, COLOR_BGR2GRAY);
            filter->apply(bw_cuda, blur_cuda);
            canny->detect(bw_cuda, blur_cuda);
            //cout << "i is:" << i << endl;//输出运行时间
        }
        blur_cuda.download(res);
        DWORD end_time0 = GetTickCount();
        cout << "cuda run time is:" << (end_time0 - start_time0) << "ms!" << endl;//输出运行时间
        ///////////////////////////////////////////////////////////////
        DWORD start_time2 = GetTickCount();
        ocl::setUseOpenCL(true);
        UMat src, bw, blur, edge;
        src = imread(path).getUMat(ACCESS_RW);
        for (int i = 0; i < 10; i++) {

            cv::cvtColor(src, bw, COLOR_BGR2GRAY);
            cv::GaussianBlur(bw, blur, Size(3, 3), 0);
            cv::Canny(blur, edge, 50, 100, 3);
            //cout << "i is:" << i << endl;//输出运行时间
        }
        DWORD end_time2 = GetTickCount();
        cout << "ocl run time is:" << (end_time2 - start_time2) << "ms!" << endl;//输出运行时间
        ///////////////////////////////////////////////////////////////
        Mat src1, bw1, blur1, edge1;
        DWORD start_time = GetTickCount();
        src1 = imread(path);
        for (int i = 0; i < 10; i++) {
            cv::cvtColor(src1, bw1, COLOR_BGR2GRAY);
            cv::GaussianBlur(bw1, blur1, Size(3, 3), 0);
            cv::Canny(blur1, edge1, 50, 100, 3);
            //cout << "i is:" << i << endl;//输出运行时间
        }
        DWORD end_time = GetTickCount();
        cout << "normal run time is:" << (end_time - start_time) << "ms!" << endl;//输出运行时间
        cout << "*****************************************************" << endl;//输出运行时间

        //imshow("res", res);
        //imshow("edge", edge);
        //imshow("edge1", edge1);
        //waitKey(0);
   }

	return 0;
}

问题处理

C2589

问题描述:

错误	C2589	“(:::”右边的非法标记	opencv_test	D:\xcs\opencv加速\资料包\opencv_GPU\include\opencv2\core\hal\intrin_sse.hpp	1739	
错误原因: 函数模板max与Visual C++中的全局的宏max冲突。 

下面是错误源码:
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_uint32x4, unsigned, max, std::max)
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_uint32x4, unsigned, min, std::min)
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_int32x4, int, max, std::max)
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_int32x4, int, min, std::min)
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_float32x4, float, max, std::max)
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_float32x4, float, min, std::min)

第一种办法:设置项目属性,在预定义处理器中添加定义NOMINMAX来禁止使用Vsual C++的min/max宏定义。
          项目属性   ——> C/C++ ——> 预处理器 ——> 预处理器定义 (此处添加预定义编译开关 NOMINMAX)
第二种办法: 加上括号,与Vsual C++的min/max宏定义区分开
		示例:
			将: int num_params = std::max(0, user_last_param - user_first_param + 1);
             修改为: int num_params = (std::max)(0, user_last_param - user_first_param + 1);
                                                
这里需要将上面错误代码修改为:                                                
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_uint32x4, unsigned, max, (std::max))
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_uint32x4, unsigned, min, (std::min))
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_int32x4, int, max, (std::max))
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_int32x4, int, min, (std::min))
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_float32x4, float, max, (std::max))
OPENCV_HAL_IMPL_SSE_REDUCE_OP_4(v_float32x4, float, min, (std::min))

                                                
//这个问题同时会引发C2062的错误
错误	C2062	意外的类型“unknown-type”	opencv_test	D:\xcs\opencv加速\资料包\opencv_GPU\include\opencv2\core\hal\intrin_sse.hpp	1739	

您可能感兴趣的与本文相关的镜像

Wan2.2-I2V-A14B

Wan2.2-I2V-A14B

图生视频
Wan2.2

Wan2.2是由通义万相开源高效文本到视频生成模型,是有​50亿参数的轻量级视频生成模型,专为快速内容创作优化。支持480P视频生成,具备优秀的时序连贯性和运动推理能力

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值