python 調用halcon函數

之前的項目裏用到了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

最近多了一點思考,一味的搬磚搬磚,我的技術真的有在提高嘛?

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章