与Emgu(OpenCV)的转换 - 仿射/透视?

时间:2011-02-06 20:49:54

标签: c# opencv transformation emgucv affinetransform

我目前正在尝试通过使用EMGU来实现转换,但我似乎无法理解它是如何工作的(并且似乎没有任何在线示例)。

我已经得到了我的图像,我希望从(和)转换到4个点,虽然我不知道还需要什么其他变量,但它要求'mapMat'?

这是我到目前为止所做的:

        float[,] tmp = {
                            {bottomLeft.x, bottomLeft.y},
                            {topLeft.x, topLeft.y},
                            {topRight.x, topRight.y},
                            {bottomRight.x, bottomRight.y}
                       };
        Matrix<float> sourceMat = new Matrix<float>(tmp);
        float[,] target = {
                            {0, height},
                            {0, 0},
                            {width, 0},
                            {width, height}
                       };
        Matrix<float> targetMat = new Matrix<float>(target);
        //mapMat = just a placeholder matrix?
        Matrix<float> mapMat = new Matrix<float>(target);
        CvInvoke.cvGetAffineTransform(sourceMat.Ptr, targetMat.Ptr, mapMat.Ptr);

然而,这不起作用。我也不确定仿射变换是否是最理想的解决方案?我也读过一些关于FindHomography的内容以及透视转换,但不确定它们是否适用于此。

我希望实现的目标转换是这样的:

http://img832.imageshack.us/img832/5157/targettransform.png

非常感谢任何帮助,

由于

1 个答案:

答案 0 :(得分:3)

首先介绍一下:

  • 如果您想要仿射转换(从图片中看起来像),您需要至少3个点对,因为您有6个参数需要估算
  • 如果你想要一个更通用的转换,即单应性,你需要至少4个点对,因为你有8个参数需要估算

假设您有4个源角和目标角,并且您想要估计透视转换,此代码应该按照您的要求执行:

PointF[] pts1 = new PointF[4];
PointF[] pts2 = new PointF[4];
HomographyMatrix homography;
for (int i = 0; i < 4; i++)
{
  pts1[i] = new PointF (sourceCorner[i].X, sourceCorner[i].Y);
  pts2[i] = new PointF (destCorner[i].X, destCorner[i].Y);
}
homography = CameraCalibration.GetPerspectiveTransform(pts1, pts2);

查看CameraCalibration了解其他有用的方法