使用由小方块定义的OpenCV检测图像上的物体角和角度?

时间:2017-01-19 16:50:27

标签: java opencv image-processing computer-vision opencv3.0

我一直在努力寻找JAVA最好和最简单的方法 - 如何使用OpenCV检测图像迷宫,并计算角点和角度,使图像旋转到水平位置。

迷宫的定义是在角落放置3个小黄纸方块。

我找到了这个部分解决方案:How can I detect registration markers on paper using OpenCV? - 但我没有技能可以修改它为我工作: - /

两种测试图像情况:

Example image

Example image 2

谢谢大家的帮助!

1 个答案:

答案 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按面积大小对角进行排序。 Partial result