예제 #1
0
        private void btn_calibrateCamParam_Click(object sender, EventArgs e)
        {
            try
            {
                HOperatorSet.CalibrateCameras(CalibDataID, out hv_Error);
                HOperatorSet.GetCalibData(CalibDataID, "camera", 0, "params", out tool.cameraParam);
                StringBuilder strb = new StringBuilder();
                strb.Append(tool.cameraParam[0].S + ",");
                for (int i = 1; i < tool.cameraParam.Length; i++)
                {
                    if (i == 3 || i == 4)
                    {
                        ExecuteInformation((tool.cameraParam[i].D * 1000000).ToString("F3") + ";" + Environment.NewLine);
                        strb.Append((tool.cameraParam[i].D * 1000000).ToString("F3"));
                    }
                    else if (i == 7 || i == 8)
                    {
                        ExecuteInformation(tool.cameraParam[i].I.ToString() + ";" + Environment.NewLine);
                        strb.Append(tool.cameraParam[i].I.ToString());
                    }
                    else
                    {
                        if (i == 2)
                        {
                            ExecuteInformation(tool.cameraParam[i].D.ToString("F4") + ";" + Environment.NewLine);
                            strb.Append(tool.cameraParam[i].D.ToString("F4"));
                        }
                        else
                        {
                            ExecuteInformation(tool.cameraParam[i].D.ToString("F4") + ";" + Environment.NewLine);
                            strb.Append(tool.cameraParam[i].D.ToString("F3"));
                        }
                    }

                    if (i < tool.cameraParam.Length - 1)
                    {
                        strb.Append(",");
                    }
                }
                txt_CameraParam.Text       = strb.ToString();
                gb_SettingPlanPose.Enabled = true;
                // btn_grabCamera.Enabled = false;
            }

            catch (HalconException HDevExpDefaultException1)
            {
                HTuple hv_Exception;
                HDevExpDefaultException1.ToHTuple(out hv_Exception);
                MessageBox.Show("标定错误", hv_Exception.ToString(), MessageBoxButtons.OK, MessageBoxIcon.Error);
            }
            ExecuteInformation("相机参数标定成功");
            try
            {
                ExecuteInformation("标定误差: " + hv_Error.D.ToString("F3") + "pixel");
            }
            catch
            {
            }
        }
예제 #2
0
 public static HTuple Finally()
 {
     try
     {
         HOperatorSet.CalibrateCameras(CalibDataID, out HTuple Error);
         HOperatorSet.GetCalibData(CalibDataID, "camera", 0, "params", out HTuple DataValue);
         HOperatorSet.WriteCamPar(DataValue, Application.StartupPath + "/calibration/" + "CamPar.dat");
         HOperatorSet.WriteCalibData(CalibDataID, Application.StartupPath + "/calibration/" + "calibration.ccd");
         HOperatorSet.GetCalibData(CalibDataID, "calib_obj_pose", new HTuple(0, 0), "pose", out HTuple Pose);
         return(Error);
     }
     catch (Exception)
     {
         return(0);
     }
 }
