文章

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:官网下载、安装

  1. 下载cmake 官网:https://cmake.org/download/
    • 方法1:直接点击下载
    • 方法2:wget下载(亲测速度慢)
      1
      2
      3
      4
      5
      6
      
      # 下载到当前目录
      wget 下载地址
      # 下载到指定目录
      wget 下载地址 -P 目标目录
      示例:
      wget https://github.com/Kitware/CMake/releases/download/v3.28.0-rc5/cmake-3.28.0-rc5-linux-x86_64.tar.gz
      

  2. 解压
    1
    
    tar -xzvf cmake-3.28.0-rc5-linux-x86_64.tar.gz -C ~/softwareInstall/
    

  3. 配置环境变量 我的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
    

    :wq保存退出。

  4. 使环境变量在当前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

  1. 进入解压opencv得到的文件夹
    1
    2
    
    # 示例:
    cd ~/softwareInstall/opencv-4.7.0/
    

  2. 新建一个编译目录build mkdir build
  3. 进行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 ..
    

    • 可能会遇到的问题
    1. Looking for ccache - not found
      1
      
      sudo apt-get install ccache
      
    2. Could NOT find tiff (missing: tiff_DIR)
    3. Found system OpenJPEG: openjp2 (found version “”)(不用管)
      1
      2
      3
      
      # 安装了下面两个库,没有解决问题
      sudo apt-get install libjasper-dev
      sudo apt-get install libopenjp2-7-dev
      
    4. libva: missing va.h header (VA_INCLUDE_DIR)
      1
      2
      
      # 安装libva-dev
      sudo apt-get install libva-dev
      
    5. 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
      

      解决问题后,再次执行上述cmake分析中的cmake命令

  4. make编译
    1
    
    sudo make -j4
    

    make -j4是指4核同时编译,可以根据自己的核数进行调整,比如-j2、-j5,核数越多编译速度就越快。

  5. 安装
    1
    
    sudo make install
    

    安装完成后,build目录下有一个install目录

配置opencv环境

  1. 创建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
    
  2. 创建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=安装目录
    

    我的opencv470.pc文件

    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
    
  3. 创建软连接 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 进行授权