微软官方各产品文档:
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文件需要梯子,也是编译时需要
- opencv源码/
- 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
3558

被折叠的 条评论
为什么被折叠?



