如何基于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实现逆波兰计算表达式实例详解
May 06 Python
python文件的md5加密方法
Apr 06 Python
python django 访问静态文件出现404或500错误
Jan 20 Python
Python 中开发pattern的string模板(template) 实例详解
Apr 01 Python
神经网络(BP)算法Python实现及应用
Apr 16 Python
django静态文件加载的方法
May 20 Python
Python运维自动化之nginx配置文件对比操作示例
Aug 29 Python
Django 实现外键去除自动添加的后缀‘_id’
Nov 15 Python
Keras在训练期间可视化训练误差和测试误差实例
Jun 16 Python
Selenium 安装和简单使用的实现
Dec 04 Python
python scrapy简单模拟登录的代码分析
Jul 21 Python
Python 统计序列中元素的出现频度
Apr 26 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
PHP输出两个数字中间有多少个回文数的方法
2015/03/23 PHP
yii添删改查实例
2015/11/16 PHP
php简单截取字符串代码示例
2016/10/19 PHP
php实现构建排除当前元素的乘积数组方法
2018/10/06 PHP
php实现微信公众号创建自定义菜单功能的实例代码
2019/06/11 PHP
document.all的一个比较完整的总结及案例
2013/01/31 Javascript
javascript操作excel生成报表全攻略
2014/05/04 Javascript
举例简介AngularJS的内部语言环境
2015/06/17 Javascript
Vue.js每天必学之指令系统与自定义指令
2016/09/07 Javascript
基于AngularJS前端云组件最佳实践
2016/10/20 Javascript
jQuery中 $ 符号的冲突问题及解决方案
2016/11/04 Javascript
AngularJS打开页面隐藏显示表达式用法示例
2016/12/25 Javascript
vue-cli配置文件——config篇
2018/01/04 Javascript
解决Vue.js 2.0 有时双向绑定img src属性失败的问题
2018/03/14 Javascript
浅析Vue实例以及生命周期
2018/08/14 Javascript
微信小程序 image组件遇到的问题
2019/05/28 Javascript
vue使用websocket的方法实例分析
2019/06/22 Javascript
详解Vue 项目中的几个实用组件(ts)
2019/10/29 Javascript
python发送arp欺骗攻击代码分析
2014/01/16 Python
Python深入06——python的内存管理详解
2016/12/07 Python
Python实现将MySQL数据库表中的数据导出生成csv格式文件的方法
2018/01/11 Python
python实现手机通讯录搜索功能
2018/02/22 Python
python检测主机的连通性并记录到文件的实例
2018/06/21 Python
Python计算时间间隔(精确到微妙)的代码实例
2019/02/26 Python
python粘包问题及socket套接字编程详解
2019/06/29 Python
python 自定义装饰器实例详解
2019/07/20 Python
Numpy的简单用法小结
2019/08/28 Python
Python web框架(django,flask)实现mysql数据库读写分离的示例
2020/11/18 Python
python 进制转换 int、bin、oct、hex的原理
2021/01/13 Python
利用CSS3实现毛玻璃效果示例源码
2016/09/25 HTML / CSS
世界上最大的冷却器制造商:Igloo Coolers
2019/07/23 全球购物
橄榄树药房:OLIVEDA
2019/09/01 全球购物
汽车专业学生自我评价
2014/01/19 职场文书
《学会合作》教学反思
2014/04/12 职场文书
2015年社区流动人口工作总结
2015/05/12 职场文书
2016新年问候语大全
2015/11/11 职场文书