HSmartWindowControl 之 顯示圖像

来源:https://www.cnblogs.com/oucsheep/archive/2018/08/31/9568253.html
-Advertisement-
Play Games

概述:使用Halcon在VS中的控制項顯示一張圖片。要點:使用了圖像縮放和圖像顯示函數,以及滑鼠滾輪響應函數。1、創建WinForm項目參考上一篇:HSmartWindowControl之安裝篇 (Visual Studio 2013 & Halcon 18)https://www.cnblogs.c... ...


概述:使用Halcon在VS中的控制項顯示一張圖片。

要點:使用了圖像縮放和圖像顯示函數,以及滑鼠滾輪響應函數。

1、創建WinForm項目

首先在VS中添加Halcon所需的控制項HSmartWindowControl,參考上一篇:HSmartWindowControl之安裝篇 (Visual Studio 2013 & Halcon 18)https://www.cnblogs.com/oucsheep/p/9563876.html

然後創建新的winForm工程,並向窗體中拖入一個HSmartWindowControl控制項和兩個按鈕控制項。

image

拖入後不添加代碼,直接運行,可能會出現如下錯誤:

HalconDotNet.HHandleBase 的類型初始化值設定項引發異常

Snipaste_2018-08-30_18-31-30

Halcon error #2381:License is for wrong edition of Halcon in Operator set_system

Snipaste_2018-08-27_18-24-24

原因是halcon運行庫是64位的,vs的運行模式也需要設置為64位,預設的debug模式可能是any CPU,需要把這裡修改成x64。

image

或者從解決方案資源管理器(solution Explorer)中雙擊打開屬性(Property)頁面,把Build欄的Platform target 改為x64即可。

image

2、創建Halcon實時顯示代碼並導出

打開halcon,寫一句簡單的代碼

image

接著,選擇文件->導出,將HDevelop語言導出為C#語言。

image

3、halcon 導出的C#代碼分析

using System;
using HalconDotNet;

public partial class HDevelopExport
{
  public HTuple hv_ExpDefaultWinHandle;

  // Main procedure 
  private void action()
  {
    // Local iconic variables 
    HObject ho_Image;
    // Local control variables 
    HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
    // Initialize local and output iconic variables 
    HOperatorSet.GenEmptyObj(out ho_Image);
    ho_Image.Dispose();
    HOperatorSet.ReadImage(out ho_Image, "printer_chip/printer_chip_01");
    hv_Width.Dispose();hv_Height.Dispose();
    HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
    ho_Image.Dispose();

    hv_Width.Dispose();
    hv_Height.Dispose();
  }

  public void InitHalcon()
  {
    // Default settings used in HDevelop 
    HOperatorSet.SetSystem("width", 512);
    HOperatorSet.SetSystem("height", 512);
  }

  public void RunHalcon(HTuple Window)
  {
    hv_ExpDefaultWinHandle = Window;
    action();
  }
}

實際有用的代碼就是action()內的代碼,首先聲明瞭圖像變數:HObject ho_Image;

需要註意的是,圖像類型需要先初始化再使用:HOperatorSet.GenEmptyObj(out ho_Image);

然後調用ReadImage函數讀入圖像文件,最後調用Dispose函數清空對象。但是沒有顯示圖像的代碼,需要自己添加。

4、向VS中插入代碼

打開Winform工程窗體關聯的cs文件Form1.cs,首先需要在文件頭部添加命名空間引用:

using HalconDotNet;

需要在類中定義全局的視窗變數,便於操作窗體:

private static HWindow hwindow; //全局視窗變數
public HTuple hv_ExpDefaultWinHandle; //導出的代碼定義的,其實沒用到

視窗的初始化函數中添加全局變數的初始化函數:

public Form1()
        {
            InitializeComponent();
            hwindow = hSmartWindowControl1.HalconWindow;//初始化視窗變數
            this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.my_MouseWheel);
        }

然後在按鈕的響應函數中添載入入圖像的及顯示的代碼:

