c#调用halcon写一个根据鼠标获得当前坐标灰度值的程序

来源:互联网 发布:淘宝网找新疆核桃 编辑:程序博客网 时间:2024/05/29 10:25

开始写这个博客是为了将学习c#、halcon和图像处理过程中得到的一些小见解小感悟记录下来。本文介绍的是c#调用halcon空间,得到当前鼠标位置灰度值的小程序。首先在这里默认看这文章的都是已经掌握了halcon和c#联合编程的基础知识,如果不清楚请参考查阅其它相关文章。

要实现鼠标获取当前位置灰度值,首先基本思路是:在窗体中添加halcon的窗体,用于读图显示,再添加MouseDown事件来获取当前坐标值,利用得到的坐标值代入halcon的GetGrayval算子中得到灰度值。结果如下:

图片1

一切看起来顺风顺水没什么困难。由于上面的程序只是处理单一固定图片的,于是我想改成能获取任意图片灰度值的程序,就添加了个读取文件的控件OpenFileDialog。然后就出现问题了,主要问题有两个:一是由于不同图片的大小不同,所以显示的图片可能会不铺满窗体:

图片2

二是在鼠标移动获取灰度值的时候,会出现下面的错误:

图片3

首先问题一是因为图片尺寸和预设的窗体大小不同而出现,解决方法是获取图像大小,再调用更改窗体尺寸的算子,这样图片显示就没问题了。需要注意的是,这里需要同时使用这些算子:

HOperatorSet.GetImageSize(image, out X, out Y);
        hWindowControl1.Size = new System.Drawing.Size(X,Y);
        hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, X, Y);

如果只使用hWindowControl1.Size = new System.Drawing.Size(X, Y);,那么设置的是窗口的大小,还是不能铺满窗口;如果只使用hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, X, Y);,则设置的是窗口中画布的大小,图像会铺满窗口导致变形。所以需要一起使用,使得窗口大小和画布大小一致,使显示效果和原图一致。

图片4

然而这时候,问题二的#1301错误还是存在,最后发现,原来在如下代码出现了问题:

row = (int)e.X;

        col = (int)e.Y;

        HOperatorSet.GetGrayval(image, row, col, out grayval);

原来是程序中鼠标点击获得的X、Y坐标,和GetGrayval算子的到的行row,列col的对应关系有问题,我开始以为是X→row,Y→col,原来正确的对应关系是:

X→col,Y→row,希望各位注意。

最后我的程序效果如下:

图片5

附上部分代码:

//读图        private void button2_Click(object sender, EventArgs e)        {            HTuple X = new HTuple();            HTuple Y = new HTuple();                OpenFileDialog file = new OpenFileDialog();                file.Filter = "|*.bmp; *.png; *.jpg";                if (file.ShowDialog() == DialogResult.OK)                {                    adr = file.FileName;                    HObject image;                    HOperatorSet.ReadImage(out image, adr);                    HOperatorSet.GetImageSize(image, out X, out Y);                    hWindowControl1.Size = new System.Drawing.Size(X,Y);                    hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, X, Y);                    HOperatorSet.DispObj(image, hWindowControl1.HalconWindow);                    flag = true;                }                                }        //清空窗口        private void button3_Click(object sender, EventArgs e)        {            HOperatorSet.ClearWindow(hWindowControl1.HalconWindow);            flag = false;        }        //鼠标点击获取灰度值        private void hWindowControl1_HMouseDown(object sender, HMouseEventArgs e)        {                        if (flag)            {                HTuple X = new HTuple();                HTuple Y = new HTuple();                HObject image;                HTuple row = new HTuple();                HTuple col = new HTuple();                HTuple grayval = new HTuple();                HOperatorSet.ReadImage(out image, adr);                HOperatorSet.GetImageSize(image, out X, out Y);                hWindowControl1.Size = new System.Drawing.Size(X, Y);                hWindowControl1.ImagePart = new System.Drawing.Rectangle(0, 0, X, Y);                row = (int)e.X;                col = (int)e.Y;                HOperatorSet.GetGrayval(image, col,row , out grayval);                MessageBox.Show("当前坐标:  X:" + row.ToString() + "  Y: " + col.ToString() + "  灰度值  " + grayval.ToString());            }        }

希望对大家有一点点启发或者帮助。另外我想问问怎么上传附件,源程序想上传不知道怎么弄。

原创粉丝点击