一段时间以来,我一直在尝试从任意角度拍摄台球桌的图像,定位四个角的坐标对 (x,y),然后旋转/扭曲图像,以使生成的图像仅包含来自鸟瞰图。我正在使用 JavaCV 来完成这项任务。到目前为止,我已经编写了成功计算表格四个角的代码,如下所示(我在四个角上编写了半径为 25 的红色 cvCircles)。
找到我的四个角后:
角 1(右下)X:3234 Y:1858
角 2(左下)X:0 Y:1801
角 3(右上)X:2722 Y:1069
角 4(左上)X: 523 岁:1030
我尝试使用 cvFindHomography 然后使用 cvWarpPerspectve 来完成此操作。我的代码可以在下面找到:
// Initialize Table Corners as Image Coordinates
float[] aImg = {
corners.get(0).x(), corners.get(0).y(), // BR X: 3234 Y: 1858
corners.get(1).x(), corners.get(1).y(), // BL X: 0 Y: 1801
corners.get(2).x(), corners.get(2).y(), // TR X: 2722 Y: 1069
corners.get(3).x(), corners.get(3).y() // TL X: 523 Y: 1030
};
// Initialize World Coordinates (Are these even correct? How do I determine these?)
float[] aWorld = {
0.0f, 0.0f,
0.0f, 1.0f,
1.0f, 0.0f,
1.0f,1.0f
};
// Create 3x3 Homography Matrix
CvMat homography = cvCreateMat(3, 3, opencv_core.CV_32FC1);
opencv_imgproc.cvGetPerspectiveTransform(aImg, aWorld, homography);
System.out.println(homography.toString());
// Create imgWarped and Warp Perspective
IplImage imgWarped = cvCreateImage(cvGetSize(img), 8, 3);
opencv_imgproc.cvWarpPerspective(img, imgWarped, homography, opencv_imgproc.CV_INTER_LINEAR, CvScalar.ZERO);
// Create Canvas and Display Image
CanvasFrame canvas = new CanvasFrame("Warped Image");
canvas.showImage(imgWarped);
canvas.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
我获得的 3x3 单应矩阵是:
[ 0.0011688289, 7.928632E-4, -1.4279466
-8.698455E-5, 0.0049045905, -5.006235
-2.8205379E-5, 0.0015696458, 1.0 ]