当前位置: 首页 > article >正文

如何做一个C#仿Halcon Calibration插件

安装部分目标效果

安装部分实现效果

这两部分的核心为

HOperatorSet.GenCaltab(xNum, yNum, markDis, ratio, descrFilePath, psFilePath);

标定部分目标效果

标定部分实现效果

本部分主要有四个核心部分

1,导入图像  

            主要是创建文件夹浏览对话框
            var dialog = new FolderBrowserDialog();
            if (dialog.ShowDialog() == DialogResult.OK)

2,根据用户的选择,显示对应的图像

 /// <summary>
 /// ListView根据用户的选择,显示对应的图像
 /// </summary>
 /// <param name="sender"></param>
 /// <param name="e"></param>
 private void listView1_SelectedIndexChanged(object sender, EventArgs e)
 {
     //进行判定,如果一项没有选中就不往下走
     if (listView1.SelectedItems.Count == 0)
     {
         return;
     }
     //获取当前选择项下标
     var selectIndex = listView1.SelectedItems[0].Index;
     //更新显示图像
     pictureBox1.Image = Image.FromFile(files[selectIndex].FullName);
 }

3,设置位姿

  /// <summary>
  /// 设置参考位姿按键
  /// </summary>
  /// <param name="sender"></param>
  /// <param name="e"></param>
  private void btn_SetPose_Click(object sender, EventArgs e)
  {
      //设置参考位姿的颜色
      var NowColor = Color.DarkCyan;

      try
      {
          //把所有的设置重置
          for (int i = 0; i < listView1.Items.Count; i++)
          {

              if (listView1.Items[i].BackColor == NowColor)
              {
                  listView1.Items[i].BackColor = origionColor;
              }
          }
          //获取当前选择项下标  方式1
          selectIndexPose = listView1.SelectedItems[0].Index;
          //获取当前选择项下标  方式2
          //var selectIndex2 = listView1.Items.IndexOf(listView1.FocusedItem);
          //设置背景颜色
          listView1.Items[selectIndexPose].BackColor = NowColor;
      }
      catch (Exception)
      {

          MessageBox.Show("设置参考位姿失败");
      }
  }

4,执行标定

 //生成相机的参数
 GenCamPar();
 //创建标定对象
 HOperatorSet.CreateCalibData("calibration_object", 1, 1, out var calibDataID);
 //设置相机参数
 HOperatorSet.SetCalibDataCamParam(calibDataID, 0, new HTuple(), startcamParm);
 //设置标定板描述文件
 HOperatorSet.SetCalibDataCalibObject(calibDataID, 0, tbx_SetPsPath.Text);
 //图像映射到标定对象中
 for (int i = 0; i < files.Length; i++)
 {
     HOperatorSet.ReadImage(out var himage, files[i].FullName);
     HOperatorSet.FindCalibObject(himage, calibDataID, 0, 0, i, new HTuple(), new HTuple());

 }
 //执行标定
 HOperatorSet.CalibrateCameras(calibDataID, out Enumber);

 //获取相机标定参数
 HOperatorSet.GetCalibData(calibDataID, "camera", 0, "params", out CameraParameters);
 //获取参考位姿
 HOperatorSet.GetCalibData(calibDataID, "calib_obj_pose", new HTuple(0, selectIndexPose), "pose", out var CameraPose1);
 //添加标定板厚度
 HOperatorSet.SetOriginPose(CameraPose1, 0, 0, Convert.ToDouble(up_Thickness.Text) * 0.001, out CameraPose);
 MessageBox.Show("标定成功");

结果显示目标效果

结果显示实现效果

验证部分

 HOperatorSet.ChangeRadialDistortionCamPar("adaptive", CameraParameters, 0, out var hv_CamParamNew);
 HOperatorSet.ChangeRadialDistortionImage(HIMage, HIMage, out HObject hobj, CameraParameters, hv_CamParamNew);

位姿校正第10张图像

原图

位姿验证

HOperatorSet.SetOriginPose(CameraPose, DX, DY, DZ, out hv_PoseNewOrigin);
ho_MapSingle.Dispose();
HOperatorSet.GenImageToWorldPlaneMap(out ho_MapSingle, CameraParameters, hv_PoseNewOrigin,
    768, 576, 900, 800, 0.0025, "bilinear");
ho_ImageMapped.Dispose();
HOperatorSet.MapImage(HIMage, ho_MapSingle, out HIMage);


http://www.kler.cn/a/518272.html

相关文章:

  • Spring Boot是什么及其优点
  • 【ComfyUI专栏】ComfyUI 部署Kolors
  • js手撕 | 使用css画一个三角形 使用js修改元素样式 驼峰格式与“-”格式相互转化
  • 八股文 (一)
  • 网络安全 | F5-Attack Signatures详解
  • 【FreeRTOS 教程 四】队列创建与发布项目到队列
  • 大模型学习计划
  • python判断字符串是否存在空白、字母或数字
  • 单链表算法实战:解锁数据结构核心谜题——移除链表元素
  • 计算机网络 (54)系统安全:防火墙与入侵检测
  • 论文速读|Matrix-SSL:Matrix Information Theory for Self-Supervised Learning.ICML24
  • 机器学习11-学习路径推荐
  • Solon Cloud Gateway 开发:导引
  • 99.15 金融难点通俗解释:毛利率vs营业利润率vs净利率
  • AI画笔,绘就古今艺术星河(5/10)
  • 【Docker】私有Docker仓库的搭建
  • K8S中Service详解(三)
  • 食堂订餐小程序ssm+论文源码调试讲解
  • pytorch2.5实例教程
  • poi在word中打开本地文件
  • Cloudflare通过代理服务器绕过 CORS 限制:原理、实现场景解析
  • C语言数据结构:链表、栈与队列、排序算法与查找算法深度解析
  • 【C++高并发服务器WebServer】-1:Linux中父子进程fork创建及关系、GDB多进程调试
  • Redis(5,jedis和spring)
  • QModbusTCPClient 服务器断开引起的程序崩溃
  • ChirpIoT技术的优势以及局限性