ubuntu 安装 opencv4
一、下载
- 下载 opencv 以及 contrib 库
git clone https://github.com/opencv/opencv.git
git clone https://github.com/opencv/opencv_contrib.git
安装依赖项
sudo apt-get install build-essential
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev
安装 cuda 和 cudnn
安装 cmake-gui
sudo apt-get install cmake-qt-gui
二、cmake 编译安装 opencv
1. CMAKE
打开 cmake-gui
Where is the source code:填写 opencv 源代码目录
Where is build the binaries:在 opencv 源代码目录内新建一 build 文件(外部构建)
点击 configure
设置:
CMAKE_BUILD_TYPE=Release
OPENCV_ENABLE_NONFREE=ON
OPENCV_GENERATE_PKGCONFIG=ON
设置 contrib 库
OPENCV_EXTRA_MODULES_PATH=/home/.../opencv_contrib/modules
设置到 contrib 库源代码内的 modules 文件夹
设置安装目录
CMAKE_INSTALL_PREFIX=/usr/local/opencv4
默认路径为 /usr/local
为安装多版本 opencv 建议自定义一个目录
CUDA(选)
勾选 cuda 选项
点击 Generate
2. 编译安装
终端进入 build 目录
make -j4
-j4 为四个线程编译
sudo make install
如果安装了 python-dev,这时 Python 应该可以使用 OpenCV 了:
1 | $ python |
3. 配置 opencv
让系统在 opencv 安装目录中搜索动态库
1
2
3cd /etc/ld.so.conf.d/
sudo touch opencv4.conf
sudo sh -c 'echo "/usr/local/opencv4/lib" > opencv4.conf'== 注意:echo "/usr/local/opencv4/lib" 为 opencv 安装目录 ==
更新 pkg-config:
sudo ldconfig
设置 bash:
sudo gedit /etc/bash.bashrc
在末尾追加:
1
2PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/opencv4/lib/pkgconfig
export PKG_CONFIG_PATH== 注意上面的路径为安装路径!!!==
保存,执行如下命令使得配置生效:
source /etc/bash.bashrc
查看 opencv 版本:
pkg-config --modversion opencv
opencv 安装完成!!
三、测试
opencv 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
using namespace cv;
using namespace cv::xfeatures2d; // 不要忘了导入扩展模块
using namespace std;
Mat src_img, gray_img;
const string output_name = "SURF特征检测";
int minHessian = 100; // 定义SURF中的hessian阈值特征点检测算子
int max_value = 500;
void SURF_detect_func(int, void *)
{
// SURF特征检测
Ptr<SURF> detector = SURF::create(minHessian);
vector<KeyPoint> keypoints;
detector->detect(gray_img, keypoints, Mat()); // 检测src_img图像中的SURF特征
// 绘制关键点
Mat keypoint_img;
dracmakelists:wKeypoints(gray_img, keypoints, keypoint_img, Scalar::all(-1), DrawMatchesFlags::DEFAULT); // Scalar::all(-1)这是一种技巧,就是当用一个负数作为关键点颜色,表示每次随机选取颜色。
imshow(output_name, keypoint_img);
}
int main()
{
src_img = imread("1.png");
if (src_img.empty())
{
printf("could not load the image...\n");
return -1;
}
namedWindow("原图", WINDOW_AUTOSIZE);
imshow("原图", src_img);
cvtColor(src_img, gray_img, COLOR_BGR2GRAY);
namedWindow(output_name, WINDOW_AUTOSIZE);
createTrackbar("hessian阈值", output_name,&minHessian, max_value, SURF_detect_func);
SURF_detect_func(0,0);
waitKey(0);
return 0;
}CMakeLists.txt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18# 声明要求的 cmake 最低版本
cmake_minimum_required( VERSION 2.8 )
# 声明一个 cmake 工程
project( opencv_test )
# 设置编译模式
set( CMAKE_BUILD_TYPE "Debug" )
set(CMAKE_CXX_FLAGS "-std=c++11")
find_package(OpenCV 4.1 REQUIRED)
# 添加一个可执行程序
# 语法:add_executable( 程序名 源代码文件 )
add_executable( test surf.cpp )
# 将库文件链接到可执行程序上
target_link_libraries( test ${OpenCV_LIBS} )cuda 测试
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
int main (int argc, char* argv[])
{
try
{
/// 读取图片
cv::Mat src_host = cv::imread("1.jpg", cv::IMREAD_GRAYSCALE);
/// 定义GpuMat
cv::cuda::GpuMat dst, src;
/// 将主机内存的图像数据上传到GPU内存
src.upload(src_host);
/// 调用GPU的阈值函数(很多使用GPU加速的函数都和CPU版本的函数相同)
cv::cuda::threshold(src, dst, 120, 255, cv::THRESH_BINARY);
cv::Mat result_host;
/// 从GPU上下载阈值化完成的图片
dst.download(result_host);
/// 显示
cv::imshow("Result", result_host);
cv::waitKey();
}
catch(const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
return 0;
}CMakeLists.txt:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29cmake_minimum_required(VERSION 3.0)
project(cuda_test)
set(CUDA_USE_STATIC_CUDA_RUNTIME ON) #这一句解决 cannot find -lopencv_dep_cudart
set(CMAKE_CXX_STANDARD 11)
set(CMAKE_RUNTIME_OUTPUT_DIRECTORY ${CMAKE_SOURCE_DIR})
find_package(CUDA REQUIRED)
message(STATUS "CUDA版本: ${CUDA_VERSION}")
message(STATUS " 头文件目录:${CUDA_INCLUDE_DIRS}")
message(STATUS " 库文件列表:${CUDA_LIBRARIES}")
set(CUDA_NVCC_FLAGS -G;-g;-std=c++11) # nvcc flags
include_directories(${CUDA_INCLUDE_DIRS})
set(OpenCV_DIR "/usr/local/share/OpenCV") # 指定OpenCV安装路径来区分不同的OpenCV版本
find_package(OpenCV REQUIRED)
set(OpenCV_LIB_DIR ${OpenCV_INSTALL_PATH}/lib)
message(STATUS "OpenCV版本: ${OpenCV_VERSION}")
message(STATUS " 头文件目录:${OpenCV_INCLUDE_DIRS}")
message(STATUS " 库文件目录:${OpenCV_LIB_DIR}")
message(STATUS " 库文件列表:${OpenCV_LIBS}")
include_directories(${OpenCV_INCLUDE_DIRS})
link_directories(${OpenCV_LIB_DIR})
CUDA_ADD_EXECUTABLE(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS} ${CUDA_LIBRARIES})
参考文章
https://blog.csdn.net/sss_369/article/details/94755824