news 2026/9/10 14:06:05

WPF实现相机标定

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
WPF实现相机标定

WPF实现相机标定

一 标定参数类

/// <summary>/// 标定参数类/// </summary>publicclassCalibrationModel{[Category("创建标定描述文件参数"),Description("圆点行数")]publicint行数{get;set;}=7;[Category("创建标定描述文件参数"),Description("圆点行数")]publicint列数{get;set;}=7;[Category("创建标定描述文件参数"),Description("两个圆之间的距离, 单位米")]publicdouble圆间距{get;set;}=0.007;[Category("创建标定描述文件参数"),Description("比例值: Mark直径比上Mark中心距离")]publicdouble比例{get;set;}=0.5;[Category("创建标定描述文件参数"),Description("用于标定的描述文件")]publicstring描述文件{get;set;}=@".//标定文件//caltab.descr";[Category("创建标定描述文件参数"),Description("制作标定板的PS文件")]publicstringPS文件{get;set;}=@".//标定文件//caltab.ps";[Category("创建标定对象参数"),Description("厚度")]publicint厚度{get;set;}=1;[Category("创建标定对象参数"),Description("相机类型")]publicstring相机类型{get;set;}="面扫描(除法)";[Category("创建标定对象参数"),Description("单个相机像元的宽")]publicdouble像元宽{get;set;}=8.3;[Category("创建标定对象参数"),Description("单个相机像元的高")]publicdouble像元高{get;set;}=8.3;[Category("创建标定对象参数"),Description("图像宽")]publicdouble图像宽{get;set;}=1120;[Category("创建标定对象参数"),Description("图像高")]publicdouble图像高{get;set;}=1120;[Category("创建标定对象参数"),Description("镜头的焦距")]publicdouble焦距{get;set;}=8;[Category("标定结果"),Description("标定效果,越接近0越越好")]publicdouble平均误差{get;set;}=999.9;}

二 保存参数文件

/// <summary>/// 保存参数文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton43_Click(objectsender,EventArgse){CalibrationModelcalibrationModel=propertyGrid_Cali.SelectedObjectasCalibrationModel;XmlSerializerHelper.WriteXML(calibrationModel,@".//标定文件//CalibrationModel.xnml",typeof(CalibrationModel));}

三 读取参数

if(File.Exists(@".//标定文件//CalibrationModel.xnml")){propertyGrid_Cali.SelectedObject=XmlSerializerHelper.ReadXML(@".//标定文件//CalibrationModel.xnml",typeof(CalibrationModel));}else{propertyGrid_Cali.SelectedObject=newCalibrationModel();}

四 创建标定板描述文件

/// <summary>/// 创建标定板描述文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton49_Click(objectsender,EventArgse){CalibrationModelcalibrationModel=propertyGrid_Cali.SelectedObjectasCalibrationModel;// 创建保存文件夹if(!Directory.Exists(Path.GetDirectoryName(calibrationModel.描述文件))){Directory.CreateDirectory(Path.GetDirectoryName(calibrationModel.描述文件));}HOperatorSet.GenCaltab(calibrationModel.行数,calibrationModel.列数,calibrationModel.圆间距,calibrationModel.比例,calibrationModel.描述文件,calibrationModel.PS文件);MessageBox.Show("创建标定描述文件成功");}

五 创建标定对象

/// <summary>/// 创建标定文件/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton48_Click(objectsender,EventArgse){// 1.创建标定对象HOperatorSet.CreateCalibData("calibration_object",1,1,outhv_CalibDataID);// 2 确定描述文件CalibrationModelcalibrationModel=propertyGrid_Cali.SelectedObjectasCalibrationModel;HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID,0,calibrationModel.描述文件);// 3.确定相机参数// 获取标定数据varFocus=calibrationModel.焦距*0.001;varKappa=0;varSx=calibrationModel.像元宽*1e-06;varSy=calibrationModel.像元高*1e-06;varImageWidth=calibrationModel.图像宽;varImageHeight=calibrationModel.图像高;varCx=ImageWidth*0.5;// 图像中心点varCy=ImageHeight*0.5;// 图像中心点HTupleCameraParam=newHTuple();CameraParam.TupleConcat("area_scan_division",Focus,Kappa,Sx,Sy,Cx,Cy,ImageWidth,ImageHeight);HOperatorSet.SetCalibDataCamParam(hv_CalibDataID,0,newHTuple(),CameraParam);MessageBox.Show("创建标定对象成功");}

六 加载标定图像

/// <summary>/// 加载标定图像/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton47_Click(objectsender,EventArgse){OpenFileDialogofd=newOpenFileDialog();ofd.Multiselect=true;if(ofd.ShowDialog()==DialogResult.OK){string[]filepaths=ofd.FileNames;for(inti=0;i<filepaths.Length;i++){HOperatorSet.ReadImage(outHObjectho_Image,filepaths[i]);hWindow_Final_Cali.HobjectToHimage(ho_Image);// 查找当前图像中与标定板匹配到的标定板的轮廓及原点中心HOperatorSet.FindCalibObject(ho_Image,hv_CalibDataID,0,0,i,newHTuple(),newHTuple());// 获取对应轮廓及每个标定板上原点的中心HOperatorSet.GetCalibDataObservContours(outHObjectho_Contours,hv_CalibDataID,"caltab",0,0,i);HOperatorSet.GetCalibDataObservPoints(hv_CalibDataID,0,0,i,outHTuplehv_Row,outHTuplehv_Column,outHTuplehv_Index,outHTuplehv_Pose);HOperatorSet.GenCrossContourXld(outHObjectho_Cross,hv_Row,hv_Column,10,0.785398);hWindow_Final_Cali.DispObj(ho_Contours,"blue");hWindow_Final_Cali.DispObj(ho_Cross,"red");}}}

