Ubuntu下QtCreator的C++工程调用python

目录

  • 1 概述
    • 1.1 参考
    • 1.2 库引用
    • 1.3 初始与善后
  • 2 函数调用
  • 3 类调用
  • 4 参数传递
    • 4.1 传递数值类型
    • 4.2 传递字符串
    • 4.3 传递bool
    • 4.4传递图片
  • 5 解析放回的参数
    • 5.1 调用方法
    • 5.2 数值解析
    • 5.3 字符串解析
    • 5.4 bool值解析
    • 5.5 复合类型解析

1 概述

1.1 参考

这里有几个参考的:
1) 这个。
比较全面的,详细的介绍了下情况。

2)这个,很有用演示了c++调用python的各种参数转换例子,包括字符串,数值,数组,,list等转换方法

3)这个,介绍了一些py接口的函数。

3)这个;
这个2。
可以看,但是不是特别有信息量。

4)官方介绍:https://docs.python.org/3.9/extending/index.html

1.2 库引用

python自己封装了一个库,需要引用这个库。做一些头文件和库的配置。
网上的介绍比较多。这里有一个Ubuntu下的一个库的设置。如下:其他的情况自己搜索一下吧。

1.3 初始与善后

c++调用接口可以访问函数、类、参数等,全部封装成了一个pyobject类,用完这个需要清除,清除的方法为:

2 函数调用

函数调用有两种方法:

3 类调用

类调用,2】中有介绍,这里给一个例子。如下:

4 参数传递

4.1 传递数值类型

很多地方都介绍到了。见1】的介绍。
简单点说,数值通过BuildValue来生成。

4.2 传递字符串

4.3 传递bool

c++下的int和bool变量/值都可以传给python,转换为bool数值。
其中,如果是int的转换规则为:0转换为False。其他都转换为True;bool则直接转。
给个例子:
注意:本例子使用了另外一个调用函数的方式。

#文件 Test.py,路径:./home/kv

def TestBool( isTest):
    if isTest:
        print("True")
    else:
        print("False")
int main()
{
    Py_Initialize();
    if (!Py_IsInitialized())
    {
        cout << "初始化失败" << endl;
    }

    PyRun_SimpleString("import sys");
    PyRun_SimpleString("sys.path.append('./home/kv')");

    PyObject* pModel = nullptr;
    pModel = PyImport_ImportModule("Test");

    // 调用func
    PyObject_CallMethod(pModel, "TestBool","i",1); //True

    // 调用func
    PyObject_CallMethod(pModel, "TestBool","i",0);  //False

    PyObject_CallMethod(pModel, "TestBool","i",-1); //True

    bool isTest = true;
    PyObject_CallMethod(pModel, "TestBool","i",isTest); //True

    isTest = false;
    PyObject_CallMethod(pModel, "TestBool","i",isTest); //False


    Py_DecRef(pDict);
    Py_DecRef(pModel);

    Py_Finalize();
    return 0;
}

4.4传递图片

Mat的方法参见:这里

本人的一个例子,如下:
其中调用的文件为ImgHandle.py,路径为:/home/…/calledPythonFilePath

#include 
#include 
#include 
#include 
#include 

using namespace cv;

//将Mat封装为直接可以传的参数,不许在封装了!
PyObject *cvmat2py(cv::Mat &image)
{
    import_array();
    int row, col;
    col = image.cols; //列宽
    row = image.rows; //行高
    int channel = image.channels();
    int irow = row, icol = col * channel;
    npy_intp Dims[3] = {row, col, channel}; //图像维度信息
    PyObject *pyArray = PyArray_SimpleNewFromData(channel, Dims, NPY_UBYTE, image.data);
    PyObject *ArgArray = PyTuple_New(1);
    PyTuple_SetItem(ArgArray, 0, pyArray);
    return ArgArray;
}

//下面函数调用封装了调用python函数的过程
void Py_ShowImg(cv::Mat &image){
    Py_Initialize();//对python进行初始化,无返回值。使用py_IsInitialized检查系统是否初始化成功。
    PyRun_SimpleString("import sys");//sys模块包含了与Python解释器和它的环境有关的函数。
    PyRun_SimpleString("sys.path.append('/home/.../calledPythonFilePath')");

    PyObject * pModule = NULL;//声明变量
    pModule =PyImport_ImportModule("ImgHandle");//这里是要调用的文件名ImgHandle.py

    PyObject* pArgs = cvmat2py(image);
    PyObject * pFunc = PyObject_GetAttrString(pModule, "showImg");//这里是要调用的函数名showImg,该函数一个参数为Mat,返回int。
    auto *py_result = PyEval_CallObject(pFunc, pArgs);//调用函数

    int c_result;
    // 将python类型的返回值转换为C类型
    PyArg_Parse(py_result, "i", &c_result);

    std::cout << "return: " << c_result << std::endl;
    
	Py_Finalize();// 关闭Python
}

5 解析放回的参数

5.1 调用方法

这里有说明。
使用 PyArg_ParseTuple()方法。里面有转换的介绍。

5.2 数值解析

5.3 字符串解析

5.4 bool值解析

5.5 复合类型解析

你可能感兴趣的:(C++,Opencv,python,python,ubuntu,c++)