设置首页收藏本站
开启左侧

Halcon板模匹配+C# 練習案子!!新手編排方法

[复制链接]
Ryder 发表于 2017-11-9 10:57:56 | 显示全部楼层 |阅读模式
大家好,謝謝網站上哥們幫忙,讓我進入這一個領域。
這兩個月來自學遇到一些問題。
我覺得自己的C#觀念不太足夠,試著寫一個板模匹配的程序。
有些卡住問題,如下C#程式碼。
我想法是
public partial class HDevelopExport裡面宣告各種方法,也就是灰階或二值化or創建板模。
在控件的部分引用這些方法顯示在視窗。
問題
1.我需要在public void Threshold(HTuple Window) 這個方法內引用public void Opencamera(HTuple Window)裡面的ho_image來做二值化,不過沒辦法直接使用,需要變成每個方法都從頭開一次相機,請問如何引用才會簡潔呢?
2.創建完板模後(out hv_ModelID1),要如何存檔hv_ModelID1編排,C#才可以後續使用find的指令取得當下圖片中的座標位置跟角度呢?
3.之前有嘗試過在public partial class HDevelopExport取得裡面的參數,如何編排才可以在後續的控件中擊點顯示在label1.Text上呢?     無法直接寫label1.text=hv_Row.tostring();
          EX.  hv_Row1 , hv_Column1
           hv_Angle1, hv_Score1




using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using HalconDotNet;
namespace 小定位
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        HDevelopExport hd = new HDevelopExport();
        public partial class HDevelopExport
        {
            //變數宣告
            public HTuple hv_ExpDefaultWinHandle;
            HObject ho_Image, ho_Image2, ho_Regions, ho_GrayImage, ho_ConnectedRegions1;
            HObject ho_SelectedRegions, ho_ImageReduced1, ho_ModelImages;
            HObject ho_ModelRegions, ho_ModelContours, ho_Image1 = null;
            HObject ho_ContoursAffineTrans = null;
            HTuple hv_AcqHandle = null, hv_ModelID1 = null;
            HTuple hv_NumLevels = null, hv_AngleStart = null, hv_AngleExtent = null;
            HTuple hv_AngleStep = null, hv_ScaleMin = null, hv_ScaleMax = null;
            HTuple hv_ScaleStep = null, hv_Metric = null, hv_MinContrast = null;
            HTuple hv_Row1 = new HTuple(), hv_Column1 = new HTuple();
            HTuple hv_Angle1 = new HTuple(), hv_Score1 = new HTuple();
            HTuple hv_HomMat2D = new HTuple(), hv_RowTrans = new HTuple();
            HTuple hv_ColTrans = new HTuple();
            ///以上
            public void InitHalcon()///
            {
                // Default settings used in HDevelop
                HOperatorSet.SetSystem("width", 512);
                HOperatorSet.SetSystem("height", 512);
            }
            public void Opencamera(HTuple Window)
            {
                hv_ExpDefaultWinHandle = Window;
                HOperatorSet.OpenFramegrabber("USB3Vision", 0, 0, 0, 0, 0, 0, "progressive",-1, "default", -1, "false", "default", "0E70270494A3_ToshibaTeli_BU505MG",0, -1, out hv_AcqHandle);
                HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
                HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
                HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
                ho_Image.Dispose();
                HOperatorSet.CloseFramegrabber(hv_AcqHandle);
            }
            public void Threshold(HTuple Window)
            {
                hv_ExpDefaultWinHandle = Window;
                HOperatorSet.OpenFramegrabber("USB3Vision", 0, 0, 0, 0, 0, 0, "progressive", -1, "default", -1, "false", "default", "0E70270494A3_ToshibaTeli_BU505MG", 0, -1, out hv_AcqHandle);
                HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
                HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
                HOperatorSet.GenEmptyObj(out ho_Regions);
                ho_Regions.Dispose();
                HOperatorSet.Threshold(ho_Image, out ho_Regions, 207, 255);
                HOperatorSet.DispObj(ho_Regions, hv_ExpDefaultWinHandle);
                HOperatorSet.CloseFramegrabber(hv_AcqHandle);
            }
            public void sample(HTuple Window)
            {
                hv_ExpDefaultWinHandle = Window;
                HOperatorSet.OpenFramegrabber("USB3Vision", 0, 0, 0, 0, 0, 0, "progressive", -1, "default", -1, "false", "default", "0E70270494A3_ToshibaTeli_BU505MG", 0, -1, out hv_AcqHandle);
                HOperatorSet.GrabImageStart(hv_AcqHandle, -1);
                HOperatorSet.GrabImageAsync(out ho_Image, hv_AcqHandle, -1);
                HOperatorSet.GenEmptyObj(out ho_Regions);
                ho_Regions.Dispose();
                HOperatorSet.Threshold(ho_Image, out ho_Regions, 207, 255);
                HOperatorSet.GenEmptyObj(out ho_ConnectedRegions1);
                ho_ConnectedRegions1.Dispose();
                HOperatorSet.Connection(ho_Regions, out ho_ConnectedRegions1);
                HOperatorSet.GenEmptyObj(out ho_SelectedRegions);
                ho_SelectedRegions.Dispose();
                HOperatorSet.SelectShape(ho_ConnectedRegions1, out ho_SelectedRegions, "area",
                    "and", 1.17658e+006, 1.40335e+006);
                HOperatorSet.GenEmptyObj(out ho_ImageReduced1);
                ho_ImageReduced1.Dispose();
                HOperatorSet.ReduceDomain(ho_Image, ho_SelectedRegions, out ho_ImageReduced1);
                HOperatorSet.CreateShapeModel(ho_ImageReduced1, "auto", 0, 6.29, "auto", "auto",
                    "use_polarity", "auto", "auto", out hv_ModelID1);
                HOperatorSet.GetShapeModelParams(hv_ModelID1, out hv_NumLevels, out hv_AngleStart,
                    out hv_AngleExtent, out hv_AngleStep, out hv_ScaleMin, out hv_ScaleMax, out hv_ScaleStep,
                    out hv_Metric, out hv_MinContrast);
                HOperatorSet.GenEmptyObj(out ho_ModelImages);
                ho_ModelImages.Dispose();
                HOperatorSet.GenEmptyObj(out ho_ModelRegions);
                ho_ModelRegions.Dispose();
                HOperatorSet.InspectShapeModel(ho_ImageReduced1, out ho_ModelImages, out ho_ModelRegions,
                    4, 30);
                HOperatorSet.GenEmptyObj(out ho_ModelContours);
                ho_ModelContours.Dispose();
                HOperatorSet.GetShapeModelContours(out ho_ModelContours, hv_ModelID1, 1);
                HOperatorSet.CloseFramegrabber(hv_AcqHandle);
                HOperatorSet.DispObj(ho_Image, hv_ExpDefaultWinHandle);
            }
            public void find()
            {
            }



        }
