最近的项目中遇到了使用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

https://www.cnblogs.com/zimmerzheng/p/12212806.html

halcon python 联合开发_使用pythonnet调用halcon脚本相关推荐

  1. halcon可以用python吗_如何基于pythonnet调用halcon脚本

    这篇文章主要介绍了如何基于pythonnet调用halcon脚本,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 最近的项目中遇到了使用python程 ...

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

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

  3. python自动化测试开发_基于python的selenium2自动化测试从基础到实战(Python3、selenium2、自动化测试、web测试)...

    Selenium2是目前比较流行的一款针对web页面测试的自动化测试工具,他的前身是Selenium .Selenium测试直接运行在浏览器中,就像真正的用户在操作一样.支持的浏览器包括IE.Mozi ...

  4. python 环境 开发_设置Python开发环境

    python 环境 开发 Setting up Python is usually simple, but there are some places where newcomers (and exp ...

  5. python做网站开发_如何用Python做网站开发

    很多人想要用Python做网站开发,但是又不知从何入手,接下来小编介绍用Python做网站开发需要学习哪些知识,又应该以什么样的顺序来学. 第一步:HTML(超文本标记语言)是网页的核心,学好HTML ...

  6. 如何学好python web开发_如何学好python web开发

    1.前言 我在没有接触互联网这个行业的时候,就一直好奇网站是怎么构建的.我现在虽然从事互联网相关的工作,但是也一直没有接触过Web开发之类的东西,不过兴趣终归还是要有的,还要自己动手去实践的.Web开 ...

  7. 微信小程序用python语言开发_微信小程序语音识别开发过程笔记

    由于业务需求,需要使用微信小程序语音识别的功能,查找了好多发难,也踩了好多坑,把过程记录一下,或许会帮助到需要的朋友. 业务需求: 在小程序中识别用户语音输入的命令 业务环境和关键技术: 1.小程序: ...

  8. python fpga开发_惊人!Python+FPGA 实现FPGA开发大提速?!!

    在论文中,各位教授还对PYNQ开发环境的优缺点进行了阐述: 首先来说,PYNQ应用开发框架是一个开源的开发环境,提供了标准的可以约束芯片I/O引脚的"Overlay"比特流,同时, ...

  9. 零基础python嵌入式开发_零基础Python入门教程

    第01课 python基础之python介绍 课时1python的职业方向和工资 试听 00 : 15 : 54 开始学习 课时2环境的安装 试听 00 : 14 : 16 开始学习 课时3基础班课程 ...

最新文章

  1. Deformable ConvNets--Part4: Deformable Convolutional Networks
  2. python中ndarray如何生成单独的记事本文件_NumPy-快速处理数据--ndarray对象--数组的创建和存取...
  3. 关于Two pointers的个人理解
  4. 【用研】细读7张图片,教你玩转用户调研
  5. GDCM:gdcm::Scanner的测试程序
  6. javascript中数组的22种方法
  7. 中国象棋程序的设计与实现(五)--回答CSDN读者的一些问题
  8. linux中的码字软件,码字写作软件下载
  9. MultiRow发现之旅(五)- MultiRow版俄罗斯方块(exe + 源码)
  10. lnmp一键安装的步骤
  11. c语言考试中操作题文件,计算机二级考试C语言操作题题库(21页)-原创力文档...
  12. Python自动化测试之PO模式
  13. seaborn关联图表之折线图和散点图
  14. 从sk_buff中的线性区与非线性区到 bpf_skb_pull_data
  15. Robin广场舞案例实践分析之深入思考
  16. Halcon连接大恒相机
  17. 微信小程序-编写图标的方法
  18. IAR 的 Go to Definition of不能正常使用
  19. 2022嵌入式工程师面经(2023年1月更新)
  20. flutter_downloader文件下载插件

热门文章

  1. 如何用asp.net实现校验功能!
  2. 51nod 1270 数组的最大代价
  3. 面对 iPad,Surface 的键盘是必杀技
  4. 重拾CCNA,学习笔记持续更新ing......(4)
  5. Stella Forum v2 线上版开发总结
  6. linux 分析 进程cpu占用过高
  7. linux 内核钩子 khook 项目介绍
  8. SAP 企业管理软件与解决方案 产品简介
  9. linux 内核函数 copy_from_user和copy_to_user 介绍
  10. uclinux与linux的区别