예제 #3
0
        public void InternalCalibrate(string ImagePath)
        {
            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_Image1);
            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_Caltab);
            try
            {
                //相机内部标定(需要很多位置的标定板图像) 黑三角为第三象限
                //图片文件夹
                hv_ImgPath = ImagePath;
                ho_Image1.Dispose();
                HOperatorSet.ReadImage(out ho_Image1, hv_ImgPath + "calib_01");
                HOperatorSet.GetImagePointer1(ho_Image1, out hv_Pointer, out hv_Type, out hv_Width,
                                              out hv_Height);
                HOperatorSet.SetWindowAttr("background_color", "black");
                HOperatorSet.OpenWindow(0, 0, hv_Width, hv_Height, 0, "visible", "", out hv_WindowHandle1);
                HDevWindowStack.Push(hv_WindowHandle1);

                //初始相机参数
                hv_StartCamPar                    = new HTuple();
                hv_StartCamPar[0]                 = 0;
                hv_StartCamPar[1]                 = 0;
                hv_StartCamPar[2]                 = 1.67e-006;
                hv_StartCamPar[3]                 = 1.67e-006;
                hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Width / 2);
                hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Height / 2);
                hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Width);
                hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Height);
                hv_TmpCtrl_FindCalObjParNames     = new HTuple();
                hv_TmpCtrl_FindCalObjParNames[0]  = "gap_tolerance";
                hv_TmpCtrl_FindCalObjParNames[1]  = "alpha";
                hv_TmpCtrl_FindCalObjParNames[2]  = "skip_find_caltab";
                hv_TmpCtrl_FindCalObjParValues    = new HTuple();
                hv_TmpCtrl_FindCalObjParValues[0] = 1;
                hv_TmpCtrl_FindCalObjParValues[1] = 1;
                hv_TmpCtrl_FindCalObjParValues[2] = "false";
                //生成一个标定数据模型(制定设置中的相机数量和校准对象数量)
                HOperatorSet.CreateCalibData("calibration_object", 1, 1, out hv_CalibDataID);
                //设置相机类型和初始参数(设置相机类型和初始内部相机参数),只有相同类型的相机可以在单个设置中校准
                HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, "area_scan_telecentric_division",
                                                  hv_StartCamPar);
                //根据标定板规格生成标定板文件
                HOperatorSet.GenCaltab(7, 7, 0.000625, 0.5, "caltab.descr", "caltab.ps");
                //根据标定板模型创建一个标定对象(描述校准对象)
                HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID, 0, "caltab.descr");
                hv_NumImages = 20;
                HTuple end_val24  = hv_NumImages;
                HTuple step_val24 = 1;
                for (hv_I = 1; hv_I.Continue(end_val24, step_val24); hv_I = hv_I.TupleAdd(step_val24))
                {
                    ho_Image.Dispose();
                    HOperatorSet.ReadImage(out ho_Image, (hv_ImgPath + "calib_") + (hv_I.TupleString(
                                                                                        "02d")));
                    //找到Halcon标定板,并将数据存入校准数据模型中(收集数据)
                    //即提取校准对象的mark点的图像坐标以及相机粗略估计姿态
                    if (HDevWindowStack.IsOpen())
                    {
                        HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
                    }
                    HOperatorSet.FindCalibObject(ho_Image, hv_CalibDataID, 0, 0, hv_I, hv_TmpCtrl_FindCalObjParNames,
                                                 hv_TmpCtrl_FindCalObjParValues);
                    //从校准数据模型中获取轮廓数据
                    ho_Caltab.Dispose();
                    HOperatorSet.GetCalibDataObservContours(out ho_Caltab, hv_CalibDataID, "caltab",
                                                            0, 0, hv_I);
                    if (HDevWindowStack.IsOpen())
                    {
                        HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green");
                    }
                    if (HDevWindowStack.IsOpen())
                    {
                        HOperatorSet.DispObj(ho_Caltab, HDevWindowStack.GetActive());
                    }
                    HOperatorSet.GetCalibDataObservPoints(hv_CalibDataID, 0, 0, hv_I, out hv_RCoord,
                                                          out hv_CCoord, out hv_Index, out hv_StartPose);
                    //find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)
                    if (HDevWindowStack.IsOpen())
                    {
                        HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
                    }
                    HOperatorSet.DispCircle(hv_WindowHandle1, hv_RCoord, hv_CCoord, HTuple.TupleGenConst(
                                                new HTuple(hv_RCoord.TupleLength()), 2.5));
                    if (HDevWindowStack.IsOpen())
                    {
                        HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height - 1, hv_Width - 1);
                    }
                    //set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoord, CCoord, 'all', StartPose)
                }
                //执行实际的校准
                //校准相机
                HOperatorSet.CalibrateCameras(hv_CalibDataID, out hv_Error);
                //获得相机参数
                HOperatorSet.GetCalibData(hv_CalibDataID, "camera", 0, "params", out hv_CamParam);
                //保存相机参数
                HOperatorSet.WriteCamPar(hv_CamParam, "camera_parameters.dat");
                HOperatorSet.ClearCalibData(hv_CalibDataID);
            }
            catch (HalconException HDevExpDefaultException)
            {
                ho_Image1.Dispose();
                ho_Image.Dispose();
                ho_Caltab.Dispose();

                throw HDevExpDefaultException;
            }
            ho_Image1.Dispose();
            ho_Image.Dispose();
            ho_Caltab.Dispose();
        }