@以下為控件引用
        private void button1_Click(object sender, EventArgs e)
        {
            hWindowControl1.HalconWindow.ClearWindow();
            hd.Opencamera(hWindowControl1.HalconWindow);
        }
        private void button2_Click(object sender, EventArgs e)
        {
            hWindowControl1.HalconWindow.ClearWindow();
            hd.Threshold(hWindowControl1.HalconWindow);
        }
        private void button3_Click(object sender, EventArgs e)
        {
            hWindowControl1.HalconWindow.ClearWindow();
            hd.sample(hWindowControl1.HalconWindow);
        }
        private void button4_Click(object sender, EventArgs e)
        {
        }
    }
}

奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
Criss 发表于 2017-11-9 11:20:34 | 显示全部楼层
确实可以看的出来你的C#基础比较差了哦!1.你的HDevelopExport 这个类,里面的很多功能函数都可以提取出来作为单独的函数即可;
我需要在public void Threshold(HTuple Window) 這個方法內引用public void Opencamera(HTuple Window)裡面的ho_image來做二值化,不過沒辦法直接使用,需要變成每個方法都從頭開一次相機,請問如何引用才會簡潔呢?

2.如果你要想把图像进行二值化,首先要么把图片当成参数传入处理的方法,要么就直接把图像作为 Form1类的成员变量就可以了。另外采集图像请用同步采集不要用异步的:
  1. HOperatorSet.GrabImage(out ho_Image, hv_AcqHandle);
复制代码
創建完板模後(out hv_ModelID1),要如何存檔hv_ModelID1編排,C#才可以後續使用find的指令取得當下圖片中的座標位置跟角度呢?

3.创建模板完成以后请hv_ModelID1也编程Form1来的成员变量,这样在程序中你都可以调用,当然如果你想以后也调用,就把hv_ModelID1存到文件里面去,类似:
  1. write_shape_model (hv_ModelID1,'1.shm')
复制代码
之前有嘗試過在public partial class HDevelopExport取得裡面的參數,如何編排才可以在後續的控件中擊點顯示在label1.Text上呢?     無法直接寫

4.请把HDevelopExport类里面的函数和内容提取出来单独放到一个文件,然后用对象方式也是可以访问的,如果需要在界面上显示,请参考下面:
  1. label1.text=hv_Row.D.toString;
复制代码
在Halcon导出的控制类型的变量如果要转换C#的变量一定要清楚你的Halcon变量是什么类型,然后再确定怎么转换出来:
  1. string s = Hv_HalconVar.S
  2. double d = Hv_HalconVar.D
  3. int n = Hv_HalconVar.I
复制代码

如果需要把double类型的Halcon变量转string类型的C#,请使用HalconVariable.D.toString()即可。






奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
 楼主| Ryder 发表于 2017-11-15 12:23:52 | 显示全部楼层
51Halcon 发表于 2017-11-9 11:20
确实可以看的出来你的C#基础比较差了哦!1.你的HDevelopExport 这个类,里面的很多功能函数都可以提取出来 ...

謝謝您的幫忙,請問適用物件導向的方法來存值嗎
請問如果要把圖片或值
變成,是要在from那個class裡面新增一個class

如下

    class Data
    {
        public int X=1;
        public int Y=1;

        public void GetXY(int row, int col)
        {
            X = row;
            Y = col;
        }

    }

然後在HDevelopExport类里面,我要的地方
輸入
Data N = new Data();
N.GetXY(row,col);

不過接下來我在主程式的地方,卻不能直接調用N.X跟N.Y
"名稱N不存在目前的內容中"

謝謝幫忙。
奖励计划已经开启,本站鼓励作者发布最擅长的技术内容和资源,流量变现就在现在,[点我]加入吧~~~Go
您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表