编译安装OpenCV依赖库

编译安装OpenCV环境

准备源码

# 编译工具
sudo apt-get install build-essential
# 必须的
sudo apt-get install cmake git libgtk2.0-dev pkg-config libavcodec-dev libavformat-dev libswscale-dev libv4l-dev

# 可选的
sudo apt-get install python-dev python-numpy libtbb2 libtbb-dev libjpeg-dev libpng-dev libtiff-dev libjasper-dev libdc1394-22-dev 
sudo apt-get install gtk-3.0-dev
sudo apt-get install libatlas-base-dev gfortran

# 创建一个总目录存放两个子目录
mkdir -p ~/3rdparty/source/opencv_env
cd ~/3rdparty/source/opencv_env

# 如果网络好就直接执行命令 , 总共700MB
git clone -b 3.4 https://gitee.com/mirrors/opencv.git
git clone -b 3.4 https://gitee.com/mirrors/opencv_contrib.git

# 或者直接使用资料中下好的文件, 将这两个文件拷贝到opencv_env路径下
opencv-3.4.9.zip
opencv_contrib-3.4.9.tar.gz
# 使用tar -zxvf xxx.tar.gz 将上述两个文件进行解压

准备编译依赖的文件

修改hosts文件

打开此链接:https://githubusercontent.com.ipaddress.com/raw.githubusercontent.com

将其中显示的IP Address地址复制到粘贴板,这里为199.232.96.133

image-20201118151707815

编辑系统的hosts文件:

sudo gedit /etc/hosts

把以下内容追加到末尾即可:

199.232.96.133  raw.githubusercontent.com

注意,这里用到的ip地址是我在网站链接中获取的,可能与你获得的不同,注意区分,直接复制使用不保证有效!

提前释放要下载的内容到.cache目录

建议在直接将cache.tar.gz内容解压缩到opencv源码根目录下的.cache,即可避免由于需要在线下载会出现的问题。原因是执行cmake时候,脚本会自动到github的资源库raw.githubusercontent.com下载文件,而这个网站时不时的就被河蟹了(科学上网可以解决,但不是人人都有梯子的),所以这里提前把脚本要下载的准备到opencv源码根目录里的.cache里即可。注意此cache目前在opencv-3.4.9情况下可用,其他版本不保证。

cache.tar.gz的百度网盘链接: https://pan.baidu.com/s/1kZU1gakKLP-LjSxQ4DYw7g 提取码: 5fxk

然后执行以下命令,将其内容解压到opencv的源码根目录

tar -zxvf cache.tar.gz -C opencv

此时,进入opencv目录,确认是否有.cache目录即可,注意这个是隐藏目录,文件浏览器里按 Ctrl+H 可以查看隐藏目录,命令行里可以输入ls -al查看

配置&编译&安装

# 进入Opencv目录
cd opencv-3.4.9
# 创建一个build目录
mkdir build
# 进入build目录
cd build

# cmake编译配置:也可以自行使用cmake-gui配置

# 一定要确保以下用到的OPENCV_EXTRA_MODULES_PATH参数路径在你那里是存在且正确的!!!

# 注意末尾的两个点 .. 不能少,注意最后一个参数要根据你自己的路径来
cmake -D CMAKE_BUILD_TYPE=Release \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_opencv_python3=ON \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D OPENCV_EXTRA_MODULES_PATH=~/3rdparty/source/opencv_env/opencv_contrib-3.4.9/modules ..

# 或者用这个,可以编译安装一些Python和C++案例
cmake -D CMAKE_BUILD_TYPE=Release \
      -D BUILD_opencv_python2=OFF \
      -D BUILD_opencv_python3=ON \
      -D CMAKE_INSTALL_PREFIX=/usr/local \
      -D INSTALL_PYTHON_EXAMPLES=ON \
      -D OPENCV_EXTRA_MODULES_PATH=~/3rdparty/source/opencv_env/opencv_contrib-3.4.9/modules \
      -D BUILD_EXAMPLES=ON ..

# 或者指定任意输出目录,例如我把OpenCV输出到 ~/3rdparty/OpenCV-3.4.9
cmake -D CMAKE_BUILD_TYPE=Release \
     -D BUILD_opencv_python2=OFF \
     -D BUILD_opencv_python3=ON \
     -D CMAKE_INSTALL_PREFIX=~/3rdparty/OpenCV-3.4.9 \
     -D INSTALL_PYTHON_EXAMPLES=ON \
     -D OPENCV_EXTRA_MODULES_PATH=~/3rdparty/source/opencv_env/opencv_contrib-3.4.9/modules \
     -D BUILD_EXAMPLES=ON ..


# 开启8个线程
make -j8

# 编译成功之后, 再执行安装
# 这里会安装到刚刚CMAKE_INSTALL_PREFIX指定的路径,如果时使用的~/开头的用户目录,建议不要加sudo
sudo make install

正常情况下,编译安装即到此完毕!

出现的问题

!!!!!!!!!!如果.cache目录已按照上述步骤自行解压过,则以下步骤可以省略!!!!!!!!!!!!!!!

  • ippicv

由于是外国服务器原因,这里极大概率会出现下载错误,会提示ippicv_2019_lnx_intel64_general_20180723.tgz 下载失败!!解决方式如下

方式1:推荐

ippicv_2019_lnx_intel64_general_20180723.tgz拷贝为opencv/.cache/ippicv/c0bd78adb4156bbf552c1dfe90599607-ippicv_2019_lnx_intel64_general_20180723.tgz即可

方式2:

# 打开终端,输入
gedit ~/opencv_env/opencv/3rdparty/ippicv/ippicv.cmake #就是这个文件的路径
# 将47行的
"https://raw.githubusercontent.com/opencv/opencv_3rdparty/${IPPICV_COMMIT}ippicv/"
# 改为步骤1中手动下载的文件的本地路径(也就是将网络下载的模式改为本地文件下载的模式):
 "file:///home/itheima/opencv_env/" #(仅供参考,根据自己的路径填写,ippicv所在的目录)
  • face_landmark_model.dat

cmake过程中会到https://raw.githubusercontent.com/opencv/opencv_3rdparty/8afa57abc8229d611c4937165d20e2a2d9fc5a12/face_landmark_model.dat下载dat文件,这里提前准备好,就不需要联网下啦,进入opencv源码根目录,执行:

mkdir -p .cache/data

cp face_landmark_model.dat .cache/data/7505c44ca4eb54b4ab1e4777cb96ac05-face_landmark_model.dat
  • opencv boostdesc_bgm.i

opencv boostdesc_bgm.i: No such file or directory

查看下载失败的文件

opencv/build$ cat CMakeDownloadLog.txt

直接自行下载到指定目录,或将一下文件拷贝到指定目录

Clion中添加依赖参考

修改Cmake配置文件

cmake_minimum_required(VERSION 3.14)
project(study_opencv_cpp)

set(CMAKE_CXX_STANDARD 11)

find_package(OpenCV REQUIRED)

add_executable(main main.cpp)
target_link_libraries(main ${OpenCV_LIBS})

代码测试

Mat类

数据类型定义

CV_位数(S|U|F)C通道数量
位数:
    8 , 16, 32 ,64  单通道颜色取值范围是0-255,所以通常是8

S|U|F:
    S--代表---signed int---有符号整形
    U--代表--unsigned int--无符号整形
    F--代表--float---------单精度浮点型

C通道数量:
    通道数量 = 1:灰度图片,单通道图像
    通道数量 = 3:灰度图片,单通道图像
    通道数量 = 4:带Alph通道的RGB图像,png图片是这种

图片基本操作

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){

    Mat img = imread("../assets/lena.jpg",IMREAD_COLOR);
    cout<<"read img success!";
    imshow("img",img);

    // 获取图片的大小
    Size imgSize = img.size();
    cout<<"img size:"<<imgSize;
    // 获取图片的通道数量
    int channels = img.channels();
    // 获取数据类型
    cout<<"channels:"<<channels<<"type:"<<img.type()<<endl;


    // 创建一个图片对象
    Mat dst(400,600,CV_8UC3);
    // 在图片中间增加一根红色的线
    for(int i=0;i<600;i++){
        dst.at<Vec3b>(200,i) = Vec3b(0,0,255);
    }

    namedWindow("dst",WINDOW_NORMAL);
    imshow("dst",dst);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

图像剪切

示例代码

#include <iostream>
#include <opencv2/opencv.hpp>

using namespace std;
using namespace cv;

int main(){
    Mat img = imread("../assets/itheima.jpg",IMREAD_COLOR);

    // 定义要截取的矩形框
    Rect rect(100,50,200,200);

    // 这样即可完成截取
    Mat roi = img(rect);

    imshow("src",img);
    imshow("roi",roi);


    waitKey(0);
    destroyAllWindows();
    return 0;
}