先来看看编译sikuli前需要安装的依赖吧,就是下面这一大坨
cmake,容易安装一些,我记得apt-get命令即可,我的是cmake3
然后我就先挑了一个我比较熟悉的jdk,先安装的jdk,但是官网要注册账号才能下载,并且下载速度十分缓慢,推荐一个华为云的镜像,https://repo.huaweicloud.com/java/jdk/
另外忘记说了sikuli源码文件从github上可下载到,上面截图即来自其中的build_linux.txt文件
https://gitee.com/dragonajin/sikuli这是我从github中倒过来的,码云下载速度很快,很实用的平台
opencv我也是利用这个方法下载的
语言包下载位置https://github.com/tesseract-ocr/tessdata/
Tesseract 下载位置https://github.com/tesseract-ocr/tesseract(此次遇到的最大困难就发生在他身上,也就是本篇重点要讲cmake)
好,接着说安装的事情,jdk的安装不是什么问题,可以使用jdk的可执行二进制文件进行安装,主要会配置环境变量即可$PATH, CLASS_PATH等,下面是我的配置
export JAVA_HOME=/usr/lib/jvm/jdk1.6.0_45
export CLASSPATH=.:$JAVA_HOMME/lib/tools.jar:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/jre/lib/rt.jar
export PATH=$PATH:$JAVA_HOME/bin
然后我选择第二个熟悉的opencv,下载opencv,记得他还有个补丁Opencv_Contrib,这里我头脑发热的选择了最新版opencv4,然后我就“幸运”的碰到了各种各样的考验,关于其编译安装的细节我不多说,附上参考链接,
先给一个中文网http://wiki.opencv.org.cn/index.php/Download,也可以下载opencv
安装教程1https://www.cnblogs.com/lvdongjie/p/11484575.html
安装教程2https://elbauldelprogramador.com/en/how-to-compile-opencv3-nonfree-part-from-source/
安装教程3https://blog.youkuaiyun.com/u011897411/article/details/89743448#54__opecvpc_opencv4pc___216
只来说一说遇到的问题,
1.fatal error: boostdesc_bgm.i: 没有那个文件或目录
网上对这个问题也能搜到,似乎是普遍问题,原因是缺少下面这几个文件
boostdesc_bgm.i
boostdesc_bgm_bi.i
boostdesc_bgm_hd.i
boostdesc_lbgm.i
boostdesc_binboost_064.i
boostdesc_binboost_128.i
boostdesc_binboost_256.i
vgg_generated_120.i
vgg_generated_64.i
vgg_generated_80.i
vgg_generated_48.i
文件下载地址https://pan.baidu.com/s/17XhXX_cLz46bsj9ZWRkNIg 提取码p50x
2.fatal error: features2d/test/test_detectors_regression.impl.hpp: 没有那个文件或目录
将opencv-4.1.0/modules/features2d/test/文件下的
test_descriptors_invariance.impl.hpp
test_descriptors_regression.impl.hpp
test_detectors_invariance.impl.hpp
test_detectors_regression.impl.hpp
test_invariance_utils.hpp
拷贝到opencv_contrib-4.1.0/modules/xfeatures2d/test/文件下。同时,将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_features2d.cpp文件下的
#include "features2d/test/test_detectors_regression.impl.hpp"
#include "features2d/test/test_descriptors_regression.impl.hpp"
改成
#include "test_detectors_regression.impl.hpp"
#include "test_descriptors_regression.impl.hpp"
将opencv_contrib-4.1.0/modules/xfeatures2d/test/test_rotation_and_scale_invariance.cpp文件下的
#include "features2d/test/test_detectors_invariance.impl.hpp"
#include "features2d/test/test_descriptors_invariance.impl.hpp"
改成
#include "test_detectors_invariance.impl.hpp"
#include "test_descriptors_invariance.impl.hpp"
以上问题的解决方案参考自https://blog.youkuaiyun.com/qq_31112205/article/details/105210496,里面有更多的问题样例
然后我们用opencv的一个大坑来引引本篇的主题,opencv在编译时默认不生成opencv.pc这个文件,这将直接导致一个问题,pkg-config(包管理工具)找不到opencv,这是因为pkg-config是通过.pc文件知道opencv安装目录的
据说,要编译前设置编译选项OPENCV_GENERATE_PKGCONFIG=ON,这样编译完以后就可以自动生成文件opencv.pc, 此过程没有亲测,我是在编译前并未提前设置该选项,然后编译完以后进行补救的
cmake -DCMAKE_BUILD_TYPE=Release \
-DOPENCV_GENERATE_PKGCONFIG=ON \
-DCMAKE_INSTALL_PREFIX=/usr/local ..
补救办法就是,自己写一个opencv.pc文件,内容如下,很好理解不再赘述,注意一点就是此pc文件名称应当和包名保持一致。
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir_old=${prefix}/include/opencv4/opencv2
includedir_new=${prefix}/include/opencv4
Name: OpenCV
Description: Open Source Computer Vision Library
Version: 4.1.0
Libs: -L${exec_prefix}/lib -lopencv_gapi -lopencv_stitching -lopencv_aruco -lopencv_bgsegm -lopencv_bioinspired -lopencv_ccalib -lopencv_dnn_objdetect -lopencv_dpm -lopencv_face -lopencv_freetype -lopencv_fuzzy -lopencv_hfs -lopencv_img_hash -lopencv_line_descriptor -lopencv_quality -lopencv_reg -lopencv_rgbd -lopencv_saliency -lopencv_stereo -lopencv_structured_light -lopencv_phase_unwrapping -lopencv_superres -lopencv_optflow -lopencv_surface_matching -lopencv_tracking -lopencv_datasets -lopencv_text -lopencv_dnn -lopencv_plot -lopencv_videostab -lopencv_video -lopencv_xfeatures2d -lopencv_shape -lopencv_ml -lopencv_ximgproc -lopencv_xobjdetect -lopencv_objdetect -lopencv_calib3d -lopencv_features2d -lopencv_highgui -lopencv_videoio -lopencv_imgcodecs -lopencv_flann -lopencv_xphoto -lopencv_photo -lopencv_imgproc -lopencv_core
Libs.private: -ldl -lm -lpthread -lrt
Cflags: -I${includedir_old} -I${includedir_new}
另外,再贴一贴其他包的pc文件仅供参考学习
如Tesseract.pc
prefix=/usr/local/tesseract
exec_prefix=${prefix}
bindir=${exec_prefix}/bin
datarootdir = ${prefix}/share
datadir=${datarootdir}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: tesseract
Description: An OCR Engine that was developed at HP Labs between 1985 and 1995... and now at Google.
URL: https://github.com/tesseract-ocr/tesseract
Version: 4.1.0
Requires.private: lept
Libs: -L${libdir} -ltesseract
Libs.private: -lpthread
Cflags: -I${includedir}
libtiff.pc
prefix=/usr/local
exec_prefix=${prefix}
libdir=${exec_prefix}/lib
includedir=${prefix}/include
Name: libtiff
Description: Tag Image File Format (TIFF) library.
Version: 4.0.10
Libs: -L${libdir} -ltiff
Libs.private: -llzma -ljbig -ljpeg -lz -lm
Cflags: -I${includedir}
那么pkg-config是怎么找到pc文件的呢,这是通过一个名为PKG_CONFIG_PATH的系统变量,在这个变量里面记录了.pc文件所在的路径,例如/usr/lib/pkgconfig , /usr/local/llib/pkgconfig , /usr/local/包名/lib/pkgconfig
这样配置好以后,我们在终端使用一下命令,就可以查到这个包的有关信息了。
pkg-config --cflags 包名 #查看包中头文件路径
pkg-config --libs 包名 #查案包中的库文件
pkg-config --modversion 包名 #查看包的版本号
之所以我们这里要重点关注pkg-config是因为sikuli编译时是使用pkg-config工具去寻找它所依赖的包。
在cmake_modules文件夹中有搜索包的cmake文件 " Find包名.cmake ", 打开此文件
在这个文件中使用libfind_pkg_check_modules(pkgname_PKGCONF pkgname) 就表明要使用pkg-config去寻找需要的包了
如果pkg-config帮忙找到了所需要的包,就会自动设置新变量pkgname_PKGCONF_INCLUDE_DIRS 和 pkgname_PKGCONF_LIBRARY_DIRS ,变量的值是从.pc文件中得到的相应路径。
这样find_path和find_library就会分别将二者作为搜索的路径之一,进行搜索相应的文件,如果找到,就会给他们的第一个参数进行赋值,赋的值就是存放有所需文件的路径
然后我们讲 find_path() 和find_library() 两个函数,
find_path 详情请参考https://cmake.org/cmake/help/v3.6/command/find_path.html
find_library 详情请参考https://cmake.org/cmake/help/v3.6/command/find_library.html#find-library
find_package详情请参考https://cmake.org/cmake/help/v3.6/command/find_package.html
https://blog.youkuaiyun.com/harbor1981/article/details/73850653
下面这幅图片显示的就是寻找包Tesseract时的具体使用例子
其中函数的第一个参数都是变量名,HINTS 后跟的就是待搜索的路径,如果在其中某个路径中找到了所需要的依赖,那么就把这个路径当作值赋给变量。否则将会被赋值为<VAR>-NOTFOUND
最后给一个调试用的函数 message() 类似于c语言中的printf()。如对makefile文件生成的过程仍有疑问可以使用此函数进行调试。