예제 #4
0
    private void action(string ImgPath)
    {
        HObject ho_Image1, ho_Image = null, ho_Caltab = null;
        HTuple  hv_ImgPath = null, hv_Pointer = null;
        HTuple  hv_Type = null, hv_Width = null, hv_Height = null;
        HTuple  hv_WindowHandle1 = null, hv_StartCamPar = null;
        HTuple  hv_TmpCtrl_FindCalObjParNames = null, hv_TmpCtrl_FindCalObjParValues = null;
        HTuple  hv_CalibDataID = null, hv_NumImages = null, hv_I = null;
        HTuple  hv_RCoord = new HTuple(), hv_CCoord = new HTuple();
        HTuple  hv_Index = null, hv_StartPose = new HTuple(), hv_CaltabName = null;
        HTuple  hv_Error = null, hv_CamParam = null, hv_WindowHandle = null;
        HTuple  hv_Exception = null, hv_Row = null, hv_Column = null;
        HTuple  hv_Pose = null, hv_X = null, hv_Y = null, hv_Z = null;
        HTuple  hv_Image_X1 = null, hv_Image_Y1 = null, hv_Distance_XY = null;
        HTuple  hv_Image_X2 = null, hv_Image_Y2 = null, hv_World_X1 = null;
        HTuple  hv_World_Y1 = null, hv_World_X2 = null, hv_World_Y2 = null;
        HTuple  hv_DistanceWorld = null, hv_DistanceImage = null;
        HTuple  hv_DistanceOneMilimeter = null, hv_DistanceOnePixel = null;
        HTuple  hv_OffSetX = null, hv_OffSetY = null, hv_FinalPose = null;
        HTuple  hv_Erros = null, hv_X1 = null, hv_Y1 = null;

        // Initialize local and output iconic variables
        HOperatorSet.GenEmptyObj(out ho_Image1);
        HOperatorSet.GenEmptyObj(out ho_Image);
        HOperatorSet.GenEmptyObj(out ho_Caltab);
        try
        {
            //相机内部标定(需要很多位置的标定板图像) 黑三角为第三象限
            //图片文件夹
            hv_ImgPath = ImgPath;

            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.CloseWindow(HDevWindowStack.Pop());
            }
            ho_Image1.Dispose();
            HOperatorSet.ReadImage(out ho_Image1, hv_ImgPath + "calib_01");
            HOperatorSet.GetImagePointer1(ho_Image1, out hv_Pointer, out hv_Type, out hv_Width,
                                          out hv_Height);
            HOperatorSet.SetWindowAttr("background_color", "black");
            HOperatorSet.OpenWindow(0, 0, hv_Width, hv_Height, 0, "visible", "", out hv_WindowHandle1);
            HDevWindowStack.Push(hv_WindowHandle1);

            //初始相机参数
            hv_StartCamPar                    = new HTuple();
            hv_StartCamPar[0]                 = 0;
            hv_StartCamPar[1]                 = 0;
            hv_StartCamPar[2]                 = 1.67e-006;
            hv_StartCamPar[3]                 = 1.67e-006;
            hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Width / 2);
            hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Height / 2);
            hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Width);
            hv_StartCamPar                    = hv_StartCamPar.TupleConcat(hv_Height);
            hv_TmpCtrl_FindCalObjParNames     = new HTuple();
            hv_TmpCtrl_FindCalObjParNames[0]  = "gap_tolerance";
            hv_TmpCtrl_FindCalObjParNames[1]  = "alpha";
            hv_TmpCtrl_FindCalObjParNames[2]  = "skip_find_caltab";
            hv_TmpCtrl_FindCalObjParValues    = new HTuple();
            hv_TmpCtrl_FindCalObjParValues[0] = 1;
            hv_TmpCtrl_FindCalObjParValues[1] = 1;
            hv_TmpCtrl_FindCalObjParValues[2] = "false";
            //生成一个标定数据模型(制定设置中的相机数量和校准对象数量)
            HOperatorSet.CreateCalibData("calibration_object", 1, 1, out hv_CalibDataID);
            //设置相机类型和初始参数(设置相机类型和初始内部相机参数),只有相同类型的相机可以在单个设置中校准
            HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, "area_scan_telecentric_division",
                                              hv_StartCamPar);
            //根据标定板规格生成标定板文件
            HOperatorSet.GenCaltab(7, 7, 0.000625, 0.5, "caltab.descr", "caltab.ps");
            //根据标定板模型创建一个标定对象(描述校准对象)
            HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID, 0, "caltab.descr");
            hv_NumImages = 20;
            HTuple end_val24  = hv_NumImages;
            HTuple step_val24 = 1;
            for (hv_I = 1; hv_I.Continue(end_val24, step_val24); hv_I = hv_I.TupleAdd(step_val24))
            {
                ho_Image.Dispose();
                HOperatorSet.ReadImage(out ho_Image, (hv_ImgPath + "calib_") + (hv_I.TupleString(
                                                                                    "02d")));
                //找到Halcon标定板,并将数据存入校准数据模型中(收集数据)
                //即提取校准对象的mark点的图像坐标以及相机粗略估计姿态
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
                }
                HOperatorSet.FindCalibObject(ho_Image, hv_CalibDataID, 0, 0, hv_I, hv_TmpCtrl_FindCalObjParNames,
                                             hv_TmpCtrl_FindCalObjParValues);
                //从校准数据模型中获取轮廓数据
                ho_Caltab.Dispose();
                HOperatorSet.GetCalibDataObservContours(out ho_Caltab, hv_CalibDataID, "caltab",
                                                        0, 0, hv_I);
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green");
                }
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.DispObj(ho_Caltab, HDevWindowStack.GetActive());
                }
                HOperatorSet.GetCalibDataObservPoints(hv_CalibDataID, 0, 0, hv_I, out hv_RCoord,
                                                      out hv_CCoord, out hv_Index, out hv_StartPose);
                //find_marks_and_pose (Image, Caltab, CaltabName, StartCamPar, 128, 10, 18, 0.9, 15, 100, RCoord, CCoord, StartPose)
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
                }
                HOperatorSet.DispCircle(hv_WindowHandle1, hv_RCoord, hv_CCoord, HTuple.TupleGenConst(
                                            new HTuple(hv_RCoord.TupleLength()), 2.5));
                if (HDevWindowStack.IsOpen())
                {
                    HOperatorSet.SetPart(HDevWindowStack.GetActive(), 0, 0, hv_Height - 1, hv_Width - 1);
                }
                //set_calib_data_observ_points (CalibDataID, 0, 0, i, RCoord, CCoord, 'all', StartPose)
            }

            //执行实际的校准
            //校准相机
            HOperatorSet.CalibrateCameras(hv_CalibDataID, out hv_Error);
            //获得相机参数
            HOperatorSet.GetCalibData(hv_CalibDataID, "camera", 0, "params", out hv_CamParam);
            //保存相机参数
            HOperatorSet.WriteCamPar(hv_CamParam, "camera_parameters.dat");
            HOperatorSet.ClearCalibData(hv_CalibDataID);
            // stop(...); only in hdevelop

            //外部标定(只需要一张标定板图像)
            //即获取相机的姿态
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.SetDraw(HDevWindowStack.GetActive(), "margin");
            }
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.SetLineWidth(HDevWindowStack.GetActive(), 1);
            }
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.CloseWindow(HDevWindowStack.Pop());
            }
            HOperatorSet.SetWindowAttr("background_color", "black");
            HOperatorSet.OpenWindow(0, hv_Width + 5, hv_Width, hv_Height, 0, "visible", "", out hv_WindowHandle);
            HDevWindowStack.Push(hv_WindowHandle);

            //读取初始相机参数
            try
            {
                HOperatorSet.ReadCamPar("camera_parameters.dat", out hv_CamParam);
            }
            // catch (Exception)
            catch (HalconException HDevExpDefaultException1)
            {
                HDevExpDefaultException1.ToHTuple(out hv_Exception);
                // stop(...); only in hdevelop
            }

            //从图像点确定外部摄像机参数和世界坐标
            //当校准板直接放在测量平面上时 可以从图像确定外部摄像机参数
            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, hv_ImgPath + "calib_01");
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.DispObj(ho_Image, HDevWindowStack.GetActive());
            }
            hv_CaltabName = "caltab.descr";
            hv_TmpCtrl_FindCalObjParNames     = new HTuple();
            hv_TmpCtrl_FindCalObjParNames[0]  = "gap_tolerance";
            hv_TmpCtrl_FindCalObjParNames[1]  = "alpha";
            hv_TmpCtrl_FindCalObjParNames[2]  = "skip_find_caltab";
            hv_TmpCtrl_FindCalObjParValues    = new HTuple();
            hv_TmpCtrl_FindCalObjParValues[0] = 1;
            hv_TmpCtrl_FindCalObjParValues[1] = 1;
            hv_TmpCtrl_FindCalObjParValues[2] = "false";
            //生产一个标定数据模型
            HOperatorSet.CreateCalibData("calibration_object", 1, 1, out hv_CalibDataID);
            //设置相机类型和初始参数
            HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, "area_scan_telecentric_division",
                                              hv_CamParam);
            //定义校准对象
            HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID, 0, hv_CaltabName);
            //找到Halcon标定板,并将数据写入校准数据模型中
            HOperatorSet.FindCalibObject(ho_Image, hv_CalibDataID, 0, 0, 1, hv_TmpCtrl_FindCalObjParNames,
                                         hv_TmpCtrl_FindCalObjParValues);
            //获得标定区域轮廓
            ho_Caltab.Dispose();
            HOperatorSet.GetCalibDataObservContours(out ho_Caltab, hv_CalibDataID, "caltab",
                                                    0, 0, 1);
            //获得标定区域mark点的信息
            HOperatorSet.GetCalibDataObservPoints(hv_CalibDataID, 0, 0, 1, out hv_Row,
                                                  out hv_Column, out hv_Index, out hv_Pose);
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.SetColor(HDevWindowStack.GetActive(), "green");
            }
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.DispObj(ho_Caltab, HDevWindowStack.GetActive());
            }
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.SetColor(HDevWindowStack.GetActive(), "red");
            }
            //显示标定的结果
            HOperatorSet.DispCaltab(hv_WindowHandle, hv_CaltabName, hv_CamParam, hv_Pose,
                                    1);
            if (HDevWindowStack.IsOpen())
            {
                HOperatorSet.SetLineWidth(HDevWindowStack.GetActive(), 3);
            }
            //在mark点中心画点
            HOperatorSet.DispCircle(hv_WindowHandle, hv_Row, hv_Column, HTuple.TupleGenConst(
                                        new HTuple(hv_Row.TupleLength()), 1.5));
            // stop(...); only in hdevelop
            //取得校准文件内的坐标数据
            //caltab_points (CaltabName, X, Y, Z)
            //calibrate_cameras (CalibDataID, Error)

            //考虑标定板厚度进行姿态矫正 3.5mm厚度
            HOperatorSet.SetOriginPose(hv_Pose, 0, 0, 0.0035, out hv_Pose);

            HOperatorSet.ClearCalibData(hv_CalibDataID);
            //图像坐标转世界坐标
            HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_Pose, hv_Row, hv_Column,
                                                 "mm", out hv_X, out hv_Y);

            hv_Image_X1    = 100;
            hv_Image_Y1    = 100;
            hv_Distance_XY = 500;
            hv_Image_X2    = hv_Image_X1 + hv_Distance_XY;
            hv_Image_Y2    = hv_Image_Y1 + hv_Distance_XY;
            HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_Pose, hv_Image_Y1, hv_Image_X1,
                                                 "mm", out hv_World_X1, out hv_World_Y1);
            HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_Pose, hv_Image_Y2, hv_Image_X2,
                                                 "mm", out hv_World_X2, out hv_World_Y2);
            //计算世界坐标距离?
            HOperatorSet.DistancePp(hv_World_Y1, hv_World_X1, hv_World_Y2, hv_World_X2,
                                    out hv_DistanceWorld);
            //计算像素坐标?
            HOperatorSet.DistancePp(hv_Image_X1, hv_Image_Y1, hv_Image_X2, hv_Image_Y2,
                                    out hv_DistanceImage);
            //每毫米世界坐标距=距离对应的像素点个数?
            hv_DistanceOneMilimeter = hv_DistanceImage / hv_DistanceWorld;
            //每个像素对应的世界坐标距离?
            hv_DistanceOnePixel = hv_DistanceWorld / hv_DistanceImage;
            //调整世界坐标至中心偏移量?
            hv_OffSetX = (hv_Width / 2) * hv_DistanceOnePixel;
            hv_OffSetY = (hv_Height / 2) * hv_DistanceOnePixel;

            //
            hv_X    = new HTuple();
            hv_X[0] = 0;
            hv_X[1] = 50;
            hv_X[2] = 100;
            hv_X[3] = 80;
            hv_Y    = new HTuple();
            hv_Y[0] = 5;
            hv_Y[1] = 0;
            hv_Y[2] = 5;
            hv_Y[3] = 0;
            hv_Z    = new HTuple();
            hv_Z[0] = 0;
            hv_Z[1] = 0;
            hv_Z[2] = 0;
            hv_Z[3] = 0;

            hv_RCoord    = new HTuple();
            hv_RCoord[0] = 414;
            hv_RCoord[1] = 227;
            hv_RCoord[2] = 85;
            hv_RCoord[3] = 128;
            hv_CCoord    = new HTuple();
            hv_CCoord[0] = 119;
            hv_CCoord[1] = 318;
            hv_CCoord[2] = 550;
            hv_CCoord[3] = 448;

            HOperatorSet.VectorToPose(hv_X, hv_Y, hv_Z, hv_RCoord, hv_CCoord, hv_CamParam,
                                      "telecentric_planar_robust", "error", out hv_FinalPose, out hv_Erros);
            HOperatorSet.WritePose(hv_FinalPose, "campose.dat");
            HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_FinalPose, hv_Row, hv_Column,
                                                 1, out hv_X1, out hv_Y1);
        }
        catch (HalconException HDevExpDefaultException)
        {
            ho_Image1.Dispose();
            ho_Image.Dispose();
            ho_Caltab.Dispose();

            throw HDevExpDefaultException;
        }
        ho_Image1.Dispose();
        ho_Image.Dispose();
        ho_Caltab.Dispose();
    }
