首页 > 系统相关 >基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)

时间:2022-12-26 23:05:50浏览次数:60  
标签:gray pybind11 -- c++ Python https include com

C++ 是一种编译型(compiled)语言,设计重点是性能、效率和使用灵活性,偏向于系统编程、嵌入式、资源受限的软件和系统。

Python是一种解释型(interpreted)语言,同样也支持不同的编程范式。Python 内置了常用数据结构(str, tuple, list, dict),简洁的语法、丰富的内置库(os,sys,urllib,...)和三方库(numpy, tf, torch ...),功能强大。最为重要的是和能够和多种服务(flask…)和tensorflow、pytorch等无缝联合,从而方便将你的算法开放出去。

一方面,我们需要编译型语言(C++)性能;一方面,也需要解释型语言(Python)的灵活。这时,pybind11 可以用作 C++ 和 Python 之间沟通的桥梁。

Pybind11 是一个轻量级只包含头文件的库,用于 Python 和 C++ 之间接口转换,可以为现有的 C++ 代码创建 Python 接口绑定。Pybind11 通过 C++ 编译时的自省来推断类型信息,来最大程度地减少传统拓展 Python 模块时繁杂的样板代码, 已经实现了 STL 数据结构、智能指针、类、函数重载、实例方法等到Python的转换,其中函数可以接收和返回自定义数据类型的值、指针或引用。

由于在Windows上和在Linux上使用会有较大不同,所以我这里将分为两个部分来说明问题,本文为上篇,具体说明Windows+VS实现

1、vs的最简单调用

新创建项目,做以下修改:

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_python

 




基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_02


 



基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_03


 


这几个都是标准配置【当然还有更简便方法】,正常生成


#
include "pch.h"
# include <iostream >

# include <pybind11 /pybind11.h
>

namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example module";

// Add bindings here
m.def( "foo", []() {
return "Hello, World!";
});
}


 


其中:


The  ​​PYBIND11_MODULE()​​​  macro creates a function that will be called when an  ​​import​​​  statement is issued from within Python. The module name ( ​​example​​​ ) is given as the first macro argument (it should not be in quotes). The second argument ( ​​m​​​ ) defines a variable of type  ​​py::module​​​  which is the main interface for creating bindings. The method  ​​module::def()​​​  generates binding code that exposes the  ​​add()​​  function to Python.


 


生成结果中,只有pyd是需要的.



基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_04


 

 


当你的python调用和pyd的文件在同一个目录下面就可以进行调用。


 



基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_Python_05


 

 


pyd是什么格式的文件:
1.PYD是一种PYTHON动态模块。
2.实质上还是dll文件,只是改了后缀为PYD。


 

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_Python_06

这里特别需要注意,就是.pyd文件名和GOPyWarper这个函数名字一定要一样,否则报

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_python_07

错误。

2、vs添加OpenCV的调用

配置中,需要添加OpeCV部分。分别是附加包含目录和附加依赖项。

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_python_08

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_Python_09

 

 



