using HalconDotNet;
|
using LB_SmartVisionCommon;
|
using LB_VisionControl;
|
using System;
|
using System.Collections.Generic;
|
using System.Drawing.Imaging;
|
using System.Linq;
|
using System.Text;
|
using System.Threading.Tasks;
|
|
namespace LB_VisionProcesses.Alogrithms.Halcon
|
{
|
public enum ImageFilterType { Mean, Guass, Median }
|
|
[Process("Halcon2D图像滤波", Category = "Halcon2D工具", Description = "创建滤波工具")]
|
public class HFilterTool : TAlgorithm
|
{
|
public HFilterTool()
|
{
|
strProcessClass = "LB_VisionProcesses.Alogrithms.Halcon.HFilterTool";
|
strProcessName = "Halcon2D图像滤波工具";
|
|
Params.Inputs.Add("滤波器类型", "均值滤波");
|
Params.Inputs.Add("掩膜宽", 1);
|
Params.Inputs.Add("掩膜高", 1);
|
//mean_image(Image : ImageMean : MaskWidth, MaskHeight : )
|
|
Params.Inputs.Add("滤波器类型", "高斯滤波");
|
Params.Inputs.Add("高斯核尺寸", 1.0);
|
//gauss_filter(Image : ImageGauss : Size : )
|
|
Params.Inputs.Add("滤波器类型", "中值滤波");
|
Params.Inputs.Add("掩膜宽", 1);
|
Params.Inputs.Add("掩膜高", 1);
|
//median_rect(Image : ImageMedian :MaskWidth,MaskHeight:)
|
|
Params.ROI = new HSegment(0, 0, 250, 250);
|
}
|
|
List<RecordFilterData> recordFilterDatas = new List<RecordFilterData>();
|
/// <summary>
|
/// 算子逻辑
|
/// </summary>
|
public override void TAlgorithmMain()
|
{
|
#region 初始化变量
|
HObject ho_Regions, ho_LineXld;
|
HOperatorSet.GenEmptyObj(out ho_Regions);
|
HOperatorSet.GenEmptyObj(out ho_LineXld);
|
#endregion
|
|
try
|
{
|
if (InputImage == null)
|
{
|
Msg = "输入图片为空";
|
Result = false;
|
return;
|
}
|
if (InputImage is Bitmap)
|
{
|
try
|
{
|
using (HImage hImage = new HImage())
|
{
|
Bitmap bitmap = (Bitmap)InputImage;
|
Rectangle rect = new Rectangle(0, 0, ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height);
|
BitmapData srcBmpData = ((Bitmap)bitmap).LockBits(rect, ImageLockMode.ReadOnly, PixelFormat.Format32bppRgb);
|
hImage.GenImageInterleaved(srcBmpData.Scan0, "rgbx", ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height, 0, "byte", ((Bitmap)bitmap).Width, ((Bitmap)bitmap).Height, 0, 0, -1, 0);
|
((Bitmap)bitmap).UnlockBits(srcBmpData);
|
bitmap.Dispose();
|
bitmap = null;
|
InputImage = null;
|
InputImage = hImage.Clone();
|
}
|
}
|
catch (Exception ex)
|
{
|
}
|
}
|
if (!(InputImage is HObject))
|
{
|
Msg = "输入图片格式不为HObject";
|
Result = false;
|
return;
|
}
|
#region 裁剪区域
|
//if (!(Params.ROI is HSegment))
|
//{
|
// Msg = "ROI类型错误,必须为HSegment类型";
|
// Result = false;
|
// return;
|
//}
|
|
//if (!(InputImage is HObject))
|
//{
|
// Msg = "输入图片类型错误,必须为HObject类型";
|
// Result = false;
|
// return;
|
//}
|
|
//HObject DomainImage = ((HObject)InputImage)?.CopyObj(1, -1);
|
object DomainImage = null;
|
if (!ReduceDomainImage(InputImage, ref DomainImage))
|
{
|
Msg = "裁剪区域失败";
|
Result = false;
|
return;
|
}
|
#endregion
|
|
#region 算子逻辑
|
Record = new ObjectRecord();
|
HObject hoDomainImage = DomainImage as HObject;
|
HTuple hv_Channels = new HTuple();
|
//判断是否为灰度图
|
using (HDevDisposeHelper dh = new HDevDisposeHelper())
|
{
|
try
|
{
|
HOperatorSet.CountChannels(hoDomainImage, out hv_Channels);
|
if (hv_Channels.TupleInt() != 1)
|
HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage);
|
|
//转换后再次检查是否为灰度图
|
HOperatorSet.CountChannels(hoDomainImage, out hv_Channels);
|
if (hv_Channels.TupleInt() != 1)
|
{
|
HOperatorSet.Rgb1ToGray(hoDomainImage, out hoDomainImage);
|
Msg = "输入图片不为灰度图";
|
Result = false;
|
return;
|
}
|
}
|
catch
|
{
|
Msg = "输入图片不为灰度图且转换失败";
|
Result = false;
|
return;
|
}
|
}
|
|
int hv_MaskWidth = Convert.ToInt16(Params.Inputs["掩膜宽"]);
|
int hv_MaskHight = Convert.ToInt16(Params.Inputs["掩膜高"]);
|
int hv_Size = Convert.ToInt16(Params.Inputs["高斯核尺寸"]);
|
|
recordFilterDatas = FilterManager.Instance.GetAllUsers();
|
|
string hv_FilterType = "";
|
foreach (var recordFilterData in recordFilterDatas)
|
{
|
switch (recordFilterData.FilterName)
|
{
|
case FilterType.均值滤波_MeanImage:
|
hv_FilterType = "mean";
|
hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth);
|
hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight);
|
Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
|
break;
|
case FilterType.高斯滤波_GaussFilter:
|
hv_FilterType = "gauss";
|
hv_Size = Convert.ToInt16(recordFilterData.GaussSize);
|
Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
|
break;
|
case FilterType.中值滤波_MedianRect:
|
hv_FilterType = "median";
|
hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth);
|
hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight);
|
Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
|
break;
|
default:
|
hv_FilterType = "median";
|
hv_MaskWidth = Convert.ToInt16(recordFilterData.MaskWidth);
|
hv_MaskHight = Convert.ToInt16(recordFilterData.MaskHight);
|
Filter(hoDomainImage, out ho_Regions, hv_FilterType, hv_MaskWidth, hv_MaskHight, hv_Size);
|
break;
|
}
|
|
|
}
|
|
#endregion
|
|
|
#region 生成OutputImage给后续处理
|
try
|
{
|
OutputImage = hoDomainImage;
|
}
|
catch (Exception ex)
|
{
|
Msg = "生成OutputImage失败,原因是:" + ex.ToString();
|
Result = false;
|
return;
|
}
|
#endregion
|
|
if (Msg == "运行超时")
|
{
|
Result = false;
|
return;
|
}
|
|
Msg = "运行成功";
|
Result = true;
|
return;
|
}
|
catch (Exception ex)
|
{
|
Msg = "运行失败,原因是:" + ex.ToString().TrimEnd();
|
OutputImage = null;
|
Result = false;
|
return;
|
}
|
finally
|
{
|
if (!Result)
|
{
|
Params.Outputs.Add("Segment", new HSegment());
|
}
|
|
bCompleted = true;
|
#region 内存释放
|
ho_Regions.Dispose();
|
#endregion
|
}
|
}
|
}
|
}
|