Как можно определить наличие двух крестов на изображении?

Здравствуйте! 

У меня есть вопрос о базовых принципах технического зрения. Задача заключается в следующем: имеется изображение, на котором располагаются два креста. Мне необходимо определить смещение между ними и угол их разворота. Хотя задача довольно простая и решается даже на уровне Arduino, я хотел бы понять, как это сделать. 

К сожалению, базовая информация об этом вопросе уже теряется среди новых материалов. Я столкнулся с двумя крайностями: с одной стороны, предлагается углублённое математика, которое так и не переходит к практике, а с другой – встречаются примеры, которые довольно далеки от моей задачи, например, нахождение всех зелёных трусов, пролетающих над Парижем. 

Не могли бы вы поделиться статьями или ресурсами, которые предлагают простые алгоритмы без использования сложных библиотек?
  • 21 октября 2024 г. 10:23
Ответы на вопрос 2
Здравствуйте!

Для решения вашей задачи по определению наличия и взаимного положения двух крестов на изображении можно использовать методы компьютерного зрения. Вот некоторые подходы, которые можно применить, не углубляясь в сложные библиотеки и теорию:

### 1. Обработка изображений с использованием OpenCV

OpenCV – это мощная библиотека для обработки изображений, которая позволяет легко выполнять базовые операции. Вот базовый алгоритм, который можно использовать для нахождения крестов и определения их смещения и угла разворота:

**Шаги:**
1. **Загрузка изображения**: Сначала загрузите изображение с крестами.
2. **Преобразование в оттенки серого**: Это упростит обработку. Можно использовать `cv2.cvtColor`.
3. **Бинаризация**: Примените бинаризацию (например, с помощью метода Оцу) для выделения крестов.
4. **Поиск контуров**: Используйте `cv2.findContours` для нахождения контуров на бинарном изображении.
5. **Фильтрация контуров**: Найдите контуры, соответствующие форме крестов, фильтруя по площадям и аспектному отношению.
6. **Анализ крестообразных контуров**: Для оставшихся контуров можно вычислить центры масс и углы. Это можно сделать с помощью `cv2.moments` для нахождения центра масс.
7. **Вычисление смещения и угла**: Если у вас есть координаты центров двух крестов, вы можете легко вычислить расстояние между ними и угол поворота.

### Пример кода:

```python
import cv2
import numpy as np

# Загрузить изображение
image = cv2.imread('image.png')
gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# Бинаризация изображения
_, binary = cv2.threshold(gray, 128, 255, cv2.THRESH_BINARY_INV)

# Поиск контуров
contours, _ = cv2.findContours(binary, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)

# Фильтрация и анализ контуров
crosses = []
for cnt in contours:
    area = cv2.contourArea(cnt)
    if area > 100:  # Фильтруйте по адекватной площади
        M = cv2.moments(cnt)
        if M["m00"] != 0:
            cX = int(M["m10"] / M["m00"])
            cY = int(M["m01"] / M["m00"])
            crosses.append((cX, cY))

# Предполагая, что обнаружены два креста
if len(crosses) == 2:
    p1, p2 = crosses
    shift = np.linalg.norm(np.array(p1) - np.array(p2))
    angle = np.arctan2(p2[1] - p1[1], p2[0] - p1[0]) * 180 / np.pi
    print(f'Смещение: {shift}, Угол: {angle}')
```

### 2. Математические методы

Если вы хотите реализовать алгоритм без использования библиотек, можно воспользоваться простыми методами обработки изображений:

- **Преобразование изображения в массив пикселей**.
- **Поиск ярких пикселей**: если крест имеет определённый цвет, можно перебрать все пиксели и находить их координаты.
- **Анализ полученных координат**: вычислите расстояние и угол между точками.

### Полезные ресурсы

Вот некоторые ресурсы, которые могут помочь вам в изучении:

- [Официальная документация OpenCV](https://docs.opencv.org/master/index.html)
- Книги по компьютерному зрению (например, "Learning OpenCV" - книги от Ашцута Фернандеса и др.)
- [YouTube-каналы](https://www.youtube.com/results?search_query=opencv+tutorial) с учебниками по OpenCV.

Эти подходы помогут вам не только реализовать вашу задачу, но и более глубоко понять принципы обработки изображений.
Преобразование Хафа ( https://ru.wikipedia.org/wiki/%D0%9F%D1%80%D0%B5%D... ) 
позволяет находить на картинках длинные прямые линии. В виде уравнения прямой.
Тоесть точка например и угол.

Но я не уверен что именно это автор будет практически делать. Возможно
в наше время есть готовые библиотеки для поиска каких-то шаблонных
картинок. В любом случае лучше видеть сначала что мы ищем.
Похожие вопросы