Распознать углы доски

Den1xxx

Разрушитель (V)
Сообщения
126
Симпатии
69
Баллы
1 016
Здравствуйте.
Требуется помощь в написании скрипта по распознаванию углов доски на картинке.
Для последующего нанесения размеров.
Вот примерный образец.
9-20243.jpg
Нужно надёжно распознать углы доски: левый верхний, правый верхний, левый нижний.
Потом скрипт будет массово обрабатывать подобные картинки — наносить надписи и размеры на распознанные углы.
Если кто хочет взяться, пишите сроки и сумму.
Ну или просто подскажите, как такое сделать, буду благодарен.
У меня было несколько попыток, но надёжного решения не получилось.
Прогонял поточечно, сравнивая цвета, но видимо по одной точке нельзя, на изображениях бывают мелкие артефакты и скрипт сбивается.
 
У меня было несколько попыток, но надёжного решения не получилось.
Прогонял поточечно, сравнивая цвета, но видимо по одной точке нельзя, на изображениях бывают мелкие артефакты и скрипт сбивается.
Доставайте черновики и попробуйте объект(доску) перевести в чёрно-белый формат (белый фон, чёрный объект)
 
Php не лучший инструмент для такой задачи, попробуйте лучше питон.
Там библиотек для таких задач очень много
 
В наше время ответы на такие вопросы проще задавать chatGPT, было прикольно вставлять его варианты ответов в такого рода темы. Вот вариант как возможная идея решения на пхп. :wink3:

Для распознавания границ предмета, такого как квадрат, на изображении вам потребуется использовать алгоритм обработки изображений. Один из популярных методов - это использование алгоритма обнаружения границ, например, метод Кэнни (Canny edge detector). Когда вы находите границы объекта, вы можете попытаться выделить квадрат, используя алгоритмы выделения контуров или даже простые эвристики.


Вот пример PHP-скрипта, который использует библиотеку OpenCV для обнаружения квадрата на изображении:

Код:
<?php

// Путь к вашему изображению

$imagePath = 'path/to/your/image.jpg';


// Загружаем изображение с помощью OpenCV

$image = cv\imread($imagePath, cv\IMREAD_GRAYSCALE);


// Применяем фильтр Кэнни для обнаружения границ

$edges = cv\Canny($image, 50, 150);


// Находим контуры на изображении

$contours = cv\findContours($edges, cv\RETR_EXTERNAL, cv\CHAIN_APPROX_SIMPLE);


// Ищем квадрат среди контуров

foreach ($contours as $contour) {

    $approx = cv\approxPolyDP($contour, 0.04 * cv\arcLength($contour, true), true);


    // Если контур имеет 4 угла, это может быть квадрат

    if (count($approx) == 4) {

        // Рисуем контур квадрата на изображении

        cv\polylines($image, [$approx], true, new cv\Scalar(255, 0, 0), 2);

    }

}


// Отображаем изображение с выделенным квадратом

cv\imshow('Square Detection', $image);

cv\waitKey();


// Освобождаем память

cv\destroyAllWindows();

?>

Этот скрипт использует библиотеку OpenCV для обработки изображений. Убедитесь, что у вас установлено расширение OpenCV для PHP, чтобы этот скрипт работал.


Пожалуйста, замените 'path/to/your/image.jpg' на реальный путь к вашему изображению. Этот скрипт обнаруживает контуры на изображении, а затем пытается найти квадраты среди контуров. Важно отметить, что это довольно базовый пример и может потребоваться настройка параметров и более сложные алгоритмы, чтобы обнаруживать квадраты в различных условиях освещения и фона.


Конечно! Я допишу скрипт таким образом, чтобы он также выводил координаты углов найденного квадрата на изображении:

Код:
<?php

// Путь к вашему изображению

$imagePath = 'path/to/your/image.jpg';


// Загружаем изображение с помощью OpenCV

$image = cv\imread($imagePath, cv\IMREAD_COLOR);


// Применяем фильтр Кэнни для обнаружения границ

$edges = cv\Canny($image, 50, 150);


// Находим контуры на изображении

$contours = cv\findContours($edges, cv\RETR_EXTERNAL, cv\CHAIN_APPROX_SIMPLE);


// Ищем квадрат среди контуров

foreach ($contours as $contour) {

    $approx = cv\approxPolyDP($contour, 0.04 * cv\arcLength($contour, true), true);


    // Если контур имеет 4 угла, это может быть квадрат

    if (count($approx) == 4) {

        // Рассчитываем площадь контура

        $area = cv\contourArea($approx);

    

        // Вычисляем длину стороны квадрата (так как у квадрата все стороны равны)

        $sideLength = sqrt($area);


        // Получаем координаты углов квадрата

        $corners = [];

        foreach ($approx as $point) {

            $corners[] = $point->x . ',' . $point->y;

        }


        // Выводим информацию о найденном квадрате

        echo "Найден квадрат. Площадь: {$area}, Длина стороны: {$sideLength}, Углы: " . implode(', ', $corners) . "<br>";


        // Рисуем контур квадрата на изображении

        cv\polylines($image, [$approx], true, new cv\Scalar(0, 255, 0), 2);

    }

}


// Отображаем изображение с выделенным квадратом

cv\imshow('Square Detection', $image);

cv\waitKey();


// Освобождаем память

cv\destroyAllWindows();

?>

Этот скрипт выводит площадь, длину стороны и координаты углов найденного квадрата на изображении. Пожалуйста, замените 'path/to/your/image.jpg' на реальный путь к вашему изображению. Убедитесь, что у вас установлено и настроено расширение OpenCV для PHP, чтобы скрипт работал.

Для поиска прямоугольников вы можете использовать тот же самый скрипт, что и для квадратов, но с некоторыми изменениями. Прямоугольник будет иметь 4 угла, но его стороны могут иметь разные длины. Чтобы определить, является ли контур прямоугольником, вы можете воспользоваться функцией cv::isContourConvex(), чтобы проверить, является ли контур выпуклым. Если контур выпуклый и имеет 4 угла, это, вероятно, прямоугольник.
Вот модифицированный скрипт для поиска прямоугольников:

Код:
<?php
// Путь к вашему изображению
$imagePath = 'path/to/your/image.jpg';

// Загружаем изображение с помощью OpenCV
$image = cv\imread($imagePath, cv\IMREAD_COLOR);

// Применяем фильтр Кэнни для обнаружения границ
$edges = cv\Canny($image, 50, 150);

// Находим контуры на изображении
$contours = cv\findContours($edges, cv\RETR_EXTERNAL, cv\CHAIN_APPROX_SIMPLE);

// Ищем прямоугольники среди контуров
foreach ($contours as $contour) {
$approx = cv\approxPolyDP($contour, 0.04 * cv\arcLength($contour, true), true);

// Если контур имеет 4 угла и является выпуклым, это может быть прямоугольник
if (count($approx) == 4 && cv\isContourConvex($approx)) {
// Рассчитываем площадь контура
$area = cv\contourArea($approx);
      
// Получаем координаты углов прямоугольника
$corners = [];
foreach ($approx as $point) {
$corners[] = $point->x . ',' . $point->y;
        }

// Выводим информацию о найденном прямоугольнике
echo "Найден прямоугольник. Площадь: {$area}, Углы: " . implode(', ', $corners) . "<br>";

// Рисуем контур прямоугольника на изображении
cv\polylines($image, [$approx], true, new cv\Scalar(0, 255, 0), 2);
    }
}

// Отображаем изображение с выделенным прямоугольником
cv\imshow('Rectangle Detection', $image);
cv\waitKey();

// Освобождаем память
cv\destroyAllWindows();
?>
Этот скрипт будет искать прямоугольники на изображении и выводить координаты их углов.
 
Последнее редактирование:
Назад
Верх