七 标定,生成畸变矫正文件

/// <summary>/// 标定/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton41_Click(objectsender,EventArgse){// 标定HOperatorSet.CalibrateCameras(hv_CalibDataID,outHTuplehv_Error);// 更新UI显示误差CalibrationModelcalibrationModel=propertyGrid_Cali.SelectedObjectasCalibrationModel;calibrationModel.平均误差=hv_Error.D;propertyGrid_Cali.SelectedObject=calibrationModel;// 获取相机内参HOperatorSet.GetCalibData(hv_CalibDataID,"camera",0,"params",outHTuplehv_CameraParameters);// 生成畸变矫正参数HOperatorSet.ChangeRadialDistortionCamPar("adaptive",hv_CameraParameters,0,outHTuplehv_CamParamChange);//生成畸变矫正MapHOperatorSet.GenRadialDistortionMap(outHObjectho_Map,hv_CameraParameters,hv_CamParamChange,"bilinear");// 保存畸变矫正文件HOperatorSet.WriteImage(ho_Map,"tiff",0,@"./Map");//** 8.获取相机外参HOperatorSet.GetCalibData(hv_CalibDataID,"calib_obj_pose",(newHTuple(0)).TupleConcat(0),"pose",outHTuplehv_Object_Pose_1);HOperatorSet.SetOriginPose(hv_Object_Pose_1,0,0,0.002,outHTuplehv_PoseCalibParams);//** 9.保存相机参数HOperatorSet.WriteTuple(hv_CameraParameters,"CameraParameters.tup");HOperatorSet.WriteTuple(hv_PoseCalibParams,"CameraPose.tup");}

八 查看畸变矫正效果

/// <summary>/// 查看畸变矫正效果/// </summary>/// <param name="sender"></param>/// <param name="e"></param>privatevoidmaterialButton42_Click(objectsender,EventArgse){// 读取畸变矫正文件HOperatorSet.ReadImage(outHObjectMap,@"./标定文件/Map");OpenFileDialogopenFileDialog=newOpenFileDialog();if(openFileDialog.ShowDialog()==DialogResult.OK){stringfilePath=openFileDialog.FileName;HOperatorSet.ReadImage(outHObjectImage,filePath);HOperatorSet.MapImage(Image,Map,outHObjectimageMapped);hWindow_Final_Cali.HobjectToHimage(imageMapped);}}
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 14:05:31

【2026 OPC计划】3分钟部署你的AI助理-CoPaw

3分钟部署你的AI助理-CoPaw&#x1f43e; CoPaw 服务简介一、&#x1f680;部署流程1 访问计算巢 CoPaw 社区版2 填写参数&#xff0c;确认订单3 核实订单&#xff0c;确认部署4 获取访问地址5 访问服务6 配置百炼API_KEY7 配置模型8 开始对话二、&#x1f4da;使用指南三、其他…

作者头像 李华
网站建设 2026/9/10 14:06:04

【2026 OPC计划】AI的贾维斯时刻-OpenClaw

AI的贾维斯时刻-OpenClaw一、OpenClaw 项目开源与发展历程1 缘起&#xff1a;AI 辅助编程的极致实验与“十天奇迹”2 爆发&#xff1a;超越 Claude Code 的现象级增长3 转折&#xff1a;商标风波与“Molt”重生4 生态&#xff1a;中国市场的本土化适配与云端基建二、OpenClaw核…

作者头像 李华
网站建设 2026/9/10 14:05:23

解析AI原生应用中语音识别的核心要点

解析AI原生应用中语音识别的核心要点 关键词:语音识别、AI原生应用、声学模型、语言模型、端到端架构、特征提取、实时交互 摘要:在AI原生应用(如智能助手、车载交互、语音转写工具)中,语音识别是实现“人机自然对话”的关键技术。本文将从语音识别的底层逻辑出发,用“声…

作者头像 李华
网站建设 2026/9/10 14:05:37

SpringBoot基于微信小程序的校园跑腿小程序

前言 在校园生活节奏紧凑、同学们事务繁忙的当下&#xff0c;Spring Boot 基于微信小程序的校园跑腿小程序应运而生&#xff0c;为师生们提供了便捷高效的代劳服务&#xff0c;让校园生活更加从容有序。借助 Spring Boot 强大的后端支撑以及微信小程序无需安装、触手可及的优势…

作者头像 李华
网站建设 2026/9/9 8:33:07

Halcon助手实现相机标定

Halcon助手实现相机标定 一 利用Halcon制作halcon的专用标定板 Halcon标定板大小&#xff1a;标定板的大小要大于全视野的1/3推荐使用2/3视野大小的标定板&#xff0c; * 7 :x方向圆点数量 * 7 :y方向圆点数量 * 0.007 两个圆之间的距离&#xff0c; 单位米 * 0.5 比例值&…

作者头像 李华
网站建设 2026/9/4 21:26:39

基于深度学习的YOLO目标检测+智能计数系统之木材数量计数图像数据集 树木卡车图像计数数据集 detr图像数据集第10115期

树木相关目标检测数据集简介 往期热门主题 主题搜两字"关键词"直达 代码数据获取&#xff1a; 获取方式&#xff1a;***文章底部卡片扫码获取***覆盖了YOLO相关项目、OpenCV项目、CNN项目等所有类别&#xff0c; 覆盖各类项目场景&#xff1a;项目名称项目名称基于YO…

作者头像 李华