Внешние параметры, используя emgucv
Привет, я новичок с резюме emgu и кодовой штукой. И в настоящее время у меня есть код калибровки камеры с помощью emgucv, и я хочу добавить код для вычисления внешних параметров здесь.. Но я не знаю, какой из них ты добавишь и как.- Значит, кто-нибудь может мне помочь? Вот код для калибровки камеры..
#region Methods public void Solve() { MCvPoint3D32f[][] platePointsperView = new MCvPoint3D32f[_imageNumber][]; PointF[][] crossesperView = new PointF[_imageNumber][]; int index = 0; Trace.WriteLine("Camera Calibration"); foreach (Crosses crosses in _crosses.CrossesOnImage) { ComposeInputPerView(crosses, ref crossesperView[index], ref platePointsperView[index]); //crossesperView[index] = ComposeInputCrossesCoordPerView(crosses); index++; } //calculate calibration CameraCalibration.CalibrateCamera(platePointsperView, crossesperView, _imageSize, _ioParams, Emgu.CV.CvEnum.CALIB_TYPE.DEFAULT, out _eoParams); DisplayIOParams(_ioParams); double fovx =0.0; double fovy=0.0; double focal=0.0; MCvPoint2D64f pp = new MCvPoint2D64f(); double aspect = 0.0; CvInvoke.cvCalibrationMatrixValues(_ioParams.IntrinsicMatrix, _imageSize.Width, _imageSize.Height, 4.9, 3.7, ref fovx, ref fovy, ref focal, ref pp, ref aspect); //CvInvoke.cvCalibrationMatrixValues(_ioParams.IntrinsicMatrix, _imageSize.Width, _imageSize.Height, // 0.0, 0.0, ref fovx, ref fovy, ref focal, ref pp, ref aspect); Trace.WriteLine("fovx = " + fovx.ToString()); Trace.WriteLine("fovy = " + fovy.ToString()); Trace.WriteLine("focal = " + focal.ToString()); Trace.WriteLine("aspect ratio = " + aspect.ToString()); Trace.WriteLine("principal point x,y: " + pp.x.ToString() + " , " + pp.y.ToString()); PrintCalibrationParameters(); //CameraCalibration.CalibrateCamera(platePointsperView, crossesperView, // _imageSize, // _ioParams, // Emgu.CV.CvEnum.CALIB_TYPE.CV_CALIB_FIX_FOCAL_LENGTH, // out _eoParams); //Trace.WriteLine("fovx = " + fovx.ToString()); //Trace.WriteLine("fovy = " + fovy.ToString()); //Trace.WriteLine("focal = " + focal.ToString()); //Trace.WriteLine("aspect ratio = " + aspect.ToString()); //Trace.WriteLine("principal point x,y: " + pp.x.ToString() + " , " + pp.y.ToString()); //PrintCalibrationParameters(); //CameraCalibration.CalibrateCamera(platePointsperView, crossesperView, // _imageSize, // _ioParams, // Emgu.CV.CvEnum.CALIB_TYPE.CV_CALIB_FIX_PRINCIPAL_POINT | Emgu.CV.CvEnum.CALIB_TYPE.CV_CALIB_FIX_K1, // out _eoParams); //Trace.WriteLine("fovx = " + fovx.ToString()); //Trace.WriteLine("fovy = " + fovy.ToString()); //Trace.WriteLine("focal = " + focal.ToString()); //Trace.WriteLine("aspect ratio = " + aspect.ToString()); //Trace.WriteLine("principal point x,y: " + pp.x.ToString() + " , " + pp.y.ToString()); //PrintCalibrationParameters(); } private void ComposeInputPerView(Crosses crosses, ref PointF[] imgPoints, ref MCvPoint3D32f[] platePoints) { //MCvPoint3D32f[] temp = null; //create the query for image points IEnumerable<Cross> sortedCrossPoints = from crossPt in crosses.CrossPoints orderby (int.Parse(crossPt.LabelName)) select crossPt; List<PointF> tempCross = new List<PointF>(); foreach (Cross c in sortedCrossPoints) { //create PointF PointF pt = new PointF(c.Point2D.X, c.Point2D.Y); tempCross.Add(pt); //Trace.WriteLine(c.LabelName + c.Point2D.ToString()+ " " + pt.X.ToString() + " ; " + pt.Y.ToString()); } //Trace.WriteLine("Number of list: " + tempCross.Count.ToString()); imgPoints = tempCross.ToArray(); //Create the query for plate points List<MCvPoint3D32f> ptsCv = new List<MCvPoint3D32f>(); foreach (Cross c in sortedCrossPoints) { String label = c.LabelName; foreach (PlateCalibrationPoint pt in _plateCoord.PlatePoints) { if (int.Parse(label) == int.Parse(pt.Label)) { MCvPoint3D32f p = new MCvPoint3D32f(pt.Point2D.X, pt.Point2D.Y, 0.0f); ptsCv.Add(p); } } } platePoints = ptsCv.ToArray(); } private void DisplayIOParams(IntrinsicCameraParameters io) { Trace.WriteLine("Intrinsic Camera Parameters:"); Trace.WriteLine(io.IntrinsicMatrix.Data.ToString()); } private PointF[] ComposeInputCrossesCoordPerView(Crosses crosses) { PointF[] temp = new PointF[2]; return temp; } private void PrintIntrinsicMatrix() { Trace.WriteLine("Intrinsic Matrix:"); String line1 = String.Format("{0} {1} {2}", _ioParams.IntrinsicMatrix[0, 0], _ioParams.IntrinsicMatrix[0, 1], _ioParams.IntrinsicMatrix[0, 2]); String line2 = String.Format("{0} {1} {2}", _ioParams.IntrinsicMatrix[1, 0], _ioParams.IntrinsicMatrix[1, 1], _ioParams.IntrinsicMatrix[1, 2]); String line3 = String.Format("{0} {1} {2}", _ioParams.IntrinsicMatrix[2, 0], _ioParams.IntrinsicMatrix[2, 1], _ioParams.IntrinsicMatrix[2, 2]); Trace.WriteLine(line1); Trace.WriteLine(line2); Trace.WriteLine(line3); } private void PrintCalibrationParameters() { Trace.WriteLine("k1: " + _ioParams.DistortionCoeffs[0, 0].ToString()); Trace.WriteLine("k2: " + _ioParams.DistortionCoeffs[1, 0].ToString()); Trace.WriteLine("p1: " + _ioParams.DistortionCoeffs[2, 0].ToString()); Trace.WriteLine("p2: " + _ioParams.DistortionCoeffs[3, 0].ToString()); Trace.WriteLine("k3: " + _ioParams.DistortionCoeffs[4, 0].ToString()); PrintIntrinsicMatrix(); } #endregion } }
Что я уже пробовал:
Я попытался заглянуть на веб-страницу emgucv, но так ничего и не понял..