3

一段时间以来,我一直在尝试从任意角度拍摄台球桌的图像,定位四个角的坐标对 (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 ]

**不幸的是,结果是一个纯黑色的图像,里面什么都没有。我是在错误地接近这个吗?任何建议、代码、伪代码等都将不胜感激!

非常感谢您的阅读。**

4

0 回答 0