C++调用tensorflow(ptyhon)

#include <Python.h>
#include <iostream>
#include <windows.h>
#include "opencv2/opencv.hpp"
#include "numpy/core/include/numpy/arrayobject.h"
#include <fstream>

using namespace std;
using namespace cv;


int main()
{
  //python环境初始化
  Py_SetPythonHome(L"C:\\ProgramData\\Anaconda3\\envs\\tf110_py27\\");

  Py_Initialize();
  if (!Py_IsInitialized())
    return -1;

  // 导入python脚本
  PyObject *pyModule = PyImport_ImportModule("PSEDetect");
  if (!pyModule)
  {
    cout << "cannot open module!";
    Py_Finalize();
    return -1;
  }

  //获取python模块中的类名并创建对象实例
  PyObject *pyClass = PyObject_GetAttrString(pyModule, "PSEDetect");
  PyObject *pyClassInstance = PyObject_CallObject(pyClass, NULL);

  //获取Python模块中相应的函数名
  PyObject *pyFunc = PyObject_GetAttrString(pyClass, "execute");

  //设置发送给Python函数的参数对象
  PyObject *pyArgs = PyTuple_New(3);

  Mat img = imread("d:/4444/idx_282.jpg_0_0.jpg");

  auto sz = img.size();
  int x = sz.width;
  int y = sz.height;
  int z = img.channels();
  uchar *CArrays = new uchar[x* y * z];
  int iChannels = img.channels();
  int iRows = img.rows;
  int iCols = img.cols * iChannels;

  uchar* p;
  int id = -1;
  for (int i = 0; i < iRows; i++)
  {
    // get the pointer to the ith row
    p = img.ptr<uchar>(i);
    // operates on each pixel
    for (int j = 0; j < iCols; j++)
    {
      CArrays[++id] = p[j];//连续空间
    }
  }

  //必须添加如下函数,否则无法执行PyArray_SimpleNewFromData
  import_array();

  npy_intp Dims[3] = { y, x, z }; //注意这个维度数据!
  PyObject *PyArray = PyArray_SimpleNewFromData(3, Dims, NPY_UBYTE, (void*)CArrays);

  //设置调用函数的self值为前面该类创建的实例,否则无法使用self变量进行调用而出错
  PyTuple_SetItem(pyArgs, 0, Py_BuildValue("O", pyClassInstance));

  //设置变量的第二个参数值为byte类型的数组作为图片数据
  PyTuple_SetItem(pyArgs, 1, PyArray);

  PyTuple_SetItem(pyArgs, 2, Py_BuildValue("s", "test"));

  //调用python函数进行识别任务并返回相应的结果
  PyObject *pyResult = PyObject_CallObject(pyFunc, pyArgs);


  if (pyResult)
  {
    //将结果类型转换成数组对象类型
    PyArrayObject *pyResultArr = (PyArrayObject *)pyResult;

    //从Python中的PyArrayObject解析出数组数据为c的double类型。
    float  *resDataArr = (float *)PyArray_DATA(pyResultArr);
    int dimNum = PyArray_NDIM(pyResultArr);//返回数组的维度数
    npy_intp *pdim = PyArray_DIMS(pyResultArr);//返回数组各维度上的元素个数值
    cout << "pdim:" << dimNum << "," <<pdim[0] << endl;

    //以下是对返回结果的输出显示
    int cnt = 0;
    for (int i = 0; i <= dimNum; ++i)
    {
      for (int j = 0; j < pdim[0]; ++j)
      {
        cout << setiosflags(ios::fixed) << resDataArr[i * pdim[0] + j] << ",  ";
        cnt++;
      }
    }
    cout << endl;
  }

  Py_Finalize();

  getchar();
  return 0;
}

 

 

https://www.jianshu.com/p/c9f5f4ce3e7a?utm_campaign=maleskine

https://www.e-learn.cn/content/wangluowenzhang/167550

https://blog.csdn.net/qq_29592829/article/details/88925530

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值