二维空间中两个三角形之间的映射关系
程序员文章站
2024-03-16 18:24:10
...
参考网址:http://blog.csdn.net/duanwuqing/article/details/5458286
代码实现方法一:
得到映射矩阵M
Mat ObtainM(vector <CvPoint> vOriginalPoint, vector <CvPoint> vMapPoint)
{
Mat dstMapM;
if (3 != vOriginalPoint.size())
{
return dstMapM;
}
CvMat*matOriginal = cvCreateMat(3, 3, CV_64FC1);
cvZero(matOriginal);
CvMat*matMap = cvCreateMat(3, 3, CV_64FC1);
cvZero(matMap);
for (int i = 0, iLen = vOriginalPoint.size(); i < iLen; ++i)
{
cvmSet(matOriginal, i, 0, vOriginalPoint[i].x);
cvmSet(matOriginal, i, 1, vOriginalPoint[i].y);
cvmSet(matOriginal, i, 2, 1);
cvmSet(matMap, i, 0, vMapPoint[i].x);
cvmSet(matMap, i, 1, vMapPoint[i].y);
cvmSet(matMap, i, 2, 1);
}
CvMat *matOriginalInv;
matOriginalInv = cvCreateMat(3, 3, CV_64FC1);
double vX = cvInvert(matOriginal, matOriginalInv, CV_SVD);
CvMat *matMapM;
matMapM = cvCreateMat(3, 3, CV_64FC1);
Mat mInv = Mat(matOriginalInv, true);
Mat mMap = Mat(matMap, true);
dstMapM = mInv * mMap;
cvReleaseMat(&matOriginal);
matOriginal = NULL;
cvReleaseMat(&matMap);
matMap = NULL;
cvReleaseMat(&matOriginalInv);
matOriginalInv = NULL;
cvReleaseMat(&matMapM);
matMapM = NULL;
return dstMapM;
}
根据映射矩阵得到映射点位置
bool ObtainMPoint(cv::Mat mapM, CvPoint ptIn, CvPoint& ptOut)
{
if (mapM.empty())
{
return false;
}
CvMat*matOriginal = cvCreateMat(1, 3, CV_64FC1);
cvZero(matOriginal);
cvmSet(matOriginal, 0, 0, ptIn.x);
cvmSet(matOriginal, 0, 1, ptIn.y);
cvmSet(matOriginal, 0, 2, 1);
Mat mInv = Mat(matOriginal, true);
Mat dstMapM = mInv * mapM;
ptOut.x = dstMapM.at<double>(0, 0);
ptOut.y = dstMapM.at<double>(0, 1);
cvReleaseMat(&matOriginal);
matOriginal = NULL;
return true;
}
推荐阅读