一、介绍
opencv是一个基于Apache2.0许可(开源)发行的跨平台计算机视觉和机器学习软件库,可以运行在Linux、Windows、Android和Mac OS操作系统上。 它轻量级而且高效——由一系列 C 函数和少量 C++ 类构成,同时提供了Python、Ruby、MATLAB等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
opencv是一个非常好用的图像处理和分析库,它包括了平面特征提取,3D校准,对象侦查,图像处理,影像分析等功能,几乎可以满足在机器学习中所需要的,对图像的一切功能。
今天我们将介绍如何在Linux环境下安装opencv,并将其与php项目结合到一起使用。
二、安装准备
我们此次采用编译安装的模式进行部署,不同的php版本需要配合不同版本的opencv使用,这些模块的编译都需要cmake支持,所以我们需要提前了解一下各个模块的版本组合,避免多走弯路。
各模块版本映射表如下:
php
php-opencv
opencv
cmake
c++
5.6/5.7/5.8
暂无
2.0+
2.0.0+
>=8
7.0/7.1
7.2
3.0+
3.0.0+
>=10
7.2
7.2/7.3
4.0+
3.5.1+
>=11
7.3
7.3
4.2+
3.10.0+
>=11
7.4/8.0/8.1/8.2
8.1+
4.5.5+
3.20.0+
>=11
标红那一行是我们今天使用的版本组合。详细版本如下:
- php7.2.34
- php-opencv-php7.2
- opencv4.0.1
- cmake3.15.0
- c++11
三、安装cmake
3.1:下载安装包并解压
wget https://gitlab.kitware.com/cmake/cmake/-/archive/v3.15.0/cmake-v3.15.0.zip
unzip cmake-v3.15.0.zip
cd cmake-v3.15.0
3.2:编译安装
./bootstrap --system-curl //参数很重要,否则会报错
make
make install
3.3:添加命令,测试
cmake默认安装目录在/usr/local下
ln -s /usr/local/bin/cmake /usr/bin/cmake
四、安装opencv
4.1:下载安装包并解压
wget https://codeload.github.com/opencv/opencv/zip/refs/tags/4.0.1 > opencv-4.0.1.zip
unzip opencv-4.0.1.zip
cd opencv-4.0.1
4.2:安装依赖
yum install gcc gcc-c++ gtk2-devel pkgconfig
python python-devel python-numpy
libdc1394-devel libv4l-devel gstreamer-plugins-base-devel
libpng-devel libjpeg-turbo-devel jasper-devel openexr-devel
libtiff-devel libwebp-devel tbb-devel eigen3-devel
4.3:编译安装
mkdir build
cd build
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local ..
make -j4
sudo make install
4.4:测试
/usr/local/bin/opencv_version
版本号输出成功
4.5:配置pk-config
在下一步中我们编译php扩展默认需要依赖pk-config,为了避免麻烦,这里我们直接做一下配置。
touch /usr/lib64/pkgconfig/opencv4.pc //在依赖目录下创建pc文件
vim /usr/lib64/pkgconfig/opencv4.pc //编辑创建的pc文件
...
prefix=/usr/local //opencv4安装目录
exec_prefix=${prefix}
includedir=${prefix}/include
libdir=${exec_prefix}/lib
Name: opencv
Description: The opencv library
Version:4.0.1
Cflags: -I${includedir}/opencv4
Libs: -L${libdir} -lopencv_stitching -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_video -lopencv_photo -lopencv_ml -lopencv_imgproc -lopencv_flann -lopencv_core //注意这里,不能乱加不存在的依赖,在后续使用的时候,编译器会校验依赖,如果发现不存在的依赖,会报错
默认情况下 pkg-config 的查找路径为 /usr/lib/pkgconfig 和 /usr/share/pkgconfig,也可以通过环境变量 PKG_CONFIG_PATH 在额外指定 pkg-config 的查找路径
配置成功后我们可以测试一下:
五、安装php-opencv扩展
5.1:下载扩展源码
git clone -b php7.2 https://github.com/php-opencv/php-opencv.git
cd php-opencv
5.2:编译扩展
phpize
./configure --with-php-config=/usr/bin/php-config --enable-debug
make CXXFLAGS='-std=c++11' //这里很重要,千万不要搞错,opencv4版本的话必须要c++11版本以上编译,这也是为啥前面步骤中要求安装c++11的原因
make install
5.3:配置php扩展
vim php.ini
...
extension=opencv.so
六、php项目测试
测试代码:
<?php
use CV\{Mat,Scalar, Point, Size};
use function CV\{ellipse, imwrite, waitKey};
use const CV\{CV_8UC3};
$windowWidth = 600;
$thickness = 2;
$lineType = 8;
$matScalar = new Scalar(0,0,0);
$mat = new Mat($windowWidth, $windowWidth, CV_8UC3, $matScalar);
$point=new Point($windowWidth/2, $windowWidth/2);
$size=new Size($windowWidth/4, $windowWidth/16);
$scalar=new Scalar(255, 129, 0);
for($i = 0; $i <= 360; $i += 45){
ellipse($mat,$point,$size,$i,0,360,$scalar,$thickness,$lineType);
}
imwrite('/tmp/ellipse.png',$mat);
?>
运行代码我们会得到一个漂亮的图像:
opencv有很多实用的函数,这里不再一一举例,想要发掘opencv更多功能的同学可以看我后面的文章,我将继续带大家发掘更多opencv用法
七、遇到的问题
问题1:cmake编译失败,在执行make阶段,如下图:
解决方案:这个原因其实是依赖错误导致的,libcmcurl链接库版本不对,解决办法就是指定curl依赖,可以在编译配置阶段加上如下配置:
./bootstrap
改为
./bootstrap --system-curl
问题2:配置完php扩展后,测试的时候,发现opencv动态链接库找不到,报错如下:
解决方案:这个问题的原因是动态库依赖目录设置不正确,默认的LD_LIBRARY_PATH指向没有包含我们安装的opencv库,所以我们需要做以下处理:
export LD_LIBRARY_PATH="/usr/local/lib" //把opencv安装目录加到依赖查找