前言
本文解决了上一篇文章中的接口问题(cv::Mat to numpy.ndarray),使用的工具是github上Gregory Kramida的一个项目pyboostcvconverter。关于该项目的介绍和使用方式在其Readme中有详细的介绍,因此本文主要介绍使用过程中会出现的若干问题和解决办法。
问题
1. cmake-gui 路径设置
在Readme中,作者Gregory Kramida建议使用cmake-gui进行编译链接,设置的主要是boost和Python的路径,以下为笔者设置的路径
OpenCV_Dir /usr/local/share/OpenCV
PYTHON_Desire_version 3.X
Boost_include_dir /usr/include
Boost_Library_dir /usr/lib
Boost_Python-PY37_Library_xx /usr/lib/x86_64-linux-gnu/libboost_python-py37.so
Boost_Python37_Library_xx /usr/lib/x86_64-linux-gnu/libboost_python-py37.so
PYTHON3_EXECUTABLE /home/zhantao/anaconda3/bin/python
PYTHON3_INCLUDE /home/zhantao/anaconda3/include/python3.7m
PYTHON3_Library /home/zhantao/anaconda3/lib/libpython3.7m.so
PYTHON3_NUMPY_INCLUDE /home/zhantao/anaconda3/lib/python3.7/site-packages/numpy/core/include
PYTHON3_PACKAGE_PATH lib/python3.7/site-packages
其中需要注意的问题有:
- 1 如果在configure时报错:找不到libboost_python-py37,同时通过查找也发现本机确实只安装了
相近
版本的boost-python库,例如libboost_python-py35,那么可以直接将libboost_python-py35.so复制一份,改名为libboost_python-py37.so。这一操作不影响编译链接结果。(另:Library的路径一定要精确到.so文件
) - 2 选择Python路径时,要考虑之后这一Python module会在哪一版本的Python下使用(2.x, 3.x),设置对应的版本路径即可。这里由于安装了anaconda,默认Python版本是3.7.1,且之后也在该环境下使用,故所有的Python相关路径都设置到anaconda内,相比在系统内找比较简单。
- 3 最后需要注意的一点是,cmake-gui可能报找不到Python Interpreter,这一警告的原因是可能只找到了3.x版本的解释器,因此只要不报其他的错并且可以 generate 出来就没问题。
2. 封装完函数后
在添加完用户自己的函数或者类和命名空间后,进行编译链接时需要注意以下几个问题:
- 1 由于整个程序只是生成一个库文件,因此编译器链接器
不会对一些变量是否被定义进行检查
。如果某些函数所使用的库没有被包含在CMakeLists文件的find_package
语句中,虽然编译链接没有问题,但是使用该库时会出现:undefined symbol: _2N2Qmdxxxxxx 的报错。
——解决方法: 核对使用的库并添加到CMakeLists中,例如 find_package(OpenCV COMPONENTS core imgproc highgui REQUIRED) - 2 将生成的库文件(.so)复制到使用的Python文件夹下
site-packages
文件夹中,然后即可在Python中import定义的函数或类。 - 3 最后一个问题是使用IDE时注意选择build的类型,如果已经完成了代码的检查和确认,建议使用
release
的build类型,否则生成的库文件将很大,Python调用时也会非常慢。在命令行中可以通过使用 -O3 等参数要求编译器自动优化。