//imgx 图像坐标点
//xw 世界坐标点
void getHomoMatrix(vector<float> &imgx,vector<float> &imgy,vector<float> &xw,vector<float>&yw){
Mat hom;
Mat m(2*imgx.size(), 9, CV_32F);
for (int i = 0; i < imgx.size()*2; i += 2) {
float *pre=m.ptr<float>(i);
float *rear = m.ptr<float>(i + 1);
pre[0] = xw[i/2];
pre[1] = yw[i / 2];
pre[2] = 1.0f;
pre[3] = 0;
pre[4] = 0;
pre[5] = 0;
pre[6] = -imgx[i / 2]*xw[i / 2];
pre[7] = -imgx[i / 2]*yw[i / 2];
pre[8] = -imgx[i / 2];
rear[0] = 0;
rear[1] = 0;
rear[2] = 0;
rear[3] = xw[i / 2];
rear[4] = yw[i / 2];
rear[5] = 1.0f;
rear[6] = -imgy[i / 2]*xw[i / 2];
rear[7] = -imgy[i / 2]*yw[i / 2];
rear[8] = -imgy[i / 2];
}
//转换成最小二乘法的形式
Mat m2=m.t()*m;
Mat ev, evector;
eigen(m2,ev,evector);
//获取最小特征值所对应的特征向量
float *homoMatrix = evector.ptr<float>(8);
for (int i = 0; i < ix.size(); i++) {
float pc=xw[i] * homoMatrix[0]+yw[i]*homoMatrix[1]+homoMatrix[2];
float pc2= xw[i] * homoMatrix[3] + yw[i] * homoMatrix[4] + homoMatrix[5];
float pc3= xw[i] * homoMatrix[6] + yw[i] * homoMatrix[7] + homoMatrix[8];
float xx = pc / pc3;
float yy = pc2 / pc3;
cout << xx <<""<< yy << ":" << ix[i] << " "<<iy[i]<<endl;
}
}
原理参考链接:四点求取单应性矩阵