之前的项目里用到了halcon,而一部分代码是python写的,懒得再转一次,就直接在python里使用halcon的函数了。
用到了pythonnet,它是python与c#的交互模块。
halcon函数(.hdvp): 正常编写
python:
import clr
import sys
import System
from System import String, Char, Int32, Int64, Environment, IntPtr
# 导入halcon支持库
d = clr.AddReference("xxx/halcondotnet")
# 导入halcon脚本引擎
d = clr.AddReference("xxx/hdevenginedotnet")
import time
import HalconDotNet
from HalconDotNet import *
class HdevEnginePy:
#MyEngine = HDevEngine()
Procedure = HDevProcedure()
Program = HDevProgram()
# halconExamples = HSystem.GetSystem("HALCONEXAMPLES")
halconExamples = Environment.GetEnvironmentVariable("HALCONEXAMPLES")
ProcedurePath = halconExamples + r"\hdevengine\procedures" # halcon自带外部函数脚本路径,以防自己写的脚本调用时出错
ProcedurePath = ProcedurePath.replace('\\', '/')
ourProcedure = r"D:\python\apple-picker20200106\PyHalconProject\hdev\procedures" # 我们自己写的函数脚本目录
def __init__(self):
# 添加halcon外部函数脚本目录路径
self.MyEngine = HDevEngine()
self.MyEngine.SetProcedurePath(self.ourProcedure)
self.Proc_find_coord = HDevProcedure("locate_chilun")
#self.MyEngine.AddProcedurePath(self.ourProcedure)
return
def get_proc_names(self):
procedure_name = self.MyEngine.GetProcedureNames()
return procedure_name
def load_proc(self):
try:
# 加载自定义函数,打印输入变量名称
self.Procedure = HDevProcedure("locate_chilun")
self.ProcCall = HDevProcedureCall(self.Procedure)
ctrlNames = self.Procedure.GetInputCtrlParamNames()
iconNames = self.Procedure.GetInputIconicParamNames()
except:
print("加载halcon函数脚本出错。")
self.ProcCall.Dispose()
return
def excute_find_chilun(self):
# 控制相机抓取图像,并执行基于轮廓的3D匹配
self.ProcCall.Execute()
self.result = -1
self.pose = self.ProcCall.GetOutputCtrlParamTuple("Cpose")
self.result = self.ProcCall.GetOutputCtrlParamTuple("resultFlag")
return self.pose, self.result
def converttoHImage(self, ndArray):
# 把ndArray格式的图像转换成HImage
# 提取BGR各通道
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()
# 生成字节数组内存地址
Bbuffer = bytes(imgBflat)
Bptr = id(Bbuffer)
intptrB = IntPtr.__overloads__[Int64](Bptr + 32)
Gbuffer = bytes(imgGflat)
Gptr = id(Gbuffer)
intptrG = IntPtr.__overloads__[Int64](Gptr + 32)
Rbuffer = bytes(imgRflat)
Rptr = id(Rbuffer)
intptrR = IntPtr.__overloads__[Int64](Rptr + 32)
imgSnap = HImage()
# imgSnap.GenImage1("byte", img.shape[1], img.shape[0], intptr)
imgSnap.GenImage3("byte", ndArray.shape[1], ndArray.shape[0], intptrR, intptrG, intptrB)
return imgSnap
# 使用
def find_chilun():
# 初始化脚本引擎对象
HenPy = HdevEnginePy()
procList = HenPy.get_proc_names()
print(procList)
# 加载我们编写的函数
HenPy.load_proc()
# 执行。
p1 = [0,0,0]
pose,result = HenPy.excute_find_chilun()
print(result[0].I) # Halcon的数据转换,如果是整数就.I ,如果是分数就是.D
if result[0].I == 1:
p1[0] = pose[0].D
p1[1] = pose[1].D
p1[2] = pose[2].D
else:
print("Fail")
return p1
最近多了一点思考,一味的搬砖搬砖,我的技术真的有在提高嘛?