C#/halcon圖像滾輪縮放


分類專欄: # Halcon

版權聲明:本文為博主原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
本文鏈接: https://blog.csdn.net/jgj123321/article/details/96479014
Halcon 專欄收錄該內容
39 篇文章 3 訂閱
  • 初始化窗口

1)圖片控件為winform中的PictureBox控件時

需要調用halcon算子OpenWindow來初始化窗口,使winform中的圖片窗口轉換為適用於halcon的圖片窗口。

2)圖片控件為halcon中的HWindowControl控件時:

無需進行窗口轉換,可直接按照如下方式調用。

WindowID = hWindowControl1.HalconWindow。

  • 添加圖像縮放功能

打開Form窗體——查看圖片控件屬性——點擊“事件”選項——找到鼠標滾輪滑動的事件,雙擊創建響應函數——將相應的代碼放在剛剛添加的函數中,如下圖所示:

  • 添加圖像平移功能

按照上述步驟分別找到鼠標“按下”與“抬起”的事件,分別雙擊創建響應函數,然后將相應的代碼放在剛剛添加的函數中。如下圖所示:

  • 添加實時顯示灰度值功能

按照上述步驟找到鼠標移動的事件,雙擊創建響應函數——在界面上添加一個“label”控件,然后將相應的代碼放在剛剛添加的函數中。

  • 代碼:

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using HalconDotNet;

namespace CSharpAndHalcon12
{
    public partial class Form1 : Form
    {
        HTuple WindowID, ImageWidth, ImageHeight;
        private double RowDown;//鼠標按下時的行坐標
        private double ColDown;//鼠標按下時的列坐標
        HObject ho_image;      //圖像變量

        public Form1()
        {
            InitializeComponent();
            CreateHalconWindow();
        }

        //創建Halcon窗口
        public void CreateHalconWindow()
        {
           // ///圖片控件為winform中的PictureBox控件時/
            //HTuple FatherWindow = this.hWindowControl1.Handle;
            //HOperatorSet.SetWindowAttr("background_color", "green");
            //HOperatorSet.OpenWindow(0, 0, this.hWindowControl1.Width, this.hWindowControl1.Height, FatherWindow, "visible", "", out WindowID);

            /圖片控件為halcon中的HWindowControl控件時/
            WindowID = hWindowControl1.HalconWindow;
        }
        //讀圖
        private void button1_Click(object sender, EventArgs e)
        {
            OpenFileDialog openFileDialog = new OpenFileDialog();
            //openFileDialog.Filter = "JPEG文件|*.jpg*|BMP文件|*.bmp*|TIFF文件|*.tiff*";
            openFileDialog.Filter = "所有圖像文件 | *.bmp; *.pcx; *.png; *.jpg; *.gif;*.tif; *.ico; *.dxf; *.cgm; *.cdr; *.wmf; *.eps; *.emf";
            if (openFileDialog.ShowDialog() == DialogResult.OK)
            {
                HTuple ImagePath = openFileDialog.FileName;
                HOperatorSet.ReadImage(out ho_image, ImagePath);
            }
            HOperatorSet.GetImageSize(ho_image, out ImageWidth, out ImageHeight);
            HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight, ImageWidth);
            HOperatorSet.DispObj(ho_image, WindowID);
        }
        //縮放圖像
        private void hWindowControl1_HMouseWheel(object sender, HMouseEventArgs e)
        {
            HTuple Zoom, Row, Col, Button;
            HTuple Row0, Column0, Row00, Column00, Ht, Wt, r1, c1, r2, c2;
            if (e.Delta > 0)
            {
                Zoom = 1.5;
            }
            else
            {
                Zoom = 0.5;
            }
            HOperatorSet.GetMposition(WindowID, out Row, out Col, out Button);
            HOperatorSet.GetPart(WindowID, out Row0, out Column0, out Row00, out Column00);
            Ht = Row00 - Row0;
            Wt = Column00 - Column0;
            if (Ht * Wt < 32000 * 32000 || Zoom == 1.5)//普通版halcon能處理的圖像最大尺寸是32K*32K。如果無限縮小原圖像,導致顯示的圖像超出限制,則會造成程序崩潰
            {
                r1 = (Row0 + ((1 - (1.0 / Zoom)) * (Row - Row0)));
                c1 = (Column0 + ((1 - (1.0 / Zoom)) * (Col - Column0)));
                r2 = r1 + (Ht / Zoom);
                c2 = c1 + (Wt / Zoom);
                HOperatorSet.SetPart(WindowID, r1, c1, r2, c2);
                HOperatorSet.ClearWindow(WindowID);
                HOperatorSet.DispObj(ho_image, WindowID);
            }
        }
        //鼠標按下,記錄當前坐標值
        private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e)
        {
            HTuple Row, Column, Button;
            HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
            RowDown = Row;    //鼠標按下時的行坐標
            ColDown = Column; //鼠標按下時的列坐標
        }
        //鼠標抬起,實現圖像移動
        private void hWindowControl1_HMouseUp(object sender, HMouseEventArgs e)
        {
            HTuple row1, col1, row2, col2,Row, Column, Button;
            HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);
            double RowMove = Row - RowDown;   //鼠標彈起時的行坐標減去按下時的行坐標,得到行坐標的移動值
            double ColMove = Column - ColDown;//鼠標彈起時的列坐標減去按下時的列坐標,得到列坐標的移動值
            HOperatorSet.GetPart(WindowID, out row1, out col1, out row2, out col2);//得到當前的窗口坐標
            HOperatorSet.SetPart(WindowID, row1 - RowMove, col1 - ColMove, row2 - RowMove, col2 - ColMove);//這里可能有些不好理解。以左上角原點為參考點
            HOperatorSet.ClearWindow(WindowID);
            if (ImageHeight != null)
            {
                HOperatorSet.DispObj(ho_image, WindowID);
            }
            else
            {
                MessageBox.Show("請加載一張圖片");
            }      
        }
        //鼠標移動,實時顯示當前坐標與灰度值
        private void hWindowControl1_HMouseMove(object sender, HMouseEventArgs e)
        {
            HTuple Row, Column, Button, pointGray;
            HOperatorSet.GetMposition(WindowID, out Row, out Column, out Button);              //獲取當前鼠標的坐標值
            if (ImageHeight != null && (Row > 0 && Row < ImageHeight) && (Column > 0 && Column < ImageWidth))//設置3個條件項,防止程序崩潰。
            {
                HOperatorSet.GetGrayval(ho_image, Row, Column, out pointGray);                 //獲取當前點的灰度值
            }
            else
            {
                pointGray = "_";
            }
            String str = String.Format("Row:{0}  Column:{1}  Gray:{2}", Row, Column, pointGray); //格式化字符串
            label1.Text = str;                                                                   //在label控件上顯示數值        
        }
        //全屏顯示圖像,使縮放后的圖像回到原始大小
        private void button_FullWindow_Click(object sender, EventArgs e)
        {
            HOperatorSet.SetPart(WindowID, 0, 0, ImageHeight - 1, ImageWidth - 1);
            HOperatorSet.ClearWindow(WindowID);
            HOperatorSet.DispObj(ho_image, WindowID);
        }
    }
}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM