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
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...