2017-01-19 6 views
-1

Я пытался найти лучший и самый простой способ в JAVA - как обнаружить лабиринт изображения с помощью OpenCV и вычислить угловые точки и угол поворота изображения в горизонтальное положение.Обнаружение углов и угла объекта при изображении с использованием OpenCV, определяемого малыми квадратами?

Лабиринт определяется тремя небольшими желтыми бумажными квадратами, расположенными в углах.

Я нашел частичное решение: How can I detect registration markers on paper using OpenCV? - но у меня нет навыков, чтобы изменить его, чтобы работать на меня: -/

Два тестирования изображения ситуаций:

Example image

Example image 2

Спасибо всем за помощь!

+0

Серьезно? Вы ожидаете, что кто-то придумает вам алгоритм? – Andremoniy

+0

Благодарим вас за помощь. : -/ – Filip

+1

Это классный проект, чтобы узнать компьютерное зрение, не позволяйте никому дать вам решение, если вы его найдете сами, это будет означать, что вы знаете немного больше компьютерного видения :) Если у вас есть конкретные вопросы о том, как это сделать что-то, мы поможем. Это проблема широкая. –

ответ

1

Хорошо, спасибо за поддержку с моей проблемой. Благодаря этому я нашел частично soloution:

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); 

Класса PointContourCollection - расширение ArrayList - для хранения только желтые углов с центральной позицией и их площадью. Уголки сортируются с помощью PointContourComparator по размеру области. Partial result

+0

Выглядит хорошо для меня! Почему частично? –

+0

Потому что теперь мне нужно найти некоторое разрешение для поворота изображения в горизонтальное положение. Но есть «небольшая» проблема - лабиринт можно вращать для четырех разных поворотов. Я вычислил (сейчас) все углы линий, но теперь мне нужно найти решение, как решить, какой угол является «лучшим» способом для хорошего вращения. :-) – Filip

+0

Как его повернуть? –