如何基于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中的ConfigParser模块使用详解
May 04 Python
Python实现批量下载文件
May 17 Python
python语言使用技巧分享
May 31 Python
python算法表示概念扫盲教程
Apr 13 Python
python中partial()基础用法说明
Dec 30 Python
python使用Plotly绘图工具绘制散点图、线形图
Apr 02 Python
python笔记之mean()函数实现求取均值的功能代码
Jul 05 Python
django中forms组件的使用与注意
Jul 08 Python
python数据预处理之数据标准化的几种处理方式
Jul 17 Python
python pyinstaller打包exe报错的解决方法
Nov 02 Python
python3实现用turtle模块画一棵随机樱花树
Nov 21 Python
Django分页器的用法你都了解吗
May 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 @ at 记号的作用示例介绍
2014/10/10 PHP
两个php日期控制类实例
2014/12/09 PHP
PHP程序中的文件锁、互斥锁、读写锁使用技巧解析
2016/03/21 PHP
yii2.0整合阿里云oss上传单个文件的示例
2017/09/19 PHP
实现连缀调用的map方法(prototype)
2009/08/05 Javascript
jquery 可拖拽的窗体控件实现代码
2010/03/21 Javascript
JQuery分别取得每行最后一列和最后一行的示例代码
2013/08/18 Javascript
JavaScript操作DOM元素的childNodes和children区别
2015/04/01 Javascript
javascript中闭包概念与用法深入理解
2016/12/15 Javascript
JS中LocalStorage与SessionStorage五种循序渐进的使用方法
2017/07/12 Javascript
微信小程序开发之animation循环动画实现的让云朵飘效果
2017/07/14 Javascript
JS自定义函数实现时间戳转换成date的方法示例
2017/08/27 Javascript
详解js正则表达式验证时间格式xxxx-xx-xx形式
2018/02/09 Javascript
React Native基础入门之调试React Native应用的一小步
2018/07/02 Javascript
使用Angular 6创建各种动画效果的方法
2018/10/10 Javascript
原生JS检测CSS3动画是否结束的方法详解
2019/01/27 Javascript
vue使用keep-alive保持滚动条位置的实现方法
2019/04/09 Javascript
JavaScript 监听组合按键思路及代码实现
2020/07/28 Javascript
Python基于有道实现英汉字典功能
2015/07/25 Python
python中正则表达式的使用方法
2018/02/25 Python
Django结合ajax进行页面实时更新的例子
2019/08/12 Python
python使用pip安装SciPy、SymPy、matplotlib教程
2019/11/20 Python
Python实现图像去噪方式(中值去噪和均值去噪)
2019/12/18 Python
Python datetime 如何处理时区信息
2020/09/02 Python
Python系统公网私网流量监控实现流程
2020/11/23 Python
h5封装下拉刷新
2020/08/25 HTML / CSS
一些Unix笔试题和面试题
2013/01/22 面试题
飞利信loadrunner和软件测试笔试题
2012/09/22 面试题
商场端午节活动方案
2014/01/29 职场文书
2014年学校团委工作总结
2014/12/20 职场文书
就业推荐表导师评语
2014/12/31 职场文书
敬老院活动感想
2015/08/07 职场文书
2016年优秀团支部事迹材料
2016/02/26 职场文书
教你用Python爬取英雄联盟皮肤原画
2021/06/13 Python
如何解决goland,idea全局搜索快捷键失效问题
2022/04/03 Golang
apache ftpserver搭建ftp服务器
2022/05/20 Servers