PYBIND11_MODULE(example, m) {







m.doc() = "pybind11 example module";







// Add bindings here



m.def("foo", []() {



Mat src = imread("e:/template/lena.jpg");



Mat gray;



cvtColor(src, gray, COLOR_BGR2GRAY);



imshow("gray", gray);



waitKey(0);//必须要设置,否则卡死



return "Hello, OpenCV!";



});


基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_10


这种调用是没有问题的,关键的问题在于numpy数组和Mat的相互转换。只有这样,才能够将Mat和Python高质量融合。


 


基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_Python_11


// python调用C++.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。


//

# include "pch.h"
# include <iostream >
# include <opencv2 /core.hpp >
# include <opencv2 /imgcodecs.hpp >
# include <opencv2 /imgproc.hpp >
# include <opencv2 /highgui.hpp >
# include <pybind11 /pybind11.h >
using namespace cv;
using namespace std;
namespace py = pybind11;
PYBIND11_MODULE(example, m) {
m.doc() = "pybind11 example module";
// Add bindings here
m.def( "foo", [](string strPath) {
Mat src = imread(strPath);
Mat gray;
cvtColor(src, gray, COLOR_BGR2GRAY);
imshow( "gray", gray);
waitKey( 0); //必须设置,否则卡死
return "Hello, OpenCV!";
});
}


 


3、图片Mat作为输入和list作为输出


对于实际项目而言来说,输入的是图片,输出的vector(numpy),这里就涉及到格式转换问题,目前找到解决方案。


src = cv2.imread( '', 1) 
var1 = GOPyWarper.test_rgb_to_gray(src)
cv2.imshow( 'gray',var1)


基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_12


 



基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_13

基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_14


 


给出了3通道和1通道的numpy和Mat的转换,基本上是够用的,其它转换可以在内部进行。


然后在接口中有进一步封装,这个都是非常好理解的。


基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_Python_15


在输出这一块,有非常容易的方法,参考:这种方法虽然丑陋,但是有效。


py
:
:list test_pyramid_image(py
:
:array_t
<
unsigned char
>
& input) {

py::list out;
for (int i = 0; i < 100; i++)



{



out.append<py::int_>(i);



}



return out;



基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_16


 


4、融合实现GOFindPip算法


基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_OpenCV_17


输入图片,输出圆心数组(x、y排列),实现功能。


基于pybind11实现Python调用c++编写的CV算法--上(Windows+VS)_Python_18


py : :list GO_FindPips(py : :array_t < unsigned  char > & input) {
     //输出结果
    py : :list out;
……


转换为release模式,能力有数量级的提升。


 


总的来看,在Windoes上的部署,由于VS提供了许多方便,所以比较流畅。


========================参考======


  ​​https://www.jianshu.com/p/9e03e2724964​​ 


pybind11—HOG特征提取以及python接口封装


​https://www.jianshu.com/p/5dc844002d72​


pybind11—目标跟踪demo(深度学习人脸检测跟踪)


​https://www.jianshu.com/p/82a5748ed0fb​


pybind11—目标跟踪demo(KCF,python version)


​https://www.jianshu.com/p/be16847b0b74​


pybind11—opencv图像处理(numpy数据交换)


【重要】 ​​https://www.jianshu.com/p/fb151f2e5b5e​


pybind11—C++ STL


【重要】 ​​https://www.jianshu.com/p/e2a48213e241​


pybind11—函数,返回值,数据转换


【重要】 ​​https://www.jianshu.com/p/5918fa66b101​


pybind11—类(继承,重载,枚举)


【重要】​​https://www.jianshu.com/p/9619f8f02891​


pybind11使用


​https://www.jianshu.com/p/fcded412d0bb​


 


 pybind11—类,结构体


【重要】 ​​https://zhuanlan.zhihu.com/p/93299698​


191123 使用 Pybind11 和 OpenCV 创建 Python 库


 

 


 

标签:gray,pybind11,--,c++,Python,https,include,com
From: https://blog.51cto.com/jsxyhelu2017/5971121

相关文章

  • 记录一次关于OpenCV的CmakeLists的探索
        编写基于OpenCV的图像处理程序,其中很重要的一道门槛就是编译OpenCV,应该说如果你对其中的内容如果不是很熟悉的话,即使是最简单粗暴的“两次configure,一次gene......
  • 在layerModelBlending的PR过程中出现的问题和解决方法
    一、情况说明layerModelBlending是属于photo模块下的算法,我很大程度上参考seamlessclone进行实现。这是我第一次编写功能模块,不同于之前的教程或者是某些参数的修改。......
  • 8.多线程
    一、基本概念:程序、进程、线程程序(program)是为完成特定任务、用某种语言编写的一组指令的集合。即指一段静态的代码,静态对象。进程(process)是程序的一次执行过程,或是正......
  • 教你如何使用语雀提高效率
    目录​​前言​​​​我什么时候使用的语雀?​​​​语雀是什么?​​​​语雀产生的背景?​​​​我分享语雀的理由有哪些呢?​​​​1、产品定位:知识库​​​​①、语雀使用了......
  • 禅道api调用(爬虫方式)
    目录​​获取所有进行中的项目信息​​​​url​​​​postman​​​​Java代码​​​​实体类​​​​逻辑处理​​​​根据项目id获取指定项目下所有未关闭的任务id​​​......
  • Camera 画质调试,学习资料分享
    “  最近有很多小伙伴私信我有没有 Camera 相关的学习资料,所以这里总结了一下,我目前看到及学习过的觉得比较优质的资料,大家可以收藏学习起来。注意下文章中的链接无法直......
  • 新概念英语一册语法总结
    目录​​1、简单句的句型结构:​​​​   1-1、简单句​​​​   1-2、句子组织的5步骤:​​​​2、否定句:​​​​3、倒装句(就近原则):​​​​4、一般疑问句:​​​​5......
  • 安卓逆向 -- Fiddler抓包
     一、Fiddler下载1、下载地址:公众号后台回复20210726获取中文版​​https://www.telerik.com/download/fiddler​​2、安装方式一路下一步:二、Fiddler设置1、点击工具,选......
  • 安卓逆向 -- APK文件结构
    apk文件其实就是一个压缩文件,解压后包含下面内容1、assets资源文件(图片、音频、数据库、网页、配置文件等),没有编译过,拿出来直接可以用2、res资源文件,需要编译才能看(布......
  • 安卓逆向 -- AndroidKiller介绍
    别在别人心中修行自己别在自己心中强求别人。。。                                      ......