标题最近做的项目需要用C#做对相机标定的软件,网上C++实现的代码一堆,C#实现的几乎没有,查了很多资料,花了将近4天才做出来这个软件,使用的P3P算法接下来把原理和代码贴出来,大家共同学习。
软件界面如图下图所示:
我这是把四组大地坐标和四座像素点坐标分为两个txt文件读取的,得到的数据显示和验证结果在界面显示,更直观些。我随便找的四组坐标,四组用来计算R,T矩阵,一组用来验证误差。最后计算的像素差值误差也很小,下面软件我使用的是准确的真实数据。
首先下载图片中OpenCvSharp3的库
代码里面引用加入using OpenCvSharp,如
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using OpenCvSharp;
using System.Data;
四组大地的坐标写入List(注:做项目的话需要输入准确的数据,一个大地坐标对应着一个像素坐标。项目公司提供的数据我就不写出来了,以下的坐标数值和相机参数是我随便设置的数字):
List<Point3f> threeDim = new List<Point3f>()
{
new Point3f(100f, 200f, 300f),
new Point3f(400f, 500f, 600f),
new Point3f(700f, 800f, 900f),
new Point3f(600f, 800f, 200f),
};
四组像素的坐标写入List:
List<Point2f> twoDim = new List<Point2f>()
{
new Point2f(100f, 200f),
new Point2f(400f, 500f),
new Point2f(700f, 800f),
new Point2f(900f, 100f),
};
double[] camD = new double[9] {
2, 0, 99.5, 0, 21.83, 39.5, 0, 0, 1 };