刚开始拿到这个任务当然是想直接将python打包成dll给c#调用,然后开始搜索各种将Python打包成dll的资料,搜到了pyinstaller等等,发现最多能打包成exe,打包成dll需要将这个python解释器给干进去,这方面资料也比较少。
开始考虑直接用C#调用python。看到了ironpython,坑爹的是里面嵌入的是2.7版本,而我是用python3.5利用了tensorflow搭建的神经网络。tensorflow支持的最低版本是3.5。遂弃之。
最后考虑用C++先调python,然后将此c++封装成dll,再给c#使用。按照这个思路开始,c++调用python的资料不胜枚举,在此感谢各位无私分享的人们。c#调x64版的python3.5大致步骤如下:
(1)配置环境,主要是三个地方,如下三图所示


![这里写入上面那个libs文件下的对应的pythonxx.lib的名字(例如我的就是python35.lib)]

( 2 ) 直接安照套路来编写c++主函数

include “stdafx.h”

include

include

include

using namespace std;

int mian(int argc ,char *argv[])
{

// 初始化Python
//在使用Python系统前,必须使用Py_Initialize对其
//进行初始化。它会载入Python的内建模块并添加系统路
//径到模块搜索路径中。这个函数没有返回值,检查系统
//是否初始化成功需要使用Py_IsInitialized。
Py_Initialize();// 检查初始化是否成功
if (!Py_IsInitialized()) {cout << "Initialized failed !" << endl;return -1;
}
// 添加当前路径
//把输入的字符串作为Python代码直接运行,返回0
//表示成功,-1表示有错。大多时候错误都是因为字符串
//中有语法错误。
PyRun_SimpleString("import sys"); //PyRun_SimpleString这个语句可以直接执行fu
PyRun_SimpleString("print ('---import sys---')");
PyRun_SimpleString("sys.path.append('./')");
//PyRun_SimpleString("print(sys.path)");
PyObject *pName = NULL, *pModule = NULL, *pDict = NULL, *pFunc = NULL,    *pArgs = NULL;// 载入名为Screen-classifier的python脚本
printf("Finding python file Screen-classifier......\n");
pName = PyUnicode_FromString("Screen-classifier");
pModule = PyImport_Import(pName);
if (!pModule) {printf("can't find python file");getchar();//return -1;}
pDict = PyModule_GetDict(pModule);
if (!pDict) {//return -1;cout << "Get functions failed !" << endl;
}找出函数名为ScreenDetectDefect的函数
printf("Finding detect function......\n");
pFunc = PyDict_GetItemString(pDict, "ScreenDetectDefect");
if (!pFunc || !PyCallable_Check(pFunc)) {printf("can't find function ScreenDetectDefect");getchar();//return -1;
}// 参数进栈
*pArgs;
pArgs = PyTuple_New(3);//  PyObject* Py_BuildValue(char *format, ...)
//  把C++的变量转换成一个Python对象。当需要从
//  C++传递变量到Python时,就会使用这个函数。此函数
//  有点类似C的printf,但格式不同。常用的格式有
//  s 表示字符串,
//  i 表示整型变量,
//  f 表示浮点数,
//  O 表示一个Python对象。  PyTuple_SetItem(pArgs, 0, Py_BuildValue("i", mode));
cout << "AA" << endl;
string path="D:\VC++Program\Csharpcalldll\Csharpcalldll\bin\Debug"
//注意,下面构建python的字符串类型值的时候,不可直接传入c++ string 类的对象,需要使用string类的函数c_str将其转化为真正的string传进去才行。
PyTuple_SetItem(pArgs, 1, Py_BuildValue("s", path_s.c_str()));
cout << "BB" << endl;
PyTuple_SetItem(pArgs, 2, Py_BuildValue("i", imid));// 调用Python函数
PyObject_CallObject(pFunc, pArgs);//关闭Python
Py_Finalize();

}

(3)上述程序调试成功之后,将其改为函数形式,并将其打包成dll,主要步骤如下:
1.新建项目,选择c++下面的windows桌面向导,如下

点击确定,然后选择dll,以及空项目和预编译头,如下:

建好之后,将第二步代码整体考进去,把main主函数改成自己想要改成的函数名字以便后续调用。比如我就改成了screendetect(int mode,char*path,int imid)。有一种情况肯出错,就是通过此种方式新建的工程下,源文件中因为#include “stdafx.h”这个语句会导致保持,此刻不要惊慌,按照如下补救措施:

2.生成即可。成功了会有如下的输出:

刚开始可能有种情况就是只会有dll生成,此时应该配置按照如下方式使其能够生成.lib文件。首先新建一个def文件(直接新建c++文件,然后将其后缀改成def即可)然后里面写入如下如所示内容,前两行不动,第三行上一步中将主函数改成 的那个函数(也即打包成dll后需要被调用的那个/那些函数),如我的就是sceendetect。

然后在项目属性的链接器的输入一栏中模拟定义块的地方写入刚才新建的def文件的名字。如下所示:

然后点击生成-》重新生成解决方案,即可得到dll和lib文件。
(4)用c#调用生成好的dll文件
很简单,按照下面模板即可:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;
using System.Threading.Tasks;

namespace CsharpcCallDll
{
class Program
{
//下面加粗地方换成上面所生成的dll所在目录。
[DllImport(@“D:\VC++Program\DllTestScreenTest\x64\Debug\DllTestScreenTest.dll”)]
//此处声明你即将调用的函数
extern static int screendetect(int mode,string path, int imid);
static void Main(string[] args)
{
screendetect(1, “D:\ZZFinallyTest\Picture\”, 49);
}
}
}
结束。

# C#调用已经使用Python训练好的神经网络做图片检测相关推荐

  1. OpenCvSharp (C# OpenCV) DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别、骰子识别、菜品识别)(附源码)

    本文作者Color Space,文章未经作者允许禁止转载! 本文将介绍OpenCVSharp DNN模块加载自己训练的TensorFlow模型做目标检测(含手势识别.骰子识别.菜品识别)! 前言: 下 ...

  2. 使用Python中的卷积神经网络进行恶意软件检测

    导言 在这篇文章中,我们将学习人工网络架构以及如何使用其中一个(卷积神经网络)来帮助恶意软件分析师和信息安全专业人员检测和分类恶意代码. 恶意软件是每个现代组织的噩梦.攻击者和网络犯罪分子总是想出新的 ...

  3. Python+OpenCV边学边做-机器视觉检测之贝类含砂量X射线影像

    内容索引 项目说明 背景 建立工程 图像处理 干扰性文字移除 项目说明 此项目在GitHub上开源,点击跳转至GitHub.如转载,请标明转载并写入原文链接. 项目中关于python+opencv的知 ...

  4. python中利用opencv简单做图片比对

    python环境中,利用opencv对二值单通道图片进行比对 下面代码中利用了两种比对的方法,一 对图片矩阵(m x m)求解特征值,通过比较特征值是否在一定的范围内,判断图片是否相同.二 对图片矩阵 ...

  5. 用C++调用tensorflow在python下训练好的模型(centos7)

    本文主要参考博客https://blog.csdn.net/luoyexuge/article/details/80399265 [1]  bazel安装参考:https://blog.csdn.ne ...

  6. python怎么导入数据集keras_keras使用Sequence类调用大规模数据集进行训练的实现

    使用Keras如果要使用大规模数据集对网络进行训练,就没办法先加载进内存再从内存直接传到显存了,除了使用Sequence类以外,还可以使用迭代器去生成数据,但迭代器无法在fit_generation里 ...

  7. VS2015+OpenCV3.4.5+QT5.12+WINDOWS10用c++调用tensorflow训练好的.pb文件图像检测

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_31806049/article/ ...

  8. python训练好的图片验证_Python图片验证码降噪处理实例

    图片验证码算是网络数据采集上的一道拦路虎,虽然有诸多公开的ORC接口.云打码平台,一旦大规模应用起来,还是内部写程序进行识别处理比较好. 而自己写代码进行识别的话,又有很多种方案,比如最近火热的神经网 ...

  9. centOS6.5中部署java调用h2o中python包环境

    centOS6.5中部署java调用h2o中python包环境 升级centOS6.5中的python版本 6.5版本中自带了python2.6.6的环境,但对于使用h2o版本过低,建议升级至3.6或 ...

最新文章

  1. UVA 216 Getting in Line
  2. linux5.5内核,一条命令就可以升级到Linux 5.5内核或Linux 5.5以上版本
  3. 代码审计之Catfish CMS v4.5.7后台作者权限越权两枚+存储型XSS一枚
  4. 如何隐藏storyboard中的top bar
  5. Hbase的shell出现wrong number of arguments xxx以及undefined method any?for xxxx
  6. VBS基础篇 - 常量
  7. cocostuff10k数据集介绍_(六)COCO数据集的简单介绍
  8. vs已经引用mysql还是不能用_VS2013与MySql建立连接;您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧[转载]...
  9. 家卫士扫地机器人好吗_扫地机器人哪个牌子好?市场最全智能扫地机器人品牌解析_扫地机器人...
  10. css设置子盒子水平垂直居中(四种方式)
  11. oracle 时间戳
  12. GD32MCU硬件I2C学习(一)
  13. 项目配置urule规则引擎教程详解(带视频资源)
  14. matlab矩阵左右翻转例子
  15. CBI 图解机器人创业公司投资热点
  16. 循环神经网络RNN论文解读
  17. 第三节 数据通信基础
  18. SSH 登录报错 Permission denied 或 VNC 登录报错 Hint:Caps Lock on
  19. 清华梦的粉碎——写给清华大学的退学申请by王垠
  20. micros swarm framework相关

热门文章

  1. 视频直播中的心形漂浮效果
  2. 对北京大学红旗在线的一次友情检测
  3. 磨金石教育是正规的吗?插画好学吗?学习插画有哪些小技巧?
  4. C++ Primer Plus P31 编程练习(调用一个用户自定义的函数(以光年值为参数,并返回对应天文单位的值)——中职
  5. Openlayers记录(七)利用ol3进行缓冲区的空间相交分析
  6. css3制作手风琴,CSS3制作手风琴——CSS3 :target的应用
  7. [附源码]Python计算机毕业设计电影票购票系统
  8. 我的世界中国版服务器账号封了,Hypixel中国版服务器停止运营公告
  9. 小猿圈IT自学分享-自学编程需要克服的困难
  10. Cairo学习(一)