如何基于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函数中*args和**kwargs来传递变长参数的用法
Jan 26 Python
python strip() 函数和 split() 函数的详解及实例
Feb 03 Python
详解解决Python memory error的问题(四种解决方案)
Aug 08 Python
Python 中的 global 标识对变量作用域的影响
Aug 12 Python
在python3中实现更新界面
Feb 21 Python
Pytorch转onnx、torchscript方式
May 25 Python
python:HDF和CSV存储优劣对比分析
Jun 08 Python
keras model.fit 解决validation_spilt=num 的问题
Jun 19 Python
Python request post上传文件常见要点
Nov 20 Python
python中pickle模块浅析
Dec 29 Python
Python  Asyncio模块实现的生产消费者模型的方法
Mar 01 Python
Python四款GUI图形界面库介绍
Jun 05 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
类的另类用法--数据的封装
2006/10/09 PHP
粗略计算在线时间,bug:ip相同
2006/12/09 PHP
php高级编程-函数-郑阿奇
2011/07/04 PHP
php array_push()数组函数:将一个或多个单元压入数组的末尾(入栈)
2011/07/12 PHP
PHP多个版本的分析解释
2011/07/21 PHP
PHP获取浏览器信息类和客户端地理位置的2个方法
2014/04/24 PHP
PHP实现的一致性Hash算法详解【分布式算法】
2018/03/31 PHP
PHP实现的装箱算法示例
2018/06/23 PHP
TP(thinkPHP)框架多层控制器和多级控制器的使用示例
2018/06/13 PHP
Web层改进II-用xmlhttp 无声息提交复杂表单
2007/01/22 Javascript
jQuery+CSS 实现的超Sexy下拉菜单
2010/01/17 Javascript
jQuery DOM插入节点操作指南
2015/03/03 Javascript
在Ubuntu系统上安装Ghost博客平台的教程
2015/06/17 Javascript
利用原生JS自动生成文章标题树的实例
2016/08/22 Javascript
JS封装的选项卡TAB切换效果示例
2016/09/20 Javascript
带你快速理解javascript中的事件模型
2017/08/14 Javascript
angular4中关于表单的校验示例
2017/10/16 Javascript
JavaScript执行环境及作用域链实例分析
2018/08/01 Javascript
JS中DOM元素的attribute与property属性示例详解
2018/09/04 Javascript
jQuery操作元素的内容和样式完整实例分析
2020/01/10 jQuery
vue cli3.0打包上线静态资源找不到路径的解决操作
2020/08/03 Javascript
Linux环境下MySQL-python安装过程分享
2015/02/02 Python
python编程实现随机生成多个椭圆实例代码
2018/01/03 Python
Python定时发送消息的脚本:每天跟你女朋友说晚安
2018/10/21 Python
使用Python实现跳帧截取视频帧
2019/05/31 Python
python实现网站用户名密码自动登录功能
2019/08/09 Python
Python变量、数据类型、数据类型转换相关函数用法实例详解
2020/01/09 Python
CSS3,线性渐变(linear-gradient)的使用总结
2017/01/09 HTML / CSS
销售演讲稿范文
2014/01/08 职场文书
应届毕业生自荐信
2014/05/28 职场文书
2014单位领导班子四风对照检查材料思想汇报
2014/09/25 职场文书
招标保密承诺书
2015/01/20 职场文书
广告业务员岗位职责
2015/02/13 职场文书
公司老总年会致辞
2015/07/30 职场文书
2016母亲节感恩话语
2015/12/09 职场文书
vue项目配置sass及引入外部scss文件
2022/04/14 Vue.js