二、发现的奇怪东西 以前我也是无脑的直接编译生成的,但是由于有了pybind的经验,我就想看看OpenCV这个这么巨大的CmakeLists里面都是有些什么东西,一看就发现了一些奇怪的东西。1、BUIILD_opencv_apps一般意义上来说,都会理解apps是手机上的app,但是这个翻开来看以后是这样的:基本上可以确定是示例程序之类,我觉得应该可以去掉,肯定是和手机没关系。
2、BUIILD_opencv_python3 和 BUIILD_opencv_python_bindings_generator 和 BUIILD_opencv_pythons_tests这三个都是关于python的,我比较关心python_bindings_generator ,我认为这个东西会不会和前一段时间研究的pybind11有关系?有重复,查询相关资料,进一步明确。
Steps for building the Python module
We are now ready to go over the steps for building our Python module.
- Step 1: Put your c++ source code and header files inside the src directory.
- Step 2: Include your header file in headers.txt
- Step 3: Make a build directory.
1 mkdir build
Step 4: Use gen2.py to generate the Python binding files. You need to specify the prefix (pybv), the location of the temporary files (build) and the location of the header files (headers.txt).
1 python3 gen2.py pybv build headers.txt
This should generate a whole bunch of header files with prefix pybv_*.h. If you are curious, feel free to inspect the generated files.
- Step 5: Compile the module
1 g++ -shared -rdynamic -g -O3 -Wall -fPIC \
2 bv.cpp src/bvmodule.cpp \
3 -DMODULE_STR=bv -DMODULE_PREFIX=pybv \
4 -DNDEBUG -DPY_MAJOR_VERSION=3 \
5 `pkg-config --cflags --libs opencv` \
6 `python3-config --includes --ldflags` \
7 -I . -I/usr/local/lib/python3.5/dist-packages/numpy/core/include \
8 -o build/bv.soIn Line 2 we specify the source files. In Line 3, we set the module name using MODULE_STR and MODULE_PREFIX (pybv) used in the previous step. In Line 4 we specify the Python version. In Line 5 we include OpenCV library and the header files and in Line 6 we include Python 3 related header files and some standard libraries. In my machine, numpy was not in the included path and so I had to add an extra Line 7 for numpy. Your location for numpy may be different. Finally, in Line 8 we specify the location of the output module (build/bv.so).
3、thunder thunder不是迅雷吗?难道OpenCV和它还有关系。怀着探究心态,不断挖掘,发现原来是这个东西:很有可能进一步使这个东西因为我给OpenCV投过代码,我知道它的代码审核、自动生成等是比较严格的。
三、我筛选的OpenCV_Cmake 我记得上学的时候,老师经常会说“可以对Linux进行裁剪”,感觉这个是很高大上的一件事情,但是当然是不知道如何“裁剪”。实际上,OpenCV作为老牌开源项目,它这里这么多的BUILD选项,就是给你一个“裁剪”的接口。你可以根据需要进行选择。对于我来说,我最近一次编译Cmake是在写《构建自己的专用OpenCV----一个由applyColorMap()引发的探索(上)》的时候发生的,因为我需要修改OpenCV的代码,实现一个它自己没有的applyColorMap色彩,所以需要编译OpenCV。由于我知道applyColorMap属于imgproc,是比较基础的库,因此这里很多东西都没必要选择。这个时候,我对OpenCV的“裁剪”是这样的其中,我勇敢地去掉了BUILD_EXAMPLES、BUILD_opencv_dnn、BUILD_opencv_gapi、BUILD_opencv_java_*、BUILD_opencv_python_*、BUILD_opencv_video*等这些我很明确用不着的东西,对于BUILD_opencv_apps之类搞不清楚的东西进行了保留,特别是添加了BUILD_opencv_world,这样可以生成一个dll,免得添加麻烦。最后的结果是29个项目,可能还能够再去掉一些,但是没有继续尝试,这样的话每次编译,速度都比较快。
四、参考资料1、《How to convert your OpenCV C++ code into a Python module》https://www.learnopencv.com/how-to-convert-your-opencv-c-code-into-a-python-module/2、《OpenCV-Python bindings是如何生成的》https://blog.csdn.net/callinglove/article/details/84971480?utm_medium=distribute.pc_relevant.none-task-blog-OPENSEARCH-1&depth_1-utm_source=distribute.pc_relevant.none-task-blog-OPENSEARCH-1
来自为知笔记(Wiz)