我一直在努力寻找JAVA最好和最简单的方法 - 如何使用OpenCV检测图像迷宫,并计算角点和角度,使图像旋转到水平位置。
迷宫的定义是在角落放置3个小黄纸方块。
我找到了这个部分解决方案:How can I detect registration markers on paper using OpenCV? - 但我没有技能可以修改它为我工作: - /
两种测试图像情况:
谢谢大家的帮助!
答案 0 :(得分:1)
好的,谢谢你对我的问题的鼓励。多亏了它,我发现这部分解决了:
Mat mazeImage = Imgcodecs.imread("vzory/real_5.jpg"); //, Imgcodecs.CV_LOAD_IMAGE_COLOR
Mat hsv = new Mat();
Mat treshold = new Mat();
Mat hierarchy = new Mat();
Imgproc.cvtColor(mazeImage, hsv, Imgproc.COLOR_BGR2HSV);
Core.inRange(hsv, new Scalar(20,135,135), new Scalar(30, 255, 255), treshold);
List<MatOfPoint> contours = new ArrayList<>();
Imgproc.findContours(treshold, contours, hierarchy, Imgproc.RETR_LIST, Imgproc.CHAIN_APPROX_SIMPLE);
PointContourCollection pointContourCollection = new PointContourCollection(new PointContourComparator());
for (MatOfPoint contour : contours) {
Point center = new Point();
Moments moments = Imgproc.moments(contour);
center.x = (int) (moments.m10/moments.m00);
center.y = (int) (moments.m01/moments.m00);
double area = Imgproc.contourArea(contour);
if(area > 0.1){
pointContourCollection.add(new PointContour(center, area, contour));
}
}
Imgproc.drawContours(mazeImage, contours, -1, new Scalar(0, 255, 0), 5);
Class PointContourCollection - ArrayList的扩展 - 仅用于存储具有中心位置及其区域的黄色角。使用PointContourComparator按面积大小对角进行排序。