C++调用python,并且在python和C++之间传输数据(numpy和mat数据)

C++调用Python

在毕业设计中需要用到一个深度学习网络的已有算法,但是整个框架是用C++写的,所以需要用C++调用Python,整个过程持续了一周,难受~ 但也学到了不少,在这里记录一下!
文中可能会有一些错误,如果又发现的,麻烦留言,我及时更正,非常感谢!

官方文档

准备工作

环境搭建

  • 本机环境:
    • Ubuntu18.04
    • Anaconda
  • 虚拟环境:
    • Python 3.6
    • numpy 1.17

调用方法

包含头文件以及链接到库

#include<Python.h>
set(PYTHON_INCLUDE_DIRS "/home/jia/Software/anaconda3/envs/Test/include/python3.6m/")
INCLUDE_DIRECTORIES(${PYTHON_INCLUDE_DIRS})
link_directories(/home/jia/Software/anaconda3/envs/Test/lib/python3.6/config-3.6m-x86_64-linux-gnu)
set(PYTHON_LIBRARIES "/home/jia/Software/anaconda3/envs/Test/lib/libpython3.6m.so")
add_executable(test main.cpp)
target_link_libraries(test ${
   PYTHON_LIBRARIES

直接调用简单语句

#include "Python.h"

int main()
{
   
    Py_Initialize();    ## 初始化

    PyRun_SimpleString("print 'hello'");

    Py_Finalize();      ## 释放资源
}

简单函数调用

  • C++代码
#include <iostream>
#include <string>
#include <Python.h>
using namespace std;
int main()
{
   
    /*****************************************
	*  Python初始化及路径加载
	******************************************/
	cout << "---------------------初始化Python--------------------" << endl;
    Py_Initialize();    // 使用Python系统前,必须使用Py_Initialize对其进行初始化
    if ( !Py_IsInitialized() )  //检查初始化是否成功
    {
    
        return -1;
    }
	cout << "---------------------添加路径--------------------" << endl;
	 // PyRun_SimpleString:这个函数就是执行一条简单的python代码
    PyRun_SimpleString("import sys");
    PyRun_SimpleString("import os");
    //建议用os先获得绝对路径。再将路径加载到python中,不然路径设置的不一定对
    //我这里是获得了编译好的可执行文件的上一级路径,也就是工程根目录,这里只要能够讲python脚本的路径加载正确即可
    PyRun_SimpleString("sys.path.append(os.path.abspath(os.path.join(os.getcwd(), \"..\"))+'/python/')");
     //这里我将路径打印出来,可以查看python脚本的路径是否加载进去了,打印出来的路径有很多,仔细查看
    PyRun_SimpleString("print(sys.path)");

    /*****************************************
	*  Python脚本获取以及脚本内的函数获取
	******************************************/
	cout << "---------------------脚本获取--------------------" << endl;
    PyObject *pName,*pModule,*pDict,*pFunc,*pArgs;
    pName = PyUnicode_FromString("mypythonfile");  //python3中用这个
    pModule 
  • 14
    点赞
  • 103
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
Python调用C++函数并传递cv::Mat数据,可以使用OpenCV库将cv::Mat数据转换为C++中的Mat类型。下面是一个示例代码,展示了如何在Python调用一个接受cv::Mat数据C++函数: 假设我们有一个C++函数,它接受一个cv::Mat类型的图像数据: ```c++ #include <iostream> #include <opencv2/core.hpp> #include <opencv2/imgcodecs.hpp> void my_function(cv::Mat& image) { cv::imwrite("output.jpg", image); } ``` 现在,我们可以在Python使用OpenCV库来读取一张图像,并将其转换为cv::Mat类型的数据,然后将其传递给这个C++函数。下面是示例代码: ```python import cv2 import numpy as np import ctypes # 加载C++编译后的动态链接库 lib = ctypes.cdll.LoadLibrary('./libexample.so') # 定义函数参数类型 lib.my_function.argtypes = [ctypes.c_void_p] # 读取一张图像,并将其转换为cv::Mat类型的数据 image = cv2.imread('input.jpg') image_data = np.ascontiguousarray(image) image_data_ptr = image_data.ctypes.data_as(ctypes.c_void_p) # 将cv::Mat类型的数据传递给C++函数 lib.my_function(image_data_ptr) ``` 在上面的示例代码中,我们首先使用`cdll.LoadLibrary()`函数加载C++编译后的动态链接库。接着,我们使用`argtypes`属性定义了C++函数的参数类型,其中`ctypes.c_void_p`表示无类型指针。然后,我们使用OpenCV库读取一张图像,并使用`np.ascontiguousarray()`函数将图像数据转换为连续的内存块。最后,我们使用`ctypes.c_void_p`类型将图像数据的内存地址传递给C++函数`my_function()`。 需要注意的是,在传递cv::Mat数据时,需要确保图像数据是连续的。如果图像数据不是连续的,需要使用`np.ascontiguousarray()`函数将其转换为连续的内存块。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值