参考:
https://blog.csdn.net/Felaim/article/details/103971397
https://zhuanlan.zhihu.com/p/134247738
是opencv与opencv_contrib一起安装cmake,已经安装过的我的操作办法是将cmake以前build文件夹内的内容删除。
下载与opencv相对应版本的opencv_contrib,把文件夹放在opencv文件夹里
cmake \
-D CMAKE_BUILD_TYPE=RELEASE \
-D OPENCV_GENERATE_PKGCONFIG=ON \
-D CMAKE_INSTALL_PREFIX=/usr/local \
-D OPENCV_EXTRA_MODULES_PATH= /路径/opencv_contrib/modules \//写opencv_contrib放的地址
-D CUDA_CUDA_LIBRARY=/usr/local/cuda/lib64/stubs/libcuda.so \
-D CUDA_ARCH_BIN=xx 这个需要去英伟达官网查询 \
-D CUDA_ARCH_PTX="" \
-D WITH_CUDA=ON \
-D WITH_TBB=ON \
-D BUILD_NEW_PYTHON_SUPPORT=ON \
-D WITH_V4L=ON \
-D INSTALL_C_EXAMPLES=ON \
-D INSTALL_PYTHON_EXAMPLES=ON \
-D BUILD_EXAMPLES=ON \
-D WITH_QT=ON \
-D WITH_OPENGL=ON \
-D ENABLE_FAST_MATH=1 \
-D CUDA_FAST_MATH=1 \
-D WITH_CUBLAS=1 \
-D WITH_NVCUVID=ON \
-D BUILD_opencv_cudacodec=OFF ..
注意引用该opencv-gpu的linux项目中的cmakeLists中引用的cuda相关库也需要添加。
举例cmakelist
# CMake 最低版本号要求
cmake_minimum_required (VERSION 2.8)
# 项目信息
project (opencvTest)
# 查找当前目录下的所有源文件
# 并将名称保存到 DIR_SRCS 变量
aux_source_directory(./src SRC_LIST)
#引用头文件
include_directories (/usr/local/include/opencv4)
include_directories (/usr/local/include/opencv4/opencv2)
#引用库文件
link_directories(/home/adlink/wjp/opencv-4.5.3/build/lib)
# 指定生成目标
add_executable(opencvTest ${SRC_LIST})
target_link_libraries (opencvTest
opencv_imgproc opencv_core opencv_features2d opencv_highgui opencv_photo opencv_calib3d opencv_dnn
opencv_flann opencv_gapi opencv_imgcodecs opencv_ml opencv_objdetect opencv_stitching opencv_videoio opencv_video
opencv_cudaarithm
opencv_cudafilters
opencv_cudawarping
opencv_cudaimgproc
opencv_cudafeatures2d
opencv_cudaoptflow
opencv_cudabgsegm
opencv_cudastereo
opencv_cudaobjdetect
)
相对应得opencv-gpu函数需要查询相对应得opencv版本手册,注意一定要是对应的版本
opencv4.5.3 Image Warping
比如要使用opencv-gpu中的图像处理函数,在cpp文件中要引用相应头文件
#include <opencv2/cudawarping.hpp>
使用opencv-gpu中旋转函数的的cpp文件
#include <opencv2/opencv.hpp>
#include "opencv2/imgproc/imgproc.hpp"
#include <opencv2/cudawarping.hpp>
//#include "opencv2/highgui/highgui.hpp"
using namespace cv;
int main()
{
cv::cuda::GpuMat Gsrc,Gdst;
const char* filename = "../test.bmp";
cv::Mat src = cv::imread(filename,0);
cv::Mat dst;
Point center;
center.x=float (src.cols/2);
center.y=float (src.rows/2);
//计算二维旋转的仿射变换矩阵
double angle = -30.0;
double scale = 0.8;
Mat rotMat(2, 3, CV_32FC1);
double time0 = static_cast<double>(cv::getTickCount());
int i = 0;
while(i<1000)
{
Gsrc.upload(src);//将内存数据上传到显存中
rotMat = getRotationMatrix2D( center, angle,scale);
//变换图像,并用黑色填充其余值
cv::cuda::warpAffine(Gsrc,Gdst,rotMat,src.size() );
Gdst.download(src);
i++;
}
time0 = ((double)cv::getTickCount() - time0) / cv::getTickFrequency();
printf("time:%f\n", time0/1000);
imwrite("/home/adlink/wjp/opencvTest/outPic/Gpu_rotate.bmp",src);
}