예제 #5
0
    public void GetCalibrationParameters(HTuple hv_DescrFile, HTuple hv_ImageDirectory,
                                         HTuple hv_Focus, HTuple hv_Sx, HTuple hv_Sy, HTuple hv_Width, HTuple hv_Height,
                                         HTuple hv_CameraType, out HTuple hv_interCamera, out HTuple hv_PoseNewOrigin,
                                         out HTuple hv_distance)
    {
        // Local iconic variables

        HObject ho_Image = null, ho_CaltabRegion = null;


        // Local control variables

        HTuple hv_CalibDataID = null, hv_startParam = new HTuple();
        HTuple hv_ImageFiles = null, hv_n = null, hv_RCoord = new HTuple();
        HTuple hv_CCoord = new HTuple(), hv_StartPose = new HTuple();
        HTuple hv_Error = null, hv_Pose = null, hv_cut = null;
        HTuple hv_YX = null, hv_YY = null, hv_X = null, hv_Y = null;
        HTuple hv_X1 = null, hv_Y1 = null, hv_X2 = null, hv_Y2 = null;
        HTuple hv_Distance1 = null, hv_Distance2 = null, hv_OffsetX = null;
        HTuple hv_OffsetY = null, hv_PoseR = null;

        // Initialize local and output iconic variables
        HOperatorSet.GenEmptyObj(out ho_Image);
        HOperatorSet.GenEmptyObj(out ho_CaltabRegion);

        HOperatorSet.CreateCalibData("calibration_object", 1, 1, out hv_CalibDataID);

        if ((int)((new HTuple(hv_Width.TupleEqual("area_scan_telecentric_division"))).TupleOr(
                      new HTuple(hv_Width.TupleEqual("area_scan_telecentric_polynomial")))) != 0)
        {
            hv_startParam    = new HTuple();
            hv_startParam[0] = 0;
            hv_startParam    = hv_startParam.TupleConcat(hv_Sx);
            hv_startParam    = hv_startParam.TupleConcat(hv_Sy);
            hv_startParam    = hv_startParam.TupleConcat(hv_Width / 2);
            hv_startParam    = hv_startParam.TupleConcat(hv_Height / 2);
            hv_startParam    = hv_startParam.TupleConcat(hv_Width);
            hv_startParam    = hv_startParam.TupleConcat(hv_Height);

            HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, hv_CameraType, hv_startParam);
        }
        else
        {
            hv_startParam = new HTuple();
            hv_startParam = hv_startParam.TupleConcat(hv_Focus);
            hv_startParam = hv_startParam.TupleConcat(0);
            hv_startParam = hv_startParam.TupleConcat(hv_Sx);
            hv_startParam = hv_startParam.TupleConcat(hv_Sy);
            hv_startParam = hv_startParam.TupleConcat(hv_Width / 2);
            hv_startParam = hv_startParam.TupleConcat(hv_Height / 2);
            hv_startParam = hv_startParam.TupleConcat(hv_Width);
            hv_startParam = hv_startParam.TupleConcat(hv_Height);

            HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, hv_CameraType, hv_startParam);
        }

        HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID, 0, hv_DescrFile);

        list_image_files(hv_ImageDirectory, "default", new HTuple(), out hv_ImageFiles);


        for (hv_n = 0; (int)hv_n <= (int)((new HTuple(hv_ImageFiles.TupleLength())) - 1); hv_n = (int)hv_n + 1)
        {
            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles.TupleSelect(hv_n));

            ho_CaltabRegion.Dispose();
            HOperatorSet.FindCaltab(ho_Image, out ho_CaltabRegion, hv_DescrFile, 3, 112,
                                    5);

            HOperatorSet.FindMarksAndPose(ho_Image, ho_CaltabRegion, hv_DescrFile, hv_startParam,
                                          128, 10, 18, 0.9, 15, 100, out hv_RCoord, out hv_CCoord, out hv_StartPose);

            HOperatorSet.SetCalibDataObservPoints(hv_CalibDataID, 0, 0, 1, hv_RCoord, hv_CCoord,
                                                  "all", hv_StartPose);
        }


        HOperatorSet.CalibrateCameras(hv_CalibDataID, out hv_Error);

        HOperatorSet.GetCalibData(hv_CalibDataID, "camera", 0, "params", out hv_interCamera);

        HOperatorSet.GetCalibData(hv_CalibDataID, "calib_obj_pose", (new HTuple(0)).TupleConcat(
                                      1), "pose", out hv_Pose);

        hv_cut = ((hv_Pose.TupleSelect(5))).TupleInt();

        hv_YX = 100;
        hv_YY = 100;

        HOperatorSet.ImagePointsToWorldPlane(hv_interCamera, hv_Pose, hv_YY, hv_YX, 1,
                                             out hv_X, out hv_Y);

        HOperatorSet.ImagePointsToWorldPlane(hv_interCamera, hv_Pose, hv_YY + 1, hv_YX,
                                             1, out hv_X1, out hv_Y1);

        HOperatorSet.ImagePointsToWorldPlane(hv_interCamera, hv_Pose, hv_YY, hv_YX + 1,
                                             1, out hv_X2, out hv_Y2);

        HOperatorSet.DistancePp(hv_Y, hv_X, hv_Y1, hv_X1, out hv_Distance1);

        HOperatorSet.DistancePp(hv_Y, hv_X, hv_Y2, hv_X2, out hv_Distance2);

        hv_distance = (hv_Distance1 + hv_Distance2) / 2;

        hv_OffsetX = (hv_CCoord.TupleSelect(24)) * hv_distance;
        hv_OffsetY = (hv_RCoord.TupleSelect(24)) * hv_distance;

        hv_PoseR = hv_Pose.Clone();
        if (hv_PoseR == null)
        {
            hv_PoseR = new HTuple();
        }
        hv_PoseR[5] = (hv_Pose.TupleSelect(5)) - hv_cut;

        HOperatorSet.SetOriginPose(hv_PoseR, -hv_OffsetX, -hv_OffsetY, 0, out hv_PoseNewOrigin);

        ho_Image.Dispose();
        ho_CaltabRegion.Dispose();

        return;
    }
