#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