如何基于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 26 Python
python基于pygame实现响应游戏中事件的方法(附源码)
Nov 11 Python
在windows系统中实现python3安装lxml
Mar 23 Python
python实现求解列表中元素的排列和组合问题
Mar 15 Python
pytorch + visdom CNN处理自建图片数据集的方法
Jun 04 Python
解决python中无法自动补全代码的问题
Dec 04 Python
Python实现计算字符串中出现次数最多的字符示例
Jan 21 Python
python selenium执行所有测试用例并生成报告的方法
Feb 13 Python
Django项目中添加ldap登陆认证功能的实现
Apr 04 Python
详解Python list和numpy array的存储和读取方法
Nov 06 Python
Python通过Pillow实现图片对比
Apr 29 Python
python使用pymysql模块操作MySQL
Jun 16 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
基于HTTP长连接的"服务器推"技术的php 简易聊天室
2009/10/31 PHP
PHP开发者常犯的10个MySQL错误更正剖析
2012/01/30 PHP
php中的注释、变量、数组、常量、函数应用介绍
2012/11/16 PHP
php生成EAN_13标准条形码实例
2013/11/13 PHP
PHP中的self关键字详解
2019/06/23 PHP
js自带函数备忘 数组
2006/12/29 Javascript
js每次Title显示不同的名言
2008/09/25 Javascript
toggle一个div显示或隐藏且可扩展成自定义下拉框
2013/09/12 Javascript
深入理解javascript动态插入技术
2013/11/12 Javascript
兼容所有浏览器的js复制插件Zero使用介绍
2014/03/19 Javascript
checkbox勾选判断代码分析
2014/06/11 Javascript
js实现仿微博滚动显示信息的效果
2015/12/21 Javascript
原生 JS Ajax,GET和POST 请求实例代码
2016/06/08 Javascript
Vue.js自定义指令的用法与实例解析
2017/01/18 Javascript
详解webpack和webpack-simple中如何引入css文件
2017/06/28 Javascript
node跨域请求方法小结
2017/08/25 Javascript
使用cookie绕过验证码登录的实现代码
2017/10/12 Javascript
vue使用better-scroll实现下拉刷新、上拉加载
2018/11/23 Javascript
微信小程序按钮点击跳转页面详解
2019/05/06 Javascript
koa2的中间件功能及应用示例
2020/03/05 Javascript
[02:32]DOTA2亚洲邀请赛 VG战队巡礼
2015/02/03 DOTA
python模拟登陆阿里妈妈生成商品推广链接
2014/04/03 Python
python实现简单聊天应用 python群聊和点对点均实现
2017/09/14 Python
Python爬虫获取图片并下载保存至本地的实例
2018/06/01 Python
使用python将大量数据导出到Excel中的小技巧分享
2018/06/14 Python
TensorFlow 模型载入方法汇总(小结)
2018/06/19 Python
Python数据可视化库seaborn的使用总结
2019/01/15 Python
详解Python爬取并下载《电影天堂》3千多部电影
2019/04/26 Python
解决使用Pandas 读取超过65536行的Excel文件问题
2020/11/10 Python
Abe’s of Maine:自1979以来销售相机和电子产品
2016/11/21 全球购物
保险经纪人求职信
2014/03/11 职场文书
出纳试用期自我鉴定范文
2014/09/16 职场文书
生产工厂门卫岗位职责
2014/09/26 职场文书
公司授权委托书
2014/10/17 职场文书
2015年小学语文教师工作总结
2015/10/23 职场文书
2016年第32个教师节红领巾广播稿
2015/12/18 职场文书