如何基于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 相关文章推荐
linux系统使用python监测网络接口获取网络的输入输出
Jan 15 Python
高性能web服务器框架Tornado简单实现restful接口及开发实例
Jul 16 Python
python matplotlib 注释文本箭头简单代码示例
Jan 08 Python
Python线程创建和终止实例代码
Jan 20 Python
Python实现对一个函数应用多个装饰器的方法示例
Feb 09 Python
解决Python的str强转int时遇到的问题
Apr 09 Python
JSON文件及Python对JSON文件的读写操作
Oct 07 Python
对python多线程SSH登录并发脚本详解
Feb 14 Python
Pytorch之卷积层的使用详解
Dec 31 Python
Python logging模块异步线程写日志实现过程解析
Jun 30 Python
python中通过pip安装库文件时出现“EnvironmentError: [WinError 5] 拒绝访问”的问题及解决方案
Aug 11 Python
Python面向对象编程之类的概念
Nov 01 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连接MySQL查询结果中文显示乱码解决方法
2013/10/25 PHP
zf框架的zend_cache缓存使用方法(zend框架)
2014/03/14 PHP
ThinkPHP3.1查询语言详解
2014/06/19 PHP
修改destoon会员公司的伪静态中的com目录的方法
2014/08/21 PHP
在WordPress的后台中添加顶级菜单和子菜单的函数详解
2016/01/11 PHP
PHP 网站修改默认访问文件的nginx配置
2017/05/27 PHP
Laravel框架中VerifyCsrfToken报错问题的解决
2017/08/30 PHP
PHP实现的策略模式示例
2019/03/20 PHP
IE autocomplete internet explorer's autocomplete
2007/06/30 Javascript
基于jquery的大众点评,分类导航实现代码
2011/08/23 Javascript
js动态添加onload、onresize、onscroll事件(另类方法)
2012/12/26 Javascript
javascript显示用户停留时间的简单实例
2013/08/05 Javascript
js 实现 input type="file" 文件上传示例代码
2013/08/07 Javascript
JSON+HTML实现国家省市联动选择效果
2014/05/18 Javascript
浅谈JavaScript 框架分类
2014/11/10 Javascript
AngularJS service之select下拉菜单效果
2017/07/28 Javascript
vue中实现图片和文件上传的示例代码
2018/03/16 Javascript
create-react-app安装出错问题解决方法
2018/09/04 Javascript
vue仿淘宝滑动验证码功能(样式模仿)
2019/12/10 Javascript
js实现验证码功能
2020/07/24 Javascript
vue 解决uglifyjs-webpack-plugin打包出现报错的问题
2020/08/04 Javascript
js实现简单商品筛选功能
2021/02/02 Javascript
python实现协同过滤推荐算法完整代码示例
2017/12/15 Python
python爬虫使用cookie登录详解
2017/12/27 Python
Python3中exp()函数用法分析
2019/02/19 Python
用python写测试数据文件过程解析
2019/09/25 Python
使用Python函数进行模块化的实现
2019/11/15 Python
Django 自定义权限管理系统详解(通过中间件认证)
2020/03/11 Python
Python闭包装饰器使用方法汇总
2020/06/29 Python
adidas马来西亚官网:adidas MY
2020/09/12 全球购物
Happy Plugs官网:瑞典无线耳机品牌
2020/07/16 全球购物
PHP面试题附答案
2015/11/28 面试题
服务中心夜班服务员岗位职责
2013/11/27 职场文书
巾帼文明岗申报材料
2014/05/01 职场文书
2014年卫生监督工作总结
2014/12/09 职场文书
css3 实现文字闪烁效果的三种方式示例代码
2021/04/25 HTML / CSS