我试图根据我一直拥有的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库一起使用。
答案 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;
}