예제 #6
0
        public bool CalibrationMake(SourceBuffer _sourceBuffer, ExecuteBuffer _executeBuffer, out SourceBuffer outsourcebuffer, out ExecuteBuffer outexecutebuffer, HWndCtrl hWndCtrl, out string result_info)
        {
            outsourcebuffer  = _sourceBuffer;
            outexecutebuffer = _executeBuffer;
            result_info      = "";
            HTuple  hv_PixelSize = 0.00001;
            HTuple  hv_Message = new HTuple(), hv_Row = new HTuple();
            HTuple  hv_Column = new HTuple(), hv_Index = new HTuple();
            HTuple  hv_Error = null;
            HObject ho_Contours = null, ho_Cross = null, hv_outimage = null;
            HTuple  hv_HomMat3DIdentity = null;
            HTuple  hv_cp1Hur1 = null, hv_cam2Hcp2 = null, hv_cam2Hul2 = null;
            HTuple  hv_PoseNewOrigin2 = null, hv_ULX = null, hv_ULY = null, hv_PoseNewOrigin = null;

            double[] Get_actual_pixel = new double[7];
            HTuple   WorldPixelx, WorldPixely;
            HTuple   Heightx = new HTuple(), Widthx = new HTuple();

            Heightx.Append(Height / 2);
            Heightx.Append(Height / 2);
            Heightx.Append(Height / 2 + 1);
            Widthx.Append(Width / 2);
            Widthx.Append(Width / 2 + 1);
            Widthx.Append(Width / 2);
            HTuple WorldLength1, WorldLength2;
            HTuple ScaleForSimilarPixelSize = 0;

            HOperatorSet.GenEmptyObj(out ho_Contours);
            HOperatorSet.GenEmptyObj(out ho_Cross);
            HOperatorSet.GenEmptyObj(out hv_outimage);

            if (!_executeBuffer.imageBuffer.ContainsKey(this.Input_image.SelectedItem.ToString() + ".img"))
            {
                MessageBox.Show("二值化处理: 输入图像已经不存在,请重置设置输入图像");
                result_info = " 二值化处理: 输入图像已经不存在,请重置设置输入图像";
                return(false);
            }
            if (_executeBuffer.imageBuffer[this.Input_image.SelectedItem.ToString() + ".img"] == null)
            {
                MessageBox.Show("二值化处理: image参数为空或者未赋值");
                result_info = " 二值化处理: 输入图像已经不存在,请重置设置输入图像";
                return(false);
            }
            string comboBox_imageoutname = this.Output_image.Text.ToString() + ".img";

            if (_executeBuffer.imageBuffer[comboBox_imageoutname] != null)
            {
                if (_executeBuffer.imageBuffer[comboBox_imageoutname].IsInitialized())
                {
                    _executeBuffer.imageBuffer[comboBox_imageoutname].Dispose();
                }
            }
            HTuple width, height;
            int    m = _executeBuffer.imageBuffer[this.Input_image.SelectedItem.ToString() + ".img"].CountObj();

            HOperatorSet.GetImageSize(_executeBuffer.imageBuffer[this.Input_image.SelectedItem.ToString() + ".img"], out width, out height);
            int number = Convert.ToInt32(this.textBox1.Text.ToString());

            if (!this.checkBox1.Checked)
            {
                if (Get_Cal_pixel)
                {
                    Get_Cal_pixel = false;
                }
                if (number == 0)
                {
                    hv_StartCamPar = new HTuple();
                    if (this.checkBox_focalize.Checked)
                    {
                        hv_StartCamPar.Append(0);
                    }
                    else
                    {
                        hv_StartCamPar.Append(Convert.ToDouble(this.textbox_lens.Text.ToString()) / 100);
                    }
                    hv_StartCamPar.Append(0);
                    hv_StartCamPar.Append(Convert.ToDouble(this.textBox_width.Text.ToString()) / 10000000);
                    hv_StartCamPar.Append(Convert.ToDouble(this.textBox_height.Text.ToString()) / 10000000);
                    hv_StartCamPar.Append(width / 2);
                    hv_StartCamPar.Append(height / 2);
                    hv_StartCamPar.Append(width);
                    hv_StartCamPar.Append(height);
                    hv_CalTabDescrFile = this.textBox_file.Text;
                    HOperatorSet.CreateCalibData("calibration_object", 1, 1, out CalibDataID);
                    if (this.checkBox_focalize.Checked)
                    {
                        HOperatorSet.SetCalibDataCamParam(CalibDataID, 0, "area_scan_telecentric_division", hv_StartCamPar);
                    }
                    else
                    {
                        HOperatorSet.SetCalibDataCamParam(CalibDataID, 0, "area_scan_division", hv_StartCamPar);
                    }
                    HOperatorSet.SetCalibDataCalibObject(CalibDataID, 0, hv_CalTabDescrFile);
                }
                try
                {
                    HOperatorSet.FindCalibObject(_executeBuffer.imageBuffer[this.Input_image.SelectedItem.ToString() + ".img"], CalibDataID, 0, 0, number, new HTuple(), new HTuple());
                    HOperatorSet.GetCalibData(CalibDataID, "camera", 0, "init_params", out hv_StartCamPar);
                    HOperatorSet.GetCalibDataObservPoints(CalibDataID, 0, 0, number, out hv_Row, out hv_Column, out hv_Index, out hv_Pose);
                    HOperatorSet.GetCalibDataObservContours(out ho_Contours, CalibDataID, "caltab", 0, 0, number);
                    HOperatorSet.GenCrossContourXld(out ho_Cross, hv_Row, hv_Column, 6, 0.785398);
                    hWndCtrl.changeGraphicSettings(GraphicsContext.GC_COLOR, "orange");
                    hWndCtrl.addIconicVar(ho_Cross);
                    hWndCtrl.addIconicVar(ho_Contours);
                    hWndCtrl.repaint();
                }
                catch
                {
                    MessageBox.Show("找不到标定板");
                    ho_Contours.Dispose();
                    ho_Cross.Dispose();

                    return(false);
                }

                if (number == hv_NumImages - 1)
                {
                    Read_file = false;
                    HOperatorSet.CalibrateCameras(CalibDataID, out hv_Error);
                    HOperatorSet.GetCalibData(CalibDataID, "camera", 0, "params", out hv_CamParam);
                    HOperatorSet.GetCalibData(CalibDataID, "calib_obj_pose", (new HTuple(0)).TupleConcat(6), "pose", out hv_Pose);
                    HOperatorSet.HomMat3dIdentity(out hv_HomMat3DIdentity);
                    HOperatorSet.HomMat3dRotateLocal(hv_HomMat3DIdentity, ((-(hv_Pose.TupleSelect(5)))).TupleRad(), "z", out hv_cp1Hur1);
                    HOperatorSet.PoseToHomMat3d(hv_Pose, out hv_cam2Hcp2);
                    HOperatorSet.HomMat3dCompose(hv_cam2Hcp2, hv_cp1Hur1, out hv_cam2Hul2);
                    HOperatorSet.HomMat3dToPose(hv_cam2Hul2, out hv_PoseNewOrigin2);
                    HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_PoseNewOrigin2, 0, 0, "m", out hv_ULX, out hv_ULY);
                    HOperatorSet.SetOriginPose(hv_PoseNewOrigin2, hv_ULX, hv_ULY, 0, out hv_PoseNewOrigin);

                    HOperatorSet.ImagePointsToWorldPlane(hv_CamParam, hv_Pose, Heightx, Widthx, 1, out WorldPixelx, out WorldPixely);
                    HOperatorSet.DistancePp(WorldPixely[0], WorldPixelx[0], WorldPixely[1], WorldPixelx[1], out WorldLength1);
                    HOperatorSet.DistancePp(WorldPixely[0], WorldPixelx[0], WorldPixely[2], WorldPixelx[2], out WorldLength2);
                    ScaleForSimilarPixelSize = (WorldLength1 + WorldLength2) / 2;
                    HOperatorSet.GenImageToWorldPlaneMap(out ho_MapSingle1, hv_CamParam,
                                                         hv_PoseNewOrigin, width, height, width, height, ScaleForSimilarPixelSize, "bilinear");
                    HOperatorSet.WriteObject(ho_MapSingle1, this.textBox2.Text.ToString());
                    Read_file              = true;
                    Get_Calibration        = true;
                    this.checkBox1.Checked = true;
                    result_info            = " 校正参数: 设置完成";
                }

                this.textBox1.Text = (number + 1).ToString();
            }

            if (this.checkBox1.Checked)
            {
                if (Read_file)
                {
                    if (File.Exists(this.textBox2.Text))
                    {
                        HOperatorSet.ReadObject(out ho_MapSingle1, this.textBox2.Text);
                    }
                    else
                    {
                        MessageBox.Show("校正文件不存在 ,请检查");
                        return(false);
                    }
                }

                HOperatorSet.MapImage(_executeBuffer.imageBuffer[this.Input_image.SelectedItem.ToString() + ".img"], ho_MapSingle1, out hv_outimage);
                _executeBuffer.imageBuffer[comboBox_imageoutname] = hv_outimage;
                outexecutebuffer = _executeBuffer;
                result_info      = " 校正: 完成";
                HTuple Distance;
                if (!Get_Cal_pixel)
                {
                    try
                    {
                        double all_number = 0;
                        HOperatorSet.FindCalibObject(hv_outimage, CalibDataID, 0, 0, 0, new HTuple(), new HTuple());
                        HOperatorSet.GetCalibDataObservPoints(CalibDataID, 0, 0, 0, out hv_Row, out hv_Column, out hv_Index, out hv_Pose);
                        for (int i = 0; i < 7; i++)
                        {
                            HOperatorSet.DistancePp(hv_Row[i * 7], hv_Column[i * 7], hv_Row[i * 7 + 6], hv_Column[i * 7 + 6], out Distance);
                            Get_actual_pixel[i] = Distance.D;
                            all_number          = all_number + Get_actual_pixel[i];
                        }
                        Pixel_number          = (Convert.ToDouble(this.textBox_pixel.Text)) / (all_number / 7);
                        Get_Cal_pixel         = true;
                        this.label_pixel.Text = Pixel_number.ToString();
                        Pixel_Trans           = Convert.ToDouble(Pixel_number.ToString());
                    }
                    catch
                    {
                        MessageBox.Show("请再次添加图像寻找计算像素比");
                    }
                }
                if (Read_file)
                {
                    ho_MapSingle1.Dispose();
                }
            }



            return(true);
        }
