日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程语言 > python >内容正文

python

halcon python_使用pythonnet调用halcon脚本

發布時間:2025/4/5 python 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 halcon python_使用pythonnet调用halcon脚本 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Python

Python開發

Python語言

使用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

內容來源于網絡,如有侵權請聯系客服刪除

總結

以上是生活随笔為你收集整理的halcon python_使用pythonnet调用halcon脚本的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。