之前的項目裏用到了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
最近多了一點思考,一味的搬磚搬磚,我的技術真的有在提高嘛?