Search code examples
c#unity-game-engineemgucv

EmguCV HomographyFind - Unity always receive zero


I am working in Unity and trying to make a grid and camera sync.

To achieve this, I'm using the EmguCV/OpenCV method HomographyFind: http://www.emgu.com/wiki/files/1.4.0.0/html/3906193c-e458-2cb5-7667-fbb94114d179.htm

My calibration function looks like the following:

 Matrix<float> homography = new Matrix<float>(3, 3);
    float[,] sourcePoints;
    float[,] destPoints;
    void Calibrate()
    {
        sourcePoints = new float[,]{{Cam.greenRect[0].X, Cam.greenRect[0].Y}, {Cam.greenRect[1].X, Cam.greenRect[1].Y}, {Cam.greenRect[2].X, Cam.greenRect[2].Y}, {Cam.greenRect[3].X, Cam.greenRect[3].Y}};
        destPoints = new float[,] { { goTile[0].transform.position.x, goTile[0].transform.position.y }, { goTile[32].transform.position.x, goTile[32].transform.position.y }, { goTile[858].transform.position.x, goTile[858].transform.position.y }, { goTile[890].transform.position.x, goTile[890].transform.position.y } };
        Emgu.CV.Matrix<float> sourceMat = new Matrix<float>(sourcePoints);
        Emgu.CV.Matrix<float> destMat = new Matrix<float>(destPoints);

        CvInvoke.FindHomography(sourceMat, destMat, homography, Emgu.CV.CvEnum.HomographyMethod.Default);
        call.GetComponent<Text>();
        call.text = destPoints[3,0].ToString();

        calibrationComplete = true;

    }

Cam.greenRect and goTile values seem to fit, but all positions in my homography seems to be 0.

Reasoned this, my Unity translation also returns 0 (Vector2):

Vector2 coordToUnity(Vector2 fingerPos)
    {
        float x = (fingerPos.x * homography.Data[0, 0]) + (fingerPos.y * homography[0, 1]) + (1 * homography[0, 2]);
        float y = (fingerPos.x * homography.Data[1, 0]) + (fingerPos.y * homography[1, 1]) + (1 * homography[1, 2]);
        return new Vector2(x, y);
    }   

I believe the issue might rely in my float[,] to matrix convertion, or my algorithm in coordToUnity.

Issue: coordToUnity always return 0. Where am I implementing EmguCV.HomographyFind wrong?


Solution

  • The answer relied in using floats for all my values. The method in this EmguCV version only accepts doubles.

    If it doesn't use doubles, the output homograph will return 0.