OpenCV-Python bindings生成流程

通过上篇文章和opencv python模块中的CMakeLists.txt文件,可以了解到opencv-python bindings生成的整个流程:

  1. 生成headers.txt文件
    将每个模块的头文件添加到list中,通过一些关键词过滤掉一些不需要扩展的头文件,file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs}")将过滤后的list写入文件;
    headers.txt保存需要转换的头文件路径,英文;隔开,注意文件末尾没有换行符

  2. 生成cv2.cpp中需要的头文件

        set(cv2_generated_hdrs"${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_include.h""${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_funcs.h""${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_types.h""${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_type_reg.h""${CMAKE_CURRENT_BINARY_DIR}/pyopencv_generated_ns_reg.h")file(WRITE "${CMAKE_CURRENT_BINARY_DIR}/headers.txt" "${opencv_hdrs}")
    add_custom_command(OUTPUT ${cv2_generated_hdrs}COMMAND ${PYTHON_EXECUTABLE} "${PYTHON_SOURCE_DIR}/src2/gen2.py" ${CMAKE_CURRENT_BINARY_DIR} "${CMAKE_CURRENT_BINARY_DIR}/headers.txt"DEPENDS ${PYTHON_SOURCE_DIR}/src2/gen2.pyDEPENDS ${PYTHON_SOURCE_DIR}/src2/hdr_parser.pyDEPENDS ${CMAKE_CURRENT_BINARY_DIR}/headers.txtDEPENDS ${opencv_hdrs})
    

    通过调用gen2.py来实现的,第一个参数是生成头文件后保存的路径,第二个参数是headers.txt文件路径

  3. 将cv2.cpp编译成动态库

OpenCV-Python bindings实践操作

纸上得来终觉浅,绝知此事要躬行。整个事情的来龙去脉都已经讲清楚,单到底怎么应用到自己的项目中呢。比如将自己图像检测功能实现完成,老大要求将它写成Web服务,毕竟B/S模式非常流程。C++写Web?开国际玩笑吧,现在python非常流行的天下。那么接下来看看怎么讲c++功能函数类转换成python的扩展库吧。

网上查查资料,还真有相关的blog:

  • How to convert your OpenCV C++ code into a Python module
  • github code https://github.com/spmallick/learnopencv/tree/master/pymodule

博客写的很好,但是提供的源码千般尝试始终报错,于是乎决定自己从CMakeLists.txt看起,从gen2.py脚本看起,慢慢查实。

