这篇文章主要介绍了如何基于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和运行。

# 导入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对象。

正确的转换效果

测试用原图,发现 没加偏移量的转换结果。

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博客。

halcon可以用python吗_如何基于pythonnet调用halcon脚本相关推荐

  1. halcon python 联合开发_使用pythonnet调用halcon脚本

    最近的项目中遇到了使用python程序结合不同部分,其中包括使用halcon处理拍摄到的图像. halcon本身提供了c++与.NET的开发库,但无python库,网上有pyhalcon之类的库,但功 ...

  2. halcon python_使用pythonnet调用halcon脚本

    Python Python开发 Python语言 使用pythonnet调用halcon脚本 最近的项目中遇到了使用python程序结合不同部分,其中包括使用halcon处理拍摄到的图像. halco ...

  3. 基于sparksql调用shell脚本运行SQL

    [Author]: kwu 基于sparksql调用shell脚本运行SQL,sparksql提供了类似hive中的 -e  , -f ,-i的选项 1.定时调用脚本 #!/bin/sh # uplo ...

  4. hive运行mysql脚本_用java代码调用shell脚本执行sqoop将hive表中数据导出到mysql

    1:创建shell脚本 1 touch sqoop_options.sh2 chmod 777 sqoop_options.sh 编辑文件  特地将执行map的个数设置为变量  测试 可以java代码 ...

  5. cscript 执行代码_使用Wscript/cscript调用VB脚本

    ●强制用Wscript.exe执行 SET Wshell=CreateObject("Wscript.Shell") if lcase(right(Wscript.fullName ...

  6. python的坐标代码_基于Python的地图坐标服务接口调用代码实例

    代码描述:基于Python的地图坐标服务接口调用代码实例 关联数据:地图坐标服务 接口地址:http://www.juhe.cn/docs/api/id/32 #!/usr/bin/python # ...

  7. python在律师上作中的实例_基于Python的律师信息查询接口调用代码实例

    基于Python的律师信息查询接口调用代码实例代码描述:基于Python的律师信息查询接口调用代码实例 代码平台:聚合数据 #!/usr/bin/python # -*- coding: utf-8 ...

  8. Python地信专题 |基于geopandas的空间数据分析-深入浅出分层设色

    点击蓝字关注我,有干货领取! 本文对应代码和数据已上传至我的Github仓库: https://github.com/CNFeffery/DataScienceStudyNotes[1] 已发布: P ...

  9. Python地信专题 | 基于geopandas玩转地图可视化

    文章来源于Python大数据分析,作者费弗里 本文对应代码和数据已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes[1] ...

最新文章

  1. 2022-2028年中国氨基酸表面活性剂行业研究及发展前瞻报告
  2. 外部接口需求怎么写_软件需求规约怎么写
  3. 线性代数带参数的线性方程组的求法示例详解
  4. 云盒子企业网盘入驻阿里云市场,正式向公有云市场发力!
  5. Python 运算符重载
  6. matlab节点导纳阵求逆,关于利用矩阵稀疏技术求解节点导纳矩阵的MATLAB编程
  7. 在线平互动台活动启动《Discover How to Make the Computer Easier to Use with Windows Vista》...
  8. Flink的定时器(EventTime和ProcessTime)
  9. 刷新include引进的页面
  10. php生成xml报错101,php编译报错大全
  11. 【转】VS2008 入门基本操作
  12. 10个大数据思维原理,你了解多少?
  13. linux使用anaconda安装python包
  14. 【渝粤题库】广东开放大学 汉语基础 形成性考核
  15. ResponseEntity返回图片,下载图片
  16. sql bigint 转varchar_SQL 优化案例一则
  17. echarts pie饼图既显示内部又显示外部指示线
  18. Android 动态修改app名称(市场和手机中显示两个不同的名称)
  19. JAVA核心:I/O(输入/输出)
  20. 手机连接Linux教程,手机密钥连接linux主机

热门文章

  1. mydumper 0.6.2 安装,dba的必备备份工具,必须掌握
  2. 孰轻孰重:可穿戴式设备的助益与风险
  3. zabbix专题:第十二章 zabbix proxy分布式监控配置
  4. java   web servelt
  5. JAVA类型转换问题
  6. Spark 调优之数据倾斜
  7. 第三章 “我要点爆”微信小程序云开发之点爆方式页面和爆炸之音页面制作
  8. jsp和servlet开发过程中参数传递乱码问题总结
  9. [Bash] Search for Text with `grep`
  10. [原创]Zynq SDIO WIFI SotfAP调试