private void button2_Click(object sender, EventArgs e)
        {
            #region 初始化變數
            // Local iconic variables 
            HObject ho_Image;
            // Local control variables 
            HTuple hv_Width = new HTuple(), hv_Height = new HTuple();
            // Initialize local and output iconic variables 
            HOperatorSet.GenEmptyObj(out ho_Image);
            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, "clip.png");
            hv_Width.Dispose(); hv_Height.Dispose();
            #endregion

            #region 縮放圖像,適應視窗
            //獲取圖像大小及縱橫比
            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
            int im_width = int.Parse(hv_Width.ToString());
            int im_height = int.Parse(hv_Height.ToString());
            double im_AspectRatio = (double)(im_width)/(double)(im_height);
            //獲取視窗大小及縱橫比
            int w_width = hSmartWindowControl1.Size.Width;
            int w_height = hSmartWindowControl1.Size.Height;
            double w_AspectRatio = (double)(w_width)/(double)(w_height);

            HOperatorSet.SetSystem("int_zooming", "false");//圖像縮放之前最好將此參數設置為false.
            HTuple para = new HTuple("constant");
            HObject ho_zoomImage;
            HOperatorSet.GenEmptyObj(out ho_zoomImage);

            ho_zoomImage.Dispose();
            if(w_width<im_width && im_AspectRatio>w_AspectRatio)
            {
                //超寬圖像               
                HOperatorSet.ZoomImageSize(ho_Image, out ho_zoomImage, w_width, w_width / im_AspectRatio, para);            
            }
            else if (w_height < im_height && im_AspectRatio < w_AspectRatio)
            {
                //超高圖像                
                HOperatorSet.ZoomImageSize(ho_Image, out ho_zoomImage, w_height * im_AspectRatio, w_height, para);
            }
            #endregion

            #region 顯示圖像
            hwindow.SetPart(0, 0, -2, -2);
            hwindow.DispObj(ho_zoomImage);

            //HOperatorSet.GetImageSize(ho_zoomImage, out hv_Width, out hv_Height);
            //im_width = int.Parse(hv_Width.ToString());
            //im_height = int.Parse(hv_Height.ToString());
            //MessageBox.Show(hv_Width.ToString() + "  " + hv_Height.ToString());
            
            #endregion

            ho_Image.Dispose();
            ho_zoomImage.Dispose();
            hv_Width.Dispose();
            hv_Height.Dispose();
        }

5、圖像縮放和顯示

這裡我對導出的代碼做了修改,主要是增加了圖像縮放和顯示功能。

圖像縮放使用了ZoomImageSize函數,在幫助文檔中,這個函數有兩種用法:

static void HOperatorSet.ZoomImageSize(HObject image, out HObject imageZoom, HTuple width,HTuple height, HTuple interpolation)

HImage HImage.ZoomImageSize(int width, int height, string interpolation)

上面的代碼中使用了第一種用法,所有的參數必須是Halcon的類型,但是實際使用時width 和height 可以用int類型,interpolation即差值演算法參數也可以直接傳入string類型,如“constant”。

第二種方法需要將使用HImage類型的變數來操作,所以需要將 HObject 類型定義的圖像變數轉換一下:

HImage img = new HImage(ho_Image);
ho_zoomImage = img.ZoomImageSize(w_width, w_width, "constant");

圖像顯示功能:先調用SetPart函數確定要顯示圖像的區域,然後調用DispObj函數顯示圖像,DispObj也有三種用法:

static void HOperatorSet.DispObj(HObject objectVal, HTuple windowHandle)

void HObject.DispObj(HWindow windowHandle)

void HWindow.DispObj(HObject objectVal)

此處我用的第三種:通過Hwindow調用,參數為要顯示的圖像變數。

hwindow.SetPart(0, 0, -2, -2);
hwindow.DispObj(ho_zoomImage);

6、SmartWindowControl視窗交互

前面實現了圖像顯示,SmartWindowControl最大的亮點其實是方便的交互功能。

可以用滑鼠拖動圖像水平移動,利用滑鼠滾輪實現圖像放大縮小。

另外,在winForm項目中,為了使用SmartWindowControl控制項中圖像的縮放,還需要添加滑鼠滾輪響應的回調函數。詳見:C:/Program Files/MVTec/HALCON-18.05-Progress/doc/html/manuals/programmers_guide/programmers_guide_0051.html

