Linux安装OpenCV4.7.0 for C++
Linux系统,编译安装opencv4.7.0,用于C++编写opencv代码。
Linux安装OpenCV4.7.0 for C++
下载opencv源码
官网:https://opencv.org/releases/
- 方法一 点击OpenCV - 4.7.0的
Sources
,下载OpenCV4.7.0 - 方法二 使用命令下载:
1
wget https://github.com/opencv/opencv/archive/4.7.0.zip
解压
1
2
3
4
# 解压到指定目录
unzip 4.7.0.zip -d 目标目录
# 解压到当前目录
unzip 4.7.0.zip
我解压到了自己创建的/root/softwareInstall
目录下;解压到那个目录自己决定即可。
安装依赖项
1
2
3
4
5
sudo apt-get install build-essential libgtk2.0-dev
# 安装jpeg格式图像工具包、tif格式图像工具包
sudo apt-get install libjpeg-dev libtiff5-dev
# 安装视频工具包
sudo apt-get install libavcodec-dev libavformat-dev libswscale-dev
1
sudo apt-get install pkg-config
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
简介:
# ------------------ #
libgtk2.0-dev
安装libgtk
(GTK是一个Linux平台下基于Xwindows图形窗口的图形用户编程接口工具,可以借助它开发Linux平台下基于Xwindows的图形用户界面)
# ------------------ #
libavcode-dev
libavcodec是一个包含音频/视频 解码器和编码器的库
# ------------------ #
libavformat是一个库,包含用于多媒体容器格式的合成和拆分的库。
# ------------------ #
libjpeg-dev
libjpeg是一个完全用C语言编写的库,包含了被广泛使用的JPEG解码、JPEG编码和其他的JPEG功能的实现。这个库由独立JPEG工作组维护。
源码获取地址:http://www.ijg.org/
安装之后,就可以在程序中调用此库进行JPEG图片的处理和压缩了。需要注意的是,要在程序中引入JPEG.6的头文件和库文件,并设置相关的编译选项来完成配置。
# ------------------ #
libswscale-dev
libswscale是一个执行高度优化的图像缩放和颜色空间/像素格式转换操作的库。
# ------------------ #
libtiff5-dev
tif格式图像工具包。
# ------------------ #
pkg-config
(在Linux系统下安装第三方软件时要用到第三方软件的头文件以及相关库,在编译时指定库和头文件是十分麻烦的,而pkg-config能够把这些头文件和库文件的位置指出来给编译器使用)
1
2
# “不要执行”这一个命令
sudo apt-get install libopenexr-dev libtbb-dev libgtk-3-dev libgstreamer1.0-dev libgstreamer-plugins-base1.0-dev
安装cmake
方法1:官网下载、安装
- 下载cmake 官网:https://cmake.org/download/
- 解压
1
tar -xzvf cmake-3.28.0-rc5-linux-x86_64.tar.gz -C ~/softwareInstall/
- 配置环境变量
我的camke的bin目录:
/root/softwareInstall/cmake-3.28.0-rc5-linux-x86_64/bin
。 在/etc/profile.d/
目录创建camke.sh文件,添加camke的bin目录。1
sudo vim /etc/profile.d/cmake.sh
1 2 3
export PATH=$PATH:camke的bin目录 如: export PATH=$PATH:/root/softwareInstall/cmake-3.28.0-rc5-linux-x86_64/bin
- 使环境变量在当前Terminal生效
1
source /etc/profile
查看版本
1
cmake --version
方法2:apt命令安装(推荐)
使用apt命令安装,很简单;如果apt安装的cmake有问题,则卸载apt安装的cmake,再去官网下载安装。
1
2
3
4
5
6
7
8
9
10
# 方法1:安装cmake(没有界面)
sudo apt install cmake
# 方法2:安装cmake-gui(有图形用户界面)
sudo apt-get install cmake-gui
cmake-gui # 运行cmake图形界面程序
# 方法3:安装cmake-qt-gui(有界面)
sudo apt-get install cmake-qt-gui
cmake-gui # 运行cmake图形界面程序
编译opencv
- 进入解压opencv得到的文件夹
1 2
# 示例: cd ~/softwareInstall/opencv-4.7.0/
- 新建一个编译目录build
mkdir build
- 进行cmake分析
1 2
# 进入build目录 cd build
1 2 3 4 5 6 7 8 9 10 11 12
# CMAKE_INSTALL_PREFIX 决定编译后的库安装的位置 # BUILD_SHARED_LIBS 决定编译静态库还是动态库 OFF静态库,ON动态库 # 方法1:使得make时,以默认方式安装opencv,如默认的安装路径 cmake .. # 方法2:安装到/usr/local目录下 cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local .. # 方法3(不要使用):使得make时,以自定义方式安装opencv,以下命令将opancv安装到build/install目录;生成静态库 cmake -D EXECUTABLE_OUTPUT_PATH:PATH=$(pwd) -D CMAKE_INSTALL_PREFIX=$(pwd)/install -D BUILD_SHARED_LIBS=OFF -D CMAKE_BUILD_TYPE=RELEASE .. # 方法4:将opancv安装到build/install目录;生成动态库(我使用这种方法) cmake -D EXECUTABLE_OUTPUT_PATH:PATH=$(pwd) -D CMAKE_INSTALL_PREFIX=$(pwd)/install -D BUILD_SHARED_LIBS=ON -D CMAKE_BUILD_TYPE=RELEASE .. # 方法5: cmake -D OPENCV_GENERATE_PKGCONFIG=ON -D BUILD_SHARED_LIBS=ON ..
- Looking for ccache - not found
1
sudo apt-get install ccache
- Could NOT find tiff (missing: tiff_DIR)
- Found system OpenJPEG: openjp2 (found version “”)(不用管)
1 2 3
# 安装了下面两个库,没有解决问题 sudo apt-get install libjasper-dev sudo apt-get install libopenjp2-7-dev
- libva: missing va.h header (VA_INCLUDE_DIR)
1 2
# 安装libva-dev sudo apt-get install libva-dev
- cmake警告:cmake和Anaconda3冲突
1
runtime library [libpng16.so.16] in /usr/lib/x86_64-linux-gnu may be hidden by files in: /root/softwareInstall/anaconda3/lib
原因是:cmake时搜索到了Anaconda3的lib目录,里面有opencv用到的.so文件(动态链接库文件、共享对象[Shared Object]文件)。 解决方法:将Anaconda3的lib目录,mv为别的名字,安装好opencv后,再改回来。
1
mv ~/softwareInstall/anaconda3/lib ~/softwareInstall/anaconda3/aaalib
- Looking for ccache - not found
- make编译
1
sudo make -j4
make -j4是指4核同时编译,可以根据自己的核数进行调整,比如-j2、-j5,核数越多编译速度就越快。
- 安装
1
sudo make install
配置opencv环境
- 创建opencv470.conf文件 在
/etc/ld.so.conf.d/
目录创建opencv470.conf
文件,使用其他文件名也可以;写入opencv的动态库目录,运行opencv的C++程序时,需要根据这个目录找到动态库(so文件)。1
sudo vim /etc/ld.so.conf.d/opencv470.conf
cmake时默认安装:在文件中输入
/usr/local/lib
,然后:wq
保存退出。 cmake时指定了安装目录:输入示例/root/softwareInstall/opencv-4.7.0/build/install/lib
,保存退出。 执行命令:1
sudo ldconfig
查看opencv的动态库:
1
ldconfig -v | grep opencv
- 创建pkgconfig.sh文件(非必要,可以不做) 在
/etc/profile.d
目录下创建pkgconfig.sh
文件1
sudo vim /etc/profile.d/pkgconfig.sh
输入如下内容,然后保存退出
1 2
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig export PKG_CONFIG_PATH
1 2 3 4 5 6
通常pkg-config会将.pc文件,存储到/usr/lib/pkgconfig目录‘或’/usr/local/lib/pkgconfig目录。 我没有/usr/local/lib/pkgconfig目录。 /usr/local/lib/pkgconfig目录或/usr/lib/pkgconfig目录下有opencv4.pc文件。 如果没有/usr/local/lib/pkgconfig目录,可以手动创建。 如果没有opencv4.pc文件,则手动创建(文件名自己起,如opecv.pc、opencv4.pc、opencv470.pc等都可以)。我创建了opencv470.pc文件。 上述两个目录,opencv470.pc放到哪个目录下都可以。
在opencv470.pc文件中输入:
1 2 3 4 5 6 7 8 9 10
prefix=/usr/local exec_prefix=${prefix} includedir=${prefix}/include libdir=${exec_prefix}/lib Name: opencv Description: The opencv library Version:4.7.0 Cflags: -I${includedir}/opencv4 Libs: -L${libdir} -lopencv_core -lopencv_imgcodecs -lopencv_imgproc -lopencv_highgui -lopencv_calib3d -lopencv_dnn -lopencv_features2d -lopencv_flann -lopencv_ml -lopencv_objdetect -lopencv_photo -lopencv_stitching -lopencv_video -lopencv_videoio -lopencv_shape -lopencv_superres -lopencv_videostab
1
# prefix=安装目录
1 2
# 使环境变量在当前Terminal生效 source /etc/profile
输出opecv的版本号:
1 2 3 4 5
pkg-config <opencv的.pc文件的文件名> --modversion 如: pkg-config opencv --modversion pkg-config opencv4 --modversion pkg-config opencv470 --modversion
- 创建软连接 opencv头文件的路径中多了一个opencv4的文件夹:/usr/include/opencv4/opencv2; 可以将opencv2文件夹链接到/usr/include文件夹下。
1 2
# 默认安装目录使用 sudo ln -s /usr/include/opencv4/opencv2 /usr/include/
1 2
# 我的安装目录是/root/softwareInstall/opencv-4.7.0/build/install/include/opencv4/opencv2 sudo ln -s /root/softwareInstall/opencv-4.7.0/build/install/include/opencv4/opencv2 /usr/include
将Anaconda3的lib目录名改回来(如果更改过)
1
2
# 由aaalib改回为lib
mv ~/softwareInstall/anaconda3/aaalib ~/softwareInstall/anaconda3/lib
重启计算机
若创建了pkgconfig.sh文件,配置了环境变量;可以重启计算机,使环境变量永久生效。
opencv测试程序
创建test.cpp,准备一张图片(代码中使用的名字是123.jpg),和test.cpp放到同一目录下,test.cpp中输入以下代码
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
#include <iostream>
using namespace std;
#include <opencv2/core.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
int main(void)
{
String path = "./123.jpg";
//Mat img = imread(path, 1);
Mat img = imread(path, 0);
Mat reImg;
resize(img, reImg, Size(300, 300), INTER_LINEAR);
if (img.empty())
{
cout << "fail to read image" << endl;
return -1;
}
imshow("hello", reImg);//若没有namedWindow(),那么imread()会完成两步操作:(1)创建新窗口,(2)在新窗口显示图片
int key = waitKey(0);//暂停,等待按键,有按键按下才结束,0写不写都行
destroyAllWindows();
std::string ph1 = "333.jpg";
String ph2 = "./aaa.jpg";
imwrite(ph1, img);
imwrite(ph2, reImg);
return 0;
}
编译运行
1
2
3
4
5
6
# 编译 方法1
g++ test.cpp -o test -L /root/softwareInstall/opencv-4.7.0/build/install/lib -lopencv_core -lopencv_imgproc -lopencv_highgui -lopencv_imgcodecs
# 编译 方法2(前提是配置了pkg-config)
g++ test.cpp -o test `pkg-config opencv470 --cflags --libs`
# 运行
./test
本文由作者按照 CC BY 4.0 进行授权