热点推荐

查看: 1298|回复: 3
收起左侧

[待解决] Halcon板模匹配+C# 練習案子!!新手編排方法

[复制链接]

该用户从未签到

1

主题

2

帖子

157

积分

Rank: 1

积分
157
发表于 2017-11-9 10:57:56 | 显示全部楼层 |阅读模式

51Halcon诚邀您的加入,专注于机器视觉开发与应用技术,我们一直都在努力!

您需要 登录 才可以下载或查看,没有帐号?会员注册

x
大家好,謝謝網站上哥們幫忙,讓我進入這一個領域。
這兩個月來自學遇到一些問題。
我覺得自己的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)
        {
        }
    }
}

发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

面向企业销售智能软件带相机和镜头,仅需3500,来电咨询 15019223858  18520862540
  • TA的每日心情
    耍酷
    昨天 10:23
  • 签到天数: 538 天

    连续签到: 2 天

    [LV.9]以坛为家II

    347

    主题

    1290

    帖子

    6147

    积分

    Rank: 9

    积分
    6147

    突出贡献优秀版主荣誉管理论坛元老优质会员最佳新人

    发表于 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()即可。






    无效附件更新 权限提升操作 删帖申请 举报以及其他需要帮助请加入QQ群:214663141 广告位招商 有意者联系

    该用户从未签到

    1

    主题

    2

    帖子

    157

    积分

    Rank: 1

    积分
    157
     楼主| 发表于 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不存在目前的內容中"

    謝謝幫忙。

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    该用户从未签到

    0

    主题

    8

    帖子

    17

    积分

    Rank: 1

    积分
    17
    发表于 2018-7-25 09:22:55 | 显示全部楼层
    谢谢分享!

    发帖求助前要善用论坛搜索功能,那里可能会有你要找的答案;

    如果你在论坛求助问题,并且已经从坛友或者管理的回复中解决了问题,请把帖子分类或者标题前面加上【已解决】

    回报帮助你解决问题的坛友,右下角【免费评分】赠与对方视觉币和热心值,伸手党遭人唾弃,做一个热心并受欢迎的人!

    您需要登录后才可以回帖 会员登录 | 会员注册

    本版积分规则

    经营性网站备案信息 经营性网站
    备案信息

    中国互联网举报中心 中国互联网
    举报中心

    中国文明网传播文明 中国文明网
    传播文明

    诚信网站

    深圳市市场监督管理局企业主体身份公示 工商网监
    电子标识