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?
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.