예제 #7
0
        private void action()
        {
            int log = 0;
            // Local iconic variables

            HObject ho_Image, ho_MarkContours = null;

            // Local control variables

            HTuple hv_AllCalibImageFiles = null, hv_ImageFiles = null;
            HTuple hv_Width = null, hv_Height = null, hv_CalibDataID = null;
            HTuple hv_CalPlateDescr = null, hv_StartParam = null, hv_Index = null;
            HTuple hv_StartPose = new HTuple(), hv_Error = null, hv_CameraParametersCalibrated = null;
            HTuple hv_ParLabels = null;

            // Initialize local and output iconic variables
            HOperatorSet.GenEmptyObj(out ho_Image);
            HOperatorSet.GenEmptyObj(out ho_MarkContours);
            //This example shows how to perform the basic calibration of a single
            //camera with multiple images of a calibration object.
            //Initialize visualization
            list_image_files(ImagePath, "default", new HTuple(), out hv_AllCalibImageFiles);
            HOperatorSet.TupleRegexpSelect(hv_AllCalibImageFiles, "calib_single_camera",
                                           out hv_ImageFiles);
            ho_Image.Dispose();
            HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles);
            HOperatorSet.GetImageSize(ho_Image, out hv_Width, out hv_Height);
            //
            //Create the 3d object models that visualize the current configuration
            //of camera and calibration plate. This may take a moment.
            //
            //Part I
            //
            //Create and setup the calibration model
            //
            //First, create the calibration data structure
            HOperatorSet.CreateCalibData("calibration_object", 1, 1, out hv_CalibDataID);
            //Specify the used calibration plane using the name of the
            //description file

            hv_CalPlateDescr = "calplate_" + txtCalibtate.Text + "mm.cpd";
            try
            {
                HOperatorSet.SetCalibDataCalibObject(hv_CalibDataID, 0, hv_CalPlateDescr);
            }
            catch
            {
                if (log == 0)
                {
                    log = 1;
                }
            }

            double sx = System.Convert.ToDouble(txtSx.Text);
            double sy = System.Convert.ToDouble(txtSy.Text);

            hv_StartParam    = new HTuple();
            hv_StartParam[0] = System.Convert.ToDouble(txtFocus.Text);
            hv_StartParam[1] = System.Convert.ToDouble(txtKappa.Text);
            hv_StartParam[2] = sx * 1e-006;
            hv_StartParam[3] = sy * 1e-006;
            hv_StartParam[4] = System.Convert.ToDouble(txtCx.Text);
            hv_StartParam[5] = System.Convert.ToDouble(txtCy.Text);
            hv_StartParam[6] = System.Convert.ToDouble(txtIx.Text);
            hv_StartParam[7] = System.Convert.ToDouble(txtIy.Text);
            HOperatorSet.SetCalibDataCamParam(hv_CalibDataID, 0, "area_scan_division", hv_StartParam);
            try
            {
                for (hv_Index = 0; (int)hv_Index <= (int)((new HTuple(hv_ImageFiles.TupleLength()
                                                                      )) - 1); hv_Index = (int)hv_Index + 1)
                {
                    try
                    {
                        ho_Image.Dispose();
                        HOperatorSet.ReadImage(out ho_Image, hv_ImageFiles.TupleSelect(hv_Index));

                        HOperatorSet.FindCalibObject(ho_Image, hv_CalibDataID, 0, 0, hv_Index, new HTuple(),
                                                     new HTuple());

                        HOperatorSet.GetCalibDataObservPose(hv_CalibDataID, 0, 0, hv_Index, out hv_StartPose);

                        ho_MarkContours.Dispose();
                        HOperatorSet.GetCalibDataObservContours(out ho_MarkContours, hv_CalibDataID,
                                                                "marks", 0, 0, hv_Index);
                        //图像标定成功
                        txtLog.Text = txtLog.Text + "图像" + hv_Index.ToString() + "处理成功" + "\r\n" + DateTime.Now + "\r\n";
                    }
                    catch
                    {
                        if (log == 0)
                        {
                            txtLog.Text = txtLog.Text + "图像" + hv_Index.ToString() + "处理失败" + "\r\n" + DateTime.Now + "\r\n";
                        }
                        //图像标定失败
                    }
                }
                HOperatorSet.CalibrateCameras(hv_CalibDataID, out hv_Error);
                HOperatorSet.GetCalibData(hv_CalibDataID, "camera", 0, "params", out hv_CameraParametersCalibrated);
                HOperatorSet.GetCalibData(hv_CalibDataID, "camera", 0, "params_labels", out hv_ParLabels);

                HOperatorSet.ClearCalibData(hv_CalibDataID);
                ho_Image.Dispose();
                ho_MarkContours.Dispose();
                //txtLog.Clear();
                txtLog.Text = txtLog.Text + "相机内参" + hv_CameraParametersCalibrated.ToString() + "\r\n" + DateTime.Now + "\r\n";
            }
            catch
            {
                if (log == 0)
                {
                    log = 2;
                }
            }
            switch (log)
            {
            case 1:
                txtLog.Text = txtLog.Text + "相机参数错误,标定失败" + "\r\n" + DateTime.Now + "\r\n";
                break;

            case 2:
                txtLog.Text = txtLog.Text + "图像质量出现问题,标定失败" + "\r\n" + DateTime.Now + "\r\n";
                break;

            default:
                txtLog.Text = txtLog.Text + "标定成功" + "\r\n" + DateTime.Now + "\r\n";
                break;
            }
        }