mkdir ovex
cd ovex
mkdir src
cp ../opencv-3.1.0/modules/python/src2/{pycompat.hpp,cv2.cpp,gen2.py,hdr_parser.py} ./
cp ../learnopencv-master/pymodule/src/* src/
cp ../learnopencv-master/pymodule/headers.txt ./

准备使用opencv-3.1.0源码中的pycompat.hpp,cv2.cpp,gen2.py,hdr_parser.py文件,使用上面博客中的opencv c++源文件,慢慢来

gen2.py ./ headers.txt命令,第一步就报错了IOError: [Errno 2] No such file or directory: 'src/bvmodule.hpp\n'
看到文件名后面居然有个换行符,哎,拿到windows下删掉换行符。

去掉headers.txt中的换行符在去执行上面的命令,报出另外一个错误

Traceback (most recent call last):File "./gen2.py", line 943, in <module>generator.gen(srcfiles, dstdir)File "./gen2.py", line 855, in genself.code_include.write( '#include "{0}"\n'.format(hdr[hdr.rindex('opencv2/'):]) )
ValueError: substring not found

hdr.rindex('opencv2/')取头文件中opencv/的位置,hdr[hdr.rindex('opencv2/'):])取头文件中opencv/之后的所有字符串。看样子脚本是opencv定制,应用需要改动脚本某些地方,通过不断尝试,几经修改,终于大功告成。gen2.py ./ headers.txt命令在当前目录下生成pyopencv_generated_funcs.h pyopencv_generated_include.h pyopencv_generated_ns_reg.h pyopencv_generated_type_reg.h pyopencv_generated_types.h文件。gen2.py修改如下

调整博客提供的编译命令,编译动态库

g++ -shared -rdynamic -g -O3 -Wall -fPIC \
-I . -I../ -I/usr/local/python2.7.14/lib/python2.7/site-packages/numpy/core/include \
cv2.cpp src/bvmodule.cpp \
-DNDEBUG \
`PKG_CONFIG_PATH=/usr/local/opencv_with_contrib3.1.0/lib/pkgconfig pkg-config --cflags --libs opencv` \
`/usr/local/python2.7.14/bin/python2.7-config --includes --ldflags` \
-L`/usr/local/python2.7.14/bin/python2.7-config --exec-prefix`/lib \
-o bv.so

出错

cv2.cpp:124: 错误:‘Stitcher’未声明
cv2.cpp:124: 错误:expected initializer before ‘Status’
cv2.cpp:474: 错误:ISO C++ 不允许声明无类型的‘Status’
cv2.cpp:474: 错误:expected ‘,’ or ‘...’ before ‘&’ token
cv2.cpp:474: 错误:‘PyObject* pyopencv_from(int)’的模板标识符‘pyopencv_from<>’不匹配任何模板声明
cv2.cpp:1257: 警告:‘int convert_to_char(PyObject*, char*, const char*)’定义后未使用

类型未声明,用不到的话就删掉吧

再次执行编译命令,期待的so动态库在当前目录生成了。那就试他一试吧,

ovex]$ python2.7
Python 2.7.14 (default, Jul 25 2018, 13:52:02)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bv
Traceback (most recent call last):File "<stdin>", line 1, in <module>
ImportError: dynamic module does not define init function (initbv)

这个错误的出现不得不促使我去了解一下C/C++为python做扩展的整个流程,Extending and Embedding the Python Interpreter,注意python2与python3是有差异的。

很容易发现,模块需要一个对应初始化函数来初始化模块,比如PyInit_bv,那么在opencv中这个初始化函数在哪定义的呢?直接点在当前目录下执行grep -n --color=auto "cv2" -R *,在cv2.cpp中找到我们想要的函数了,接下来就是修改了

模块的名称是通过MODULESTR来定义的,python2以及python3中模块初始化函数的声明与定义。
再次编译成功通过,测试OK

$ python2.7
Python 2.7.14 (default, Jul 25 2018, 13:52:02)
[GCC 4.4.7 20120313 (Red Hat 4.4.7-23)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import bv
>>> import numpy as np
>>> dir(bv)
['CV_16S', 'CV_16SC1', 'CV_16SC2', 'CV_16SC3', 'CV_16SC4', 'CV_16U', 'CV_16UC1', 'CV_16UC2', 'CV_16UC3', 'CV_16UC4', 'CV_32F', 'CV_32FC1', 'CV_32FC2', 'CV_32FC3', 'CV_32FC4', 'CV_32S', 'CV_32SC1', 'CV_32SC2', 'CV_32SC3', 'CV_32SC4', 'CV_64F', 'CV_64FC1', 'CV_64FC2', 'CV_64FC3', 'CV_64FC4', 'CV_8S', 'CV_8SC1', 'CV_8SC2', 'CV_8SC3', 'CV_8SC4', 'CV_8U', 'CV_8UC1', 'CV_8UC2', 'CV_8UC3', 'CV_8UC4', 'Filters', '__doc__', '__file__', '__name__', '__package__', '__version__', 'createTrackbar', 'error', 'fillHoles', 'setMouseCallback']
>>> import cv2
>>> img = cv2.imread("holes.jpg")
>>> bv.fillHoles(img)
>>> cv2.imwrite("filledHoles.jpg", img)
True
>>>

OpenCV-Python bindings是如何生成的(2)相关推荐

  1. 实战:使用OpenCV+Python+dlib为人脸生成口罩

    点击上方"小白学视觉",选择加"星标"或"置顶" 重磅干货,第一时间送达本文转自|AI算法与图像处理 本文使用OpenCV dlib库生成口 ...

  2. python测试框架数据生成工具最全资源汇总

    xUnit frameworks 单元测试框架 frameworks 框架 unittest - python自带的单元测试库,开箱即用 unittest2 - 加强版的单元测试框架,适用于Pytho ...

  3. OpenCV-Python bindings是如何生成的(1)

    翻译自How OpenCV-Python Bindings Works? 目标 学习 OpenCV-Python bindings是如何生成的 如何为Python扩展新的opencv模块 OpenCV ...

  4. OpenCV+python:Canny边缘检测算法

    1,边缘处理 图像边缘信息主要集中在高频段,通常说图像锐化或检测边缘,实质就是高频滤波.我们知道微分运算是求信号的变化率,具有加强高频分量的作用. 在空域运算中来说,对图像的锐化就是计算微分.由于数字 ...

  5. OpenCV Python在计算机视觉中的应用

    OpenCV Python教程 在这篇文章中,我们将使用Python中的OpenCv来涵盖计算机视觉的各个方面.OpenCV长期以来一直是软件开发的重要组成部分. 什么是计算机视觉? 我们考虑一个场景 ...

  6. python中import cv2遇到的错误及安装方法_独家利用OpenCV,Python和Ubidots来构建行人计数器程序(附代码amp;解析)...

    作者:Jose Garcia 翻译:吴振东 校对:张一豪 本文约4000字,建议阅读14分钟. 本文将利用OpenCV,Python和Ubidots来编写一个行人计数器程序,并对代码进行了较为详细的讲 ...

  7. OpenCV Python教程(3)(4)(5): 直方图的计算与显示 形态学处理 初级滤波内

    OpenCV Python教程(3.直方图的计算与显示) 本篇文章介绍如何用OpenCV Python来计算直方图,并简略介绍用NumPy和Matplotlib计算和绘制直方图 直方图的背景知识.用途 ...

  8. python opencv显示图片一闪而过_解决Opencv+Python cv2.imshow闪退问题

    Opencv+Python cv2.imshow闪退 # 读入原始图像 origineImage = cv2.imread('./pic/6.jpeg') # 图像灰度化 # image = cv2. ...

  9. OpenCV+Python 彩色图片的 BGR、灰度图、HSV分量图显示的程序

    OpenCV+Python 彩色图片的 BGR.灰度图.HSV分量图显示的程序 介绍 OpenCV+Python 使用openCV中的split()函数和 cvtColor()函数提取一张彩色图片的B ...

最新文章

  1. dataframe构建
  2. VBScript 之文件 IO 篇
  3. 识别字符串中的表达式
  4. html页面判断是否登录,egg(103)--egg之定义公共的中间件判断用户是否登录以及去结算页面制作...
  5. 通过shell访问hive_【HIVE】SHELL调用Hive查询
  6. dnf丢失clientbase_clientbase.dll
  7. python—符号 | ^的使用
  8. echarts 获取点击的y轴数值_ECharts关系图
  9. html中引入另一个html
  10. 社交网络模型及属性介绍
  11. 深入解析CAS算法原理
  12. 原生js的animate方法
  13. 大数据-玩转数据-阿里DataWorks开发治理平台
  14. Fields、Fieldvalues和Fieldbyname的区别
  15. 常用日本语1000句+简单用语
  16. 阿里首席风险官刘振飞:聚安全人之力 为全社会赋能
  17. 全代码编写的iPhone界面源码1 UIView UILabel UIButton
  18. STC单片机在线ISP IAP OTA
  19. javaee之http协议、request请求
  20. PL/SQL开发常见SQL知识

热门文章

  1. CoreAnimation编程指南(四)图层树结构
  2. 现代软件工程 学生自我评价表
  3. 设置java环境变量生效 centos_解决CentOS java环境不生效的问题
  4. IOC操作Bean管理XML方式(P名称空间注入)
  5. JAVA入门级教学之(static静态代码块)
  6. 优秀Java程序员的编程风格
  7. html鼠标滑轮换图片,JavaScript实现鼠标滚轮控制页面图片切换
  8. python动态页面元素爬取_爬取动态网页python+Web kit
  9. 网站域名解析端口_环境测试必备,无需注册域名,免费动态IP解析一键解析本地网站...
  10. 【学习笔记】JAVA基础——异常处理部分