using HalconDotNet;
using LB_VisionControls;
using System.Data.Common;
using LB_VisionProcesses.Alogrithms;
using System.Windows.Forms;
using static LB_VisionProcesses.Alogrithms.PointsCloudConvertTool;
using OpenCvSharp;
using System;
using static System.Windows.Forms.VisualStyles.VisualStyleElement;
using System.Diagnostics;
namespace LB_VisionProcesses.Alogrithms
{
public partial class PointsCloudConvertToolEdit : TAlgorithmEdit
{
HWindowControl inputImageHSmartWindowControl = new HWindowControl();
HWindowControl recordImageHSmartWindowControl = new HWindowControl();
public PointsCloudConvertToolEdit(PointsCloudConvertTool subject = null)
{
if (subject != null && subject is PointsCloudConvertTool)
{
Subject = subject;
}
else
{
Subject = new PointsCloudConvertTool();
}
this.Dock = DockStyle.Fill;
InitializeComponent();
}
///
/// 控件加载事件
///
///
///
private void PointsCloudConvertToolEdit_Load(object sender, EventArgs e)
{
pnlInputImage.Controls.Add(inputImageHSmartWindowControl);
inputImageHSmartWindowControl.Dock = DockStyle.Fill;
pnlRecordImage.Controls.Add(recordImageHSmartWindowControl);
recordImageHSmartWindowControl.Dock = DockStyle.Fill;
//遍历可以选择的Roi类型枚举
foreach (var value in Enum.GetValues(typeof(RoiType)))
{
cmbTypeRoi.Items.Add(value.ToString());
}
//遍历可以选择的Fixture枚举
cmbFixture.Items.Add("");
foreach (string value in IProcess.dicFixtures.Keys)
{
cmbFixture.Items.Add(value.ToString());
}
//遍历可以选择的图片格式枚举
foreach (var value in Enum.GetValues(typeof(ImageType)))
{
cmbInputType.Items.Add(value.ToString());
cmbOutputType.Items.Add(value.ToString());
}
//foreach (var value in Enum.GetValues(typeof(PixelType)))
// cmbAfterType.Items.Add(value.ToString());
cmbTypeRoi.Text = RoiType.None.ToString();
LoadParas();
if (Subject.Result)
{
lblResult.BackColor = Color.Green;
lblResult.Text = "True";
}
else
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
}
lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg;
lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg);
lblRunTime.Text = $"{Subject.RunTime}ms";
// 把窗口对象推窗口栈中
HDevWindowStack.Push(inputImageHSmartWindowControl.HalconWindow);
HDevWindowStack.Push(recordImageHSmartWindowControl.HalconWindow);
}
///
/// 更新运行参数
///
public override void UpdataInputs()
{
double dResult = 0;
//设置运行参数
Subject.Params.Inputs["输入格式"] = cmbInputType.SelectedItem.ToString();
Subject.Params.Inputs["输出格式"] = cmbOutputType.SelectedItem.ToString();
Subject.Params.Inputs["是否后处理"] = ckbAfter.Checked;
if (cmbFixture.Text == "")
{
Subject.Params.Fixture = new Fixture();
}
else if (IProcess.dicFixtures.ContainsKey(cmbFixture.Text))
{
Subject.Params.Fixture = IProcess.dicFixtures[cmbFixture.Text];
}
//Type type = inputImageHSmartWindowControl.oRoi?.GetType();
//switch (type)
//{
// case Type t when t == typeof(HRectangle2):
// HRectangle2 hRectangle2 = (HRectangle2)inputImageHSmartWindowControl.oRoi;
// Subject.Params.ROI
// = new HRectangle2(hRectangle2.X - Subject.Params.Fixture.X, hRectangle2.Y - Subject.Params.Fixture.Y
// , hRectangle2.Phi - Subject.Params.Fixture.Phi, hRectangle2.Width, hRectangle2.Height);
// break;
// case Type t when t == typeof(HCircle):
// HCircle hCircle = (HCircle)inputImageHSmartWindowControl.oRoi;
// Subject.Params.ROI
// = new HCircle(hCircle.X - Subject.Params.Fixture.X, hCircle.Y - Subject.Params.Fixture.Y, hCircle.Radius);
// break;
// case Type t when t == typeof(HSegment):
// HSegment hSegment = (HSegment)inputImageHSmartWindowControl.oRoi;
// Subject.Params.ROI
// = new HSegment(hSegment.StartX - Subject.Params.Fixture.X, hSegment.StartY - Subject.Params.Fixture.Y
// , hSegment.EndX - Subject.Params.Fixture.X, hSegment.EndY - Subject.Params.Fixture.Y);
// break;
// default:
// Subject.Params.ROI = new ROI();
// break;
//}
}
///
/// 加载运行参数
///
public override void LoadParas()
{
this.BeginInvoke(new Action(() =>
{
cmbInputType.Text = Subject.Params.Inputs["输入格式"].ToString();
cmbOutputType.Text = Subject.Params.Inputs["输出格式"].ToString();
ckbAfter.Checked = Convert.ToBoolean(Subject.Params.Inputs["是否后处理"]);
//cmbAfterType.Text = Subject.Params.Inputs["后处理格式"].ToString();
if (Subject.InputImage != null)
{
if (Subject.InputImage is HObject)
{
TAlgorithm.DispImage((HObject)Subject.InputImage, inputImageHSmartWindowControl.HalconWindow);
}
else if (Subject.InputImage is HTuple)
{
btnLoadImage.Enabled = false;
btnLoadParas.Enabled = false;
HOperatorSet.ClearWindow(inputImageHSmartWindowControl.HalconWindow);
// 显示3D模型
Task.Run(() =>
{
HTuple hv_Pose = new HTuple();
HTuple hv_CamParam = new HTuple();
HTuple hv_GenParamName = new HTuple();
HTuple hv_GenParamValue = new HTuple();
hv_GenParamName = new HTuple("lut", "intensity");
hv_GenParamValue = new HTuple("color1", "coord_z");
TAlgorithm.visualize_object_model_3d(inputImageHSmartWindowControl.HalconWindow
, (HTuple)Subject.InputImage, hv_CamParam,
hv_Pose, hv_GenParamName, hv_GenParamValue, "显示3D点云模型",
new HTuple(), new HTuple(), out HTuple poseOut);
btnLoadImage.Enabled = true;
btnLoadParas.Enabled = true;
});
}
}
Type type = Subject.Params.ROI?.GetType();
if (Subject.Params.ROI != null)
{
switch (type)
{
case Type t when t == typeof(HRectangle2):
{
cmbTypeRoi.Text = RoiType.Rectangle2.ToString();
break;
}
case Type t when t == typeof(HCircle):
{
cmbTypeRoi.Text = RoiType.Circle.ToString();
break;
}
case Type t when t == typeof(HSegment):
{
cmbTypeRoi.Text = RoiType.Segment.ToString();
break;
}
default:
{
cmbTypeRoi.Text = RoiType.None.ToString();
break;
}
}
if (cmbTypeRoi.Text.ToString() != "None")
{
ckbDrawRoi.Checked = true;
}
else
{
ckbDrawRoi.Checked = false;
}
//inputImageHSmartWindowControl.oRoi = Subject.Params.ROI;
}
if (Subject.Params.Fixture != null)
{
cmbFixture.Text = Subject.Params.Fixture.strName;
}
else
{
cmbFixture.Text = "";
}
//switch (type)
//{
// case Type t when t == typeof(HRectangle2):
// inputImageHSmartWindowControl.oRoi
// = new HRectangle2(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
// , Subject.Params.ROI.Phi + Subject.Params.Fixture.Phi, ((HRectangle2)Subject.Params.ROI).Width, ((HRectangle2)Subject.Params.ROI).Height);
// break;
// case Type t when t == typeof(HCircle):
// inputImageHSmartWindowControl.oRoi
// = new HCircle(Subject.Params.ROI.X + Subject.Params.Fixture.X, Subject.Params.ROI.Y + Subject.Params.Fixture.Y
// , ((HCircle)Subject.Params.ROI).Radius);
// break;
// case Type t when t == typeof(HSegment):
// inputImageHSmartWindowControl.oRoi
// = new HSegment(((HSegment)Subject.Params.ROI).StartX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).StartY + Subject.Params.Fixture.Y
// , ((HSegment)Subject.Params.ROI).EndX + Subject.Params.Fixture.X, ((HSegment)Subject.Params.ROI).EndY + Subject.Params.Fixture.Y);
// break;
// default:
// inputImageHSmartWindowControl.oRoi = null;
// break;
//}
}));
}
///
/// 更新输出结果
///
public override void UpdataOutputs()
{
this.BeginInvoke(new Action(() =>
{
}));
}
///
/// 点击运行
///
///
///
public override void btnRun_Click(object sender, EventArgs e)
{
if (Subject.InputImage != null)
{
InputImage = Subject.InputImage;
}
DateTime StartTime = DateTime.Now;
Run();
//更新日志与结果
this.BeginInvoke(new Action(() =>
{
if (Subject.Result)
{
lblResult.BackColor = Color.Green;
lblResult.Text = "True";
//recordImageHSmartWindowControl.SetColor("green");
}
else
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
//recordImageHSmartWindowControl.SetColor("red");
}
lblMsg.Text = Msg.Length > 50 ? Msg.Substring(0, 50) : Msg;
lblMsgToolTip.SetToolTip(BtmStatusStrip, Msg);
lblRunTime.Text = $"{(DateTime.Now - StartTime).TotalMilliseconds}ms";
UpdataOutputs();
imgTabControl.SelectedTab = tabPageRecordImage;
if (Subject.OutputImage != null)
{
if (Subject.OutputImage is HObject)
{
TAlgorithm.DispImage((HObject)Subject.OutputImage, recordImageHSmartWindowControl.HalconWindow);
}
else if (Subject.OutputImage is HTuple)
{
btnRun.Enabled = false;
HOperatorSet.ClearWindow(recordImageHSmartWindowControl.HalconWindow);
// 显示3D模型
Task.Run(() =>
{
HTuple hv_Pose = new HTuple();
HTuple hv_CamParam = new HTuple();
HTuple hv_GenParamName = new HTuple();
HTuple hv_GenParamValue = new HTuple();
//hv_GenParamName = new HTuple("lut", "intensity");
//hv_GenParamValue = new HTuple("color1", "coord_z");
hv_GenParamName = new HTuple("disp_pose", "color_attrib", "lut");
hv_GenParamValue = new HTuple("true", "coord_z", "color1");
TAlgorithm.visualize_object_model_3d(recordImageHSmartWindowControl.HalconWindow
, (HTuple)Subject.OutputImage, hv_CamParam,
hv_Pose, hv_GenParamName, hv_GenParamValue, "显示3D点云模型",
new HTuple(), new HTuple(), out HTuple poseOut);
btnRun.Enabled = true;
});
}
}
//先判断子类再判断父类
//if (Subject.Record != null && Subject.Record is MsgRecord)
//{
// MsgRecord MsgRecord = (MsgRecord)Subject.Record;
// recordImageHSmartWindowControl.DispObj(MsgRecord.RecordObject);
// for (int i = 0; i < MsgRecord.Msg.Length; i++)
// recordImageHSmartWindowControl.ShowMsg(MsgRecord.Msg[i], Subject.Result, MsgRecord.Column[i], MsgRecord.Row[i]);
//}
//else if (Subject.Record != null && Subject.Record is ObjectRecord)
// recordImageHSmartWindowControl.DispObj(((ObjectRecord)Subject.Record).RecordObject);
GC.Collect();
}));
}
public override void btnLoadImage_Click(object sender, EventArgs e)
{
OpenFileDialog openFileDialog = new OpenFileDialog();
// 设置文件对话框的属性
openFileDialog.Multiselect = false; // 不允许多选
// 设置文件过滤器,支持多种文件类型
bool bEnumParseSuccess = Enum.TryParse(cmbInputType.Text, out ImageType eInputImageType);
if (bEnumParseSuccess)
{
switch (eInputImageType)
{
case ImageType.DeepImage:
{
openFileDialog.Filter = "Image Files (*.tif;*.tiff)|*.tif;*.tiff|All Files (*.*)|*.*";
break;
}
case ImageType.PointsCloud:
{
openFileDialog.Filter = "Image Files (*.om3)|*.om3|All Files (*.*)|*.*";
break;
}
default:
{
return;
}
}
}
else
{
return;
}
// 显示文件对话框
DialogResult result = openFileDialog.ShowDialog();
// 处理对话框返回结果
if (result == DialogResult.OK)
{
// 获取用户选择的文件名
string[] selectedFiles = openFileDialog.FileNames;
if (selectedFiles.Length > 0)
{
if (bEnumParseSuccess)
{
switch (eInputImageType)
{
case ImageType.DeepImage:
{
HOperatorSet.ReadImage(out HObject ho_Image, selectedFiles[0]);
if (ho_Image == null)
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
lblMsg.Text = $"图片导入失败,路径为{selectedFiles[0]}";
return;
}
Subject.InputImage = ho_Image;
imgTabControl.SelectedTab = tabPageInputImage;
TAlgorithm.DispImage(ho_Image, inputImageHSmartWindowControl.HalconWindow);
break;
}
case ImageType.PointsCloud:
{
HOperatorSet.ReadObjectModel3d(selectedFiles[0], "m", new HTuple(), new HTuple()
, out HTuple hv_ObjectModel3D, out HTuple hv_Status);
if (hv_ObjectModel3D == null)
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
lblMsg.Text = $"图片导入失败,路径为{selectedFiles[0]}";
return;
}
Subject.InputImage = hv_ObjectModel3D;
imgTabControl.SelectedTab = tabPageInputImage;
btnLoadImage.Enabled = false;
HOperatorSet.ClearWindow(inputImageHSmartWindowControl.HalconWindow);
// 显示3D模型
Task.Run(() =>
{
HTuple hv_Pose = new HTuple();
HTuple hv_CamParam = new HTuple();
HTuple hv_GenParamName = new HTuple();
HTuple hv_GenParamValue = new HTuple();
//hv_GenParamName = new HTuple("lut", "intensity");
//hv_GenParamValue = new HTuple("color1", "coord_z");
hv_GenParamName = new HTuple("disp_pose", "color_attrib", "lut");
hv_GenParamValue = new HTuple("true", "coord_z", "color1");
TAlgorithm.visualize_object_model_3d(inputImageHSmartWindowControl.HalconWindow
, hv_ObjectModel3D, hv_CamParam,
hv_Pose, hv_GenParamName, hv_GenParamValue, "显示3D点云模型",
new HTuple(), new HTuple(), out HTuple poseOut);
btnLoadImage.Enabled = true;
});
break;
}
default:
{
lblResult.BackColor = Color.Red;
lblResult.Text = "False";
lblMsg.Text = $"不支持输入格式[{cmbInputType.Text}]";
return;
}
}
}
}
}
}
public override void btnSaveParas_Click(object sender, EventArgs e) { base.btnSaveParas_Click(sender, e); }
public override void ckbDrawRoi_CheckedChanged(object sender, EventArgs e)
{
//if (ckbDrawRoi.Checked)
//{
// inputImageHSmartWindowControl.bAollowDraw = true;
// imgTabControl.SelectedTab = tabPageInputImage;
//}
//else
//{
// inputImageHSmartWindowControl.bAollowDraw = false;
// Subject.Params.ROI = null;
//}
}
public override void cmbTypeRoi_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
//if (Enum.TryParse(cmbTypeRoi.Text.ToString(), out RoiType type))
//{
// HTuple hv_imageWidth = 0;
// HTuple hv_imageHeight = 0;
// if (InputImage != null && InputImage is HObject)
// HOperatorSet.GetImageSize((HObject)InputImage, out hv_imageWidth, out hv_imageHeight);
// switch (type)
// {
// case RoiType.Rectangle2:
// inputImageHSmartWindowControl.oRoi
// = new HRectangle2(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2, 0
// , hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4);
// break;
// case RoiType.Circle:
// inputImageHSmartWindowControl.oRoi
// = new HCircle(hv_imageWidth.TupleReal() / 2, hv_imageHeight.TupleReal() / 2, hv_imageWidth.TupleReal() / 4);
// break;
// case RoiType.Segment:
// inputImageHSmartWindowControl.oRoi
// = new HSegment(0, 0, hv_imageWidth.TupleReal() / 4, hv_imageHeight.TupleReal() / 4);
// break;
// case RoiType.None:
// default:
// inputImageHSmartWindowControl.oRoi = null;
// break;
// }
//}
}
catch { }
}
public override void cmbFixture_SelectedIndexChanged(object sender, EventArgs e)
{
try
{
if (IProcess.dicFixtures.ContainsKey(cmbFixture.Text))
{
Subject.Params.Fixture = IProcess.dicFixtures[cmbFixture.Text];
}
else
{
Subject.Params.Fixture = new Fixture();
}
}
catch { }
}
private void ckbAfter_CheckedChanged(object sender, EventArgs e)
{
cmbAfterType.Enabled = ckbAfter.Checked;
}
private void btnSaveImage_Click(object sender, EventArgs e)
{
// 创建 SaveFileDialog 实例
using (SaveFileDialog saveFileDialog = new SaveFileDialog())
{
// 设置对话框标题
saveFileDialog.Title = "保存文件";
// 设置默认路径
saveFileDialog.InitialDirectory = Application.StartupPath;
bool bEnumParseSuccess = Enum.TryParse(cmbOutputType.Text, out ImageType eOutputImageType);
if (bEnumParseSuccess && Subject.OutputImage != null)
{
switch (eOutputImageType)
{
case ImageType.DeepImage:
{
// 设置文件类型过滤器
saveFileDialog.Filter = "图像文件 (*.tif)|*.tif|所有文件 (*.*)|*.*";
// 设置默认文件名
saveFileDialog.FileName = "output.tif";
break;
}
case ImageType.PointsCloud:
{
// 设置文件类型过滤器
saveFileDialog.Filter = "图像文件 (*.om3)|*.om3|所有文件 (*.*)|*.*";
// 设置默认文件名
saveFileDialog.FileName = "output.om3";
break;
}
default:
{
return;
}
}
}
else
{
return;
}
// 显示对话框并检查用户是否点击了保存按钮
if (saveFileDialog.ShowDialog() == DialogResult.OK)
{
// 获取用户选择的文件路径
string fullPath = saveFileDialog.FileName;
Debug.WriteLine("选择的文件路径是: " + fullPath);
if (!string.IsNullOrEmpty(fullPath))
{
if (bEnumParseSuccess)
{
switch (eOutputImageType)
{
case ImageType.DeepImage:
{
try
{
if (Subject.OutputImage is HObject ho_Image)
HOperatorSet.WriteImage(ho_Image, "bmp", 0, fullPath);
}
catch { }
break;
}
case ImageType.PointsCloud:
{
try
{
if (Subject.OutputImage is HTuple hv_Image)
HOperatorSet.WriteObjectModel3d(hv_Image
, "om3", fullPath, new HTuple(), new HTuple());
}
catch { }
break;
}
default:
{
return;
}
}
}
}
}
}
}
}
}