如何根据角和像元数计算交点

时间:2019-03-26 21:02:19

标签: java android opencv opencv4android

我试图根据我一直拥有的4个角点和像元数(在我的情况下为9,所以是9x9矩阵,数独谜题)找到所有交点(它们的x和y值)。

我的4个角标记有绿色十字,并标记为P1至P4。 我试图进行计算,但仅在第一行就做到了。

double xDis = p2.x - p1.x;
double yDis = p2.y - p1.y;
double xW = xDis / 9;
double yH = yDis / 9;
for (int i = 0; i < 10; i++) {
    Point point = new Point(p1.x + (i * xW), p1.y + (i * yH));
}

此代码将完全按照我的预期工作,但仅适用于第一行。 我在这里想念什么?已经有某种算法已经做到了吗?欢迎任何提示。 请注意,我将android与OpenCV库一起使用。

points

2 个答案:

答案 0 :(得分:0)

您只需要在第一行进行一次计算即可。

将您的for循环放入另一个for循环中,并运行10次,您应该会很好(添加任何x,y转换都会在y向下移动时发生)。

至于是否有任何自动方法可以做到这一点。我可以建议使用Harris Corner Detection。我怀疑使用正确的阈值只会使您的线角变粗。您也可以尝试进行线检测并寻找交叉点。

此外,如果您发现找不到合适的台词/转角,则this文章可能会有所帮助。您可以校正灯光下的阴影并获得良好的干净图像进行分析。

答案 1 :(得分:0)

正如上面评论中所述,我最终将图像变形然后切割。看起来像这样

if (points != null) {
        Point p1 = points[0];
        Point p2 = points[1];
        Point p3 = points[2];
        Point p4 = points[3];

        MatOfPoint2f src = new MatOfPoint2f(
                p1,
                p2,
                p3,
                p4);

        drawMarker(frame, p1, new Scalar(255,0,0), 0, 20, 1);
        drawMarker(frame, p2, new Scalar(255,0,0), 0, 20, 1);
        drawMarker(frame, p3, new Scalar(255,0,0), 0, 20, 1);
        drawMarker(frame, p4, new Scalar(255,0,0), 0, 20, 1);

        double x = p2.x - p1.x;
        double y = p3.y - p2.y;

        MatOfPoint2f dst = new MatOfPoint2f(
                new Point(0, 0),
                new Point(x,0),
                new Point(0,y),
                new Point(x,y)
        );

        Mat warpMat = Imgproc.getPerspectiveTransform(src, dst);
        //This is you new image as Mat
        Mat destImage = new Mat();
        Imgproc.warpPerspective(bw2, destImage, warpMat, new Size(x, y));

        List<Mat> cells = getCells(destImage, destImage.width() / 9, destImage.height / 9);


    }



private List<Mat> getCells(Mat m, int width, int height) {

    Size cellSize = new Size(width, height);
    List<Mat> cells = new ArrayList<>();

    for (int row = 0; row < 9; row++) {
        for (int col = 0; col < 9; col++) {
            Rect rect = new Rect(new Point(col * width, row * height), cellSize);

            Mat digit = new Mat(m, rect).clone();
            cells.add(digit);
        }
    }

    return cells;
}