从 OpenCV 中的网格获取正方形,为什么系统无法检测到更多正方形?
Getting squares from a grid in OpenCV, why cant system detect more squares?
我一直在尝试创建一个棋盘 reader,到目前为止没有什么特别的,只是希望能够阅读显示的方块。问题似乎是,虽然可以检测到一些方块,但系统却忽略了其他方块。目前我已经阅读并尝试了这些类似问题的所有解决方案:
Python OpenCV: Rubik's cube solver color extraction
我目前正在处理的图像:
我拍摄了图像并应用了一系列进程:
B2G -> Thresh -> Blur -> CannyLineDet -> Inverted -> FindCountours
ROI 斩波前的输出是:
目前输出的ROI如下:
这是代码,但它在 Java 中,如果发布的解决方案在 python 中,那很好,因为它很容易在两者之间转换。
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
boolean writeFile =true;
// Mat src =
// Imgcodecs.imread("C:\Users\thorf\Documents\JavaWS\openCVtest\src\openCVtest\linesinput.png");
Mat src = Imgcodecs.imread("C:\Users\thorf\Documents\JavaWS\openCVtest\src\openCVtest\chessboard.png");
Mat grey = new Mat();
Size size = new Size(3, 3);
double[][] sharpenKernel = { { -1, -1, -1 }, { -1, 9, -1 }, { -1, -1, -1 } };
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, size);
Imgproc.cvtColor(src, grey, Imgproc.COLOR_BGR2GRAY);
Mat threshed = new Mat();
Imgproc.threshold(grey, threshed, 200, 255, Imgproc.THRESH_OTSU);
Imgcodecs.imwrite("threshed.png", threshed);
showWaitDestroy("threshed", threshed);
Mat blur = new Mat();
Imgproc.medianBlur(threshed, blur, 5);
Imgcodecs.imwrite("blur.png", blur);
showWaitDestroy("blur", blur);
Mat edges = new Mat();
Imgproc.Canny(blur, edges, 50, 400);
Imgcodecs.imwrite("edges.png", edges);
showWaitDestroy("edges", edges);
Mat inv = new Mat();
Core.bitwise_not(edges, inv);
Imgcodecs.imwrite("inv.png", inv);
showWaitDestroy("inv", inv);
processROIs(inv, src);
可以看出,只有某些方块被检测到,通常是白色的并且里面有碎片,但情况并非总是如此。
我的问题是是否有更好的方法来执行此操作,或者我是否在此实现中遗漏了某些内容?第一次使用 CV,如有任何帮助,我们将不胜感激。
EDIT1:我不能将图像分成几个部分,因为输入并不总是这个图像。它可能在另一个边界等,这使我无法找到外部边界。
OpenCV 有一个开箱即用的方法来查找棋盘角:https://docs.opencv.org/4.5.1/d9/d0c/group__calib3d.html#ga93efa9b0aa890de240ca32b11253dd4a
在 java 中看起来像:
//for a standard 8x8 chessboard, the method needs the inner corners
int nrows = 7;
int ncols = 7;
MatOfPoint2f corners = new MatOfPoint2f();
Calib3d.findChessboardCorners(myImg, corners, new Size(nrows, ncols));
我一直在尝试创建一个棋盘 reader,到目前为止没有什么特别的,只是希望能够阅读显示的方块。问题似乎是,虽然可以检测到一些方块,但系统却忽略了其他方块。目前我已经阅读并尝试了这些类似问题的所有解决方案:
Python OpenCV: Rubik's cube solver color extraction
我目前正在处理的图像:
我拍摄了图像并应用了一系列进程: B2G -> Thresh -> Blur -> CannyLineDet -> Inverted -> FindCountours
ROI 斩波前的输出是:
目前输出的ROI如下:
这是代码,但它在 Java 中,如果发布的解决方案在 python 中,那很好,因为它很容易在两者之间转换。
System.loadLibrary(Core.NATIVE_LIBRARY_NAME);
boolean writeFile =true;
// Mat src =
// Imgcodecs.imread("C:\Users\thorf\Documents\JavaWS\openCVtest\src\openCVtest\linesinput.png");
Mat src = Imgcodecs.imread("C:\Users\thorf\Documents\JavaWS\openCVtest\src\openCVtest\chessboard.png");
Mat grey = new Mat();
Size size = new Size(3, 3);
double[][] sharpenKernel = { { -1, -1, -1 }, { -1, 9, -1 }, { -1, -1, -1 } };
Mat kernel = Imgproc.getStructuringElement(Imgproc.MORPH_RECT, size);
Imgproc.cvtColor(src, grey, Imgproc.COLOR_BGR2GRAY);
Mat threshed = new Mat();
Imgproc.threshold(grey, threshed, 200, 255, Imgproc.THRESH_OTSU);
Imgcodecs.imwrite("threshed.png", threshed);
showWaitDestroy("threshed", threshed);
Mat blur = new Mat();
Imgproc.medianBlur(threshed, blur, 5);
Imgcodecs.imwrite("blur.png", blur);
showWaitDestroy("blur", blur);
Mat edges = new Mat();
Imgproc.Canny(blur, edges, 50, 400);
Imgcodecs.imwrite("edges.png", edges);
showWaitDestroy("edges", edges);
Mat inv = new Mat();
Core.bitwise_not(edges, inv);
Imgcodecs.imwrite("inv.png", inv);
showWaitDestroy("inv", inv);
processROIs(inv, src);
可以看出,只有某些方块被检测到,通常是白色的并且里面有碎片,但情况并非总是如此。 我的问题是是否有更好的方法来执行此操作,或者我是否在此实现中遗漏了某些内容?第一次使用 CV,如有任何帮助,我们将不胜感激。 EDIT1:我不能将图像分成几个部分,因为输入并不总是这个图像。它可能在另一个边界等,这使我无法找到外部边界。
OpenCV 有一个开箱即用的方法来查找棋盘角:https://docs.opencv.org/4.5.1/d9/d0c/group__calib3d.html#ga93efa9b0aa890de240ca32b11253dd4a
在 java 中看起来像:
//for a standard 8x8 chessboard, the method needs the inner corners
int nrows = 7;
int ncols = 7;
MatOfPoint2f corners = new MatOfPoint2f();
Calib3d.findChessboardCorners(myImg, corners, new Size(nrows, ncols));