如何基于pythonnet调用halcon脚本


Posted in Python onJanuary 20, 2020

这篇文章主要介绍了如何基于pythonnet调用halcon脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

最近的项目中遇到了使用python程序结合不同部分,其中包括使用halcon处理拍摄到的图像。

halcon本身提供了c++与.NET的开发库,但无python库,网上有pyhalcon之类的库,但功能与原版并不一致。

这片文章默认大家已经有halcon.NET的开发基础了,也会使用HDevEngine调用halcon脚本。这样的话自己看一下pythonnet的说明也能会哈。主要网上没人写过,我综合总结一下。而且最后一段才是重点,不同平台的数据类型变化。

1.pythonnet简介

- pythonnet是cpython的扩展
- pythonnet提供了cpython和.net程序集之间交互的桥梁
- pythonnet开源在github上

- 通过`pip install pythonnet`安装

- pythonnet的使用帮助,请参见github.

ref类型的参数如何返回

- 返回值的第一个元素是c#的返回值
- 返回值的第二个元素就是ref的值了,ref String[] 对应的返回值第二个元素就是元组tuple

2.如何使用pythonnet调用halcon函数

import clr # 导入pythonnet
import sys
import System # 导入.NET系统库
from System import String, Char, Int32, Environment, IntPtr #导入.NET变量。

这一步所有.NET库的导入IDE编辑器都会提示找不到引用,但是只要名称对,就能DEBUG和运行。

如何基于pythonnet调用halcon脚本

# 导入halcon支持库
d = clr.AddReference("source/halcondotnet")
print(d)# 打印库的信息,包括你的halcon版本
# 导入halcon脚本引擎库
d = clr.AddReference("source/hdevenginedotnet")
from HalconDotNet import *
定义使用HDevEngine来调用halcon脚本是最方便的在python中。
class HdevEnginePy:
  # halcon过程变量,也就是函数。
  Procedure = HDevProcedure()

 # halcon程序变量,就是halcon脚本文件
  Program = HDevProgram()
  
  ourProcedure = "hdev/procedures" # 我们自己写的函数脚本目录

  def __init__(self):
    # 声明halcon的HDev引擎。
    self.MyEngine = HDevEngine()
    self.MyEngine.SetProcedurePath(self.ourProcedure)
# 添加我们的脚本目录
    return

  def get_proc_names(self):
    procedure_name = self.MyEngine.GetProcedureNames()
# 获取并打印我们所有加载的函数名,可用于检查
    return procedure_name

  def load_proc(self):
    try:
      # 加载自定义函数,打印输入变量名称
      self.Procedure = HDevProcedure("函数名")
      print("加载脚本函数 成功!")
      self.ProcCall = HDevProcedureCall(self.Procedure)
# 可执行函数对象
      ctrlNames = self.Procedure.GetInputCtrlParamNames()
      print("-输入控制变量:", ctrlNames)
      iconNames = self.Procedure.GetInputIconicParamNames()
      print("-输入图像变量:", iconNames)
    except:
      print("加载halcon函数脚本出错。")
      self.ProcCall.Dispose()
    return

  def excute_proc(self):
    # 测试用。
    try:
      image = HImage()
# 声明halcon的Himage变量
      image.ReadImage("images/apple.bmp")
# 加载图像
      self.ProcCall.SetInputIconicParamObject("image", image)
# 传入图像参数
      thmin = HTuple(128)
      thmax = HTuple(255)
      self.ProcCall.SetInputCtrlParamTuple("thmin", thmin)
# 传入控制变量参数
      self.ProcCall.SetInputCtrlParamTuple("thmax", thmax)
      self.ProcCall.Execute()
# 执行函数
      FinArea = self.ProcCall.GetOutputCtrlParamTuple("maxArea")
# 取得返回变量。
      print(FinArea)
    except:
      print("执行脚本异常")
    finally:
      self.ProcCall.Dispose()
      exit()
    return

3.如何把ptyhon图像格式转化为HImage

python中的图像格式我使用ndarry,是不能直接作为参数传入halcon函数的,会报错。需要先转为HImage对象。

正确的转换效果

如何基于pythonnet调用halcon脚本

测试用原图,发现 没加偏移量的转换结果。

如何基于pythonnet调用halcon脚本

def converttoHImage(ndArray):
  # 把ndArray格式的图像转换成HImage,这是实验下来最兼具速度和内存使用的方法。
  # 提取BGR各通道,注意python中ndArray的通道顺序不一样。
  imgB = ndArray[0:ndArray.shape[0], 0:ndArray.shape[1], 0]
  imgG = ndArray[0:ndArray.shape[0], 0:ndArray.shape[1], 1]
  imgR = ndArray[0:ndArray.shape[0], 0:ndArray.shape[1], 2]
  # 将BGR通道降维成一维数组
  imgBflat = imgB.flatten()
  imgGflat = imgG.flatten()
  imgRflat = imgR.flatten()
  # 生成字节数组内存地址,且有32个地址偏移。
  Bbuffer = bytes(imgBflat)
  Bptr = id(Bbuffer)
  intptrB = IntPtr.Overloads[int](Bptr + 32)

  Gbuffer = bytes(imgGflat)
  Gptr = id(Gbuffer)
  intptrG = IntPtr.Overloads[int](Gptr + 32)

  Rbuffer = bytes(imgRflat)
  Rptr = id(Rbuffer)
  intptrR = IntPtr.Overloads[int](Rptr + 32)

  imgSnap = HImage()
  # 将三个通道的内存地址传入
  imgSnap.GenImage3("byte", ndArray.shape[1], ndArray.shape[0], intptrR, intptrG, intptrB)
  return imgSnap

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 除法小技巧
Sep 06 Python
python3使用urllib示例取googletranslate(谷歌翻译)
Jan 23 Python
python安装以及IDE的配置教程
Apr 29 Python
python实现支付宝当面付(扫码支付)功能
May 30 Python
PyQt弹出式对话框的常用方法及标准按钮类型
Feb 27 Python
python函数与方法的区别总结
Jun 23 Python
Python实现socket非阻塞通讯功能示例
Nov 06 Python
python生成特定分布数的实例
Dec 05 Python
Python关于反射的实例代码分享
Feb 20 Python
解决Python logging模块无法正常输出日志的问题
Feb 21 Python
Python装饰器结合递归原理解析
Jul 02 Python
Python基础之元类详解
Apr 29 Python
使用TensorFlow对图像进行随机旋转的实现示例
Jan 20 #Python
TensorFLow 不同大小图片的TFrecords存取实例
Jan 20 #Python
python各层级目录下import方法代码实例
Jan 20 #Python
Python 识别12306图片验证码物品的实现示例
Jan 20 #Python
如何基于python实现归一化处理
Jan 20 #Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
Jan 20 #Python
tensorflow入门:TFRecordDataset变长数据的batch读取详解
Jan 20 #Python
You might like
Apache环境下PHP利用HTTP缓存协议原理解析及应用分析
2010/02/16 PHP
PHP设计模式 注册表模式(多个类的注册)
2012/02/05 PHP
PHP+MYSQL会员系统的开发实例教程
2014/08/23 PHP
Yii 快速,安全,专业的PHP框架
2014/09/03 PHP
php仿微信红包分配算法的实现方法
2016/05/13 PHP
CI框架表单验证实例详解
2016/11/21 PHP
PHP生成(支持多模板)二维码海报代码
2018/04/30 PHP
JavaScript Timer实现代码
2010/02/17 Javascript
js验证电话号码与手机支持+86的正则表达式
2014/01/23 Javascript
jquery选择器需要注意的问题
2014/11/26 Javascript
JavaScript创建闭包的两种方式的优劣与区别分析
2015/06/22 Javascript
详解JavaScript的策略模式编程
2015/06/24 Javascript
JavaScript中字符串拼接的基本方法
2015/07/07 Javascript
JavaScript实现仿新浪微博大厅和腾讯微博首页滚动特效源码
2015/09/15 Javascript
jQuery插件formValidator自定义函数扩展功能实例详解
2015/11/25 Javascript
html+js+highcharts绘制圆饼图表的简单实例
2016/08/04 Javascript
Nodejs搭建wss服务器教程
2017/05/24 NodeJs
JS 中可以提升幸福度的小技巧(可以识别更多另类写法)
2018/07/28 Javascript
Node批量爬取头条视频并保存方法
2018/09/20 Javascript
详解koa2学习中使用 async 、await、promise解决异步的问题
2018/11/13 Javascript
JavaScript数组排序小程序实现解析
2020/01/13 Javascript
[01:16:37]【全国守擂赛】第三周决赛 Dark Knight vs. 一个弱队
2020/05/04 DOTA
Python3 伪装浏览器的方法示例
2017/11/23 Python
python机器学习实战之最近邻kNN分类器
2017/12/20 Python
解决pandas无法在pycharm中使用plot()方法显示图像的问题
2018/05/24 Python
Python使用ctypes调用C/C++的方法
2019/01/29 Python
PIL包中Image模块的convert()函数的具体使用
2020/02/26 Python
python字典key不能是可以是啥类型
2020/08/04 Python
Python无损压缩图片的示例代码
2020/08/06 Python
python语音识别指南终极版(有这一篇足矣)
2020/09/09 Python
Python可视化工具如何实现动态图表
2020/10/23 Python
使用python实现学生信息管理系统
2021/02/25 Python
党的群众路线教育实践活动总结报告
2014/07/03 职场文书
教师师德表现自我评价
2015/03/05 职场文书
PHP实现考试倒计时功能代码
2021/04/16 PHP
基于Redis实现分布式锁的方法(lua脚本版)
2021/05/12 Redis