前言
本文将通过具体实例,详细介绍如何在 winform +halcon 中实现图像的缩放、平移以及实时显示灰度值等交互功能,帮助大家快速掌握这一实用技能,提升图像处理应用的开发效率和用户体验。
初始化窗口
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);
}
}
}
总结
本文介绍了如何在 winform 应用程序中使用 halcon 实现图像缩放等功能。
通过初始化 halcon 窗口,添加图像缩放、平移和实时显示灰度值功能,我们可以在 winform 界面中高效地处理图像。
具体步骤包括:
1、初始化窗口:根据使用的控件类型(picturebox 或 hwindowcontrol),选择合适的初始化方法。
2、添加图像缩放功能:通过鼠标滚轮事件,调用 hoperatorset.setpart 方法实现图像的缩放。
3、添加图像平移功能:捕获鼠标按下和抬起事件,计算坐标差值,调用 hoperatorset.setpart 方法实现图像平移。
4、实时显示灰度值:在鼠标移动事件中,获取当前像素点的灰度值并显示在界面上。
功能的实现不仅提升了用户与图像的交互体验,还为图像处理应用提供了强大的支持。
通过这些步骤,我们可以在 winform 应用中轻松集成 halcon,实现复杂的图像处理功能。
最后
到此这篇关于基于winform+halcon实现图像缩放与交互功能的文章就介绍到这了,更多相关winform halcon图像缩放与交互内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论