编译安装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
编辑系统的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;
}