中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

pythonnet調用halcon腳本的方法

發布時間:2021-02-01 14:00:42 來源:億速云 閱讀:416 作者:小新 欄目:開發技術

小編給大家分享一下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和運行。

pythonnet調用halcon腳本的方法

# 導入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對象。

正確的轉換效果

pythonnet調用halcon腳本的方法

測試用原圖,發現 沒加偏移量的轉換結果。

pythonnet調用halcon腳本的方法

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

以上是“pythonnet調用halcon腳本的方法”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

海城市| 山阴县| 商丘市| 淳化县| 五指山市| 那曲县| 定远县| 伊金霍洛旗| 二连浩特市| 河东区| 凭祥市| 镇江市| 惠来县| 盐津县| 锡林郭勒盟| 大冶市| 资阳市| 民丰县| 黄大仙区| 长海县| 东丰县| 湘阴县| 綦江县| 通海县| 横山县| 府谷县| 蒙城县| 瓦房店市| 左云县| 阿克陶县| 石屏县| 濮阳县| 花垣县| 怀仁县| 富顺县| 陵川县| 深圳市| 黎城县| 武平县| 内江市| 芦山县|