image

實際測試發現幫助文檔中的用法有一些問題,消息相應函數的註冊應該在整個窗體的初始化函數中,而不是SmartWindowControl的初始化函數中。

private void hSmartWindowControl1_Load(object sender, EventArgs e)
        {
            //這句話不起作用
            this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.my_MouseWheel);
        }
public Form1()
        {
            InitializeComponent();
            hwindow = hSmartWindowControl1.HalconWindow;//初始化視窗變數
            // 滑鼠滾輪的響應函數註冊
            this.MouseWheel += new System.Windows.Forms.MouseEventHandler(this.my_MouseWheel);
        }

這樣修改後,直接使用幫助文檔中提供的my_MouseWheel也有一個小bug,就是無論在窗體的任何位置滑動滾輪,圖片都會縮放,所以需要對滑鼠的位置做一下限制:

private void my_MouseWheel(object sender, MouseEventArgs e)
        {
            System.Drawing.Point pt = this.Location;
            int leftBorder = hSmartWindowControl1.Location.X;
            int rightBorder = hSmartWindowControl1.Location.X + hSmartWindowControl1.Size.Width;
            int topBorder = hSmartWindowControl1.Location.Y;
            int bottomBorder = hSmartWindowControl1.Location.Y + hSmartWindowControl1.Size.Height;
            if(e.X > leftBorder && e.X < rightBorder && e.Y > topBorder && e.Y < bottomBorder)
            {
                MouseEventArgs newe = new MouseEventArgs(e.Button, e.Clicks,
                                                     e.X - pt.X, e.Y - pt.Y, e.Delta);
                hSmartWindowControl1.HSmartWindowControl_MouseWheel(sender, newe);
            }           
        }

您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 今日內容介紹 1、File 2、遞歸 xmind:下載地址: 鏈接: "https://pan.baidu.com/s/1Eaj9yP5i0x4PiJsZA4StQg" 密碼:845a 01IO技術概述 A:IO技術概述 a: Output 把記憶體中的數據存儲到持久化設備上這個動作稱為輸出(寫)Ou ...
  • pass ...
  • 方式一:from django.views.decorators.csrf import csrf_exemptfrom django.utils.decorators import method_decoratorfrom django.views import Viewclass Goods_v ...
  • Behaviors就是Actor接收到消息後可以改變處理的方法,相同的Actor,每次調用,轉到不同的Actor內方法執行,非常適合按流程進行的場景。Behaviors就通過在Actor內部實例化一個Behavior對象,然後通過這個對象的Become來切換執行的方法的。 ...
  • 一般情況下,aspnetcore發佈後的預設埠是5000,這個大家都知道,而且預設骨架代碼中沒有看到任何讓你輸入的ip地址和埠號,但作為程式員的我們,不希望 被框架所管制,那如何實現預設埠的修改呢? 骨架代碼: 發佈如下: 一:解決辦法1(UseUrls) 骨架代碼就那麼幾行,很容易在這個IW ...
  • 在早期Bootstrap框架介紹中,我的隨筆《結合bootstrap fileinput插件和Bootstrap-table表格插件,實現文件上傳、預覽、提交的導入Excel數據操作流程》中介紹了利用Bootstrap FieInput插件上傳Excel文件到伺服器,然後利用Bootstrap-ta... ...
  • 在.NET世界,如果想要對資料庫進行操作,總少不了ADO.NET的身影。在.NET Core里同樣離不開那些熟悉的類庫與API。這裡簡略地介紹下如何通過ADO.NET對SQL Server進行不同的處理。 System.Data.SqlClient 第一步先在項目工程中查看有無System.Data ...
  • 基於上一篇文章 實現對IdnetityServer4 服務的使用 1:添加介面解決方案,並且使介面受認證服務的保護: 首先在解決方案中添加Api項目如下圖所示: 在API項目中添加Nuget 引用 如下圖所示: Install-Package IdentityServer4.AccessTokenV ...
一周排行
    -Advertisement-
    Play Games
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...