It will be possible to ask you to help me with one script, I can't finish it myself.
The essence of the script is this, I upload a photo, the script should check for similarity with the photos that I have in my folder.
<?php
use OpenCV\{
Core,
Face\FaceRecognizer,
ImgProc
};
// Функция для загрузки изображения в формате OpenCV Mat из файла
function loadImage($imagePath)
{
return ImgProc::imread($imagePath);
}
// Функция для обнаружения лиц на изображении с помощью алгоритма Haar Cascade
function detectFaces($image)
{
// Загрузка каскадного классификатора для обнаружения лиц
$cascadePath = 'models/haarcascade/haarcascade_frontalface_default.xml';
$cascade = new Core\Classifier\CascadeClassifier();
$cascade->load($cascadePath);
// Преобразование изображения в оттенки серого для более эффективной обработки
$grayImage = new Core\Mat();
ImgProc::cvtColor($image, $grayImage, ImgProc::COLOR_BGR2GRAY);
// Обнаружение лиц на изображении
$faces = new Core\RectVector();
$cascade->detectMultiScale($grayImage, $faces);
return $faces;
}
// Загрузка изображения с двумя лицами для сравнения
$imagePath1 = 'images/Mariya.jpg';
$imagePath2 = 'images/Milana.jpg';
$image1 = loadImage($imagePath1);
$image2 = loadImage($imagePath2);
// Обнаружение лиц на первом изображении
$faces1 = detectFaces($image1);
// Обнаружение лиц на втором изображении
$faces2 = detectFaces($image2);
// Если обнаружено по одному лицу на каждом изображении
if ($faces1->size() == 1 && $faces2->size() == 1) {
// Извлечение областей лиц из изображений
$faceRect1 = $faces1->get(0);
$faceRect2 = $faces2->get(0);
// Извлечение только лиц из изображений
$face1 = $image1->rowRange($faceRect1->y, $faceRect1->y + $faceRect1->height)->colRange($faceRect1->x, $faceRect1->x + $faceRect1->width);
$face2 = $image2->rowRange($faceRect2->y, $faceRect2->y + $faceRect2->height)->colRange($faceRect2->x, $faceRect2->x + $faceRect2->width);
// Преобразование изображений лиц в оттенки серого
$grayFace1 = new Core\Mat();
$grayFace2 = new Core\Mat();
ImgProc::cvtColor($face1, $grayFace1, ImgProc::COLOR_BGR2GRAY);
ImgProc::cvtColor($face2, $grayFace2, ImgProc::COLOR_BGR2GRAY);
// Создание объекта распознавателя лиц
$recognizer = FaceRecognizer::create();
// Обучение распознавателя на первом лице
$recognizer->train(new Core\MatVector([$grayFace1]), new Core\IntVector([1]));
// Проверка схожести второго лица с первым
$result = $recognizer->predict($grayFace2);
// Вывод результата
if ($result['label'] === 1 && $result['confidence'] <= 50) {
echo "Лица схожи";
} else {
echo "Лица не схожи";
}
} else {
echo "Ошибка: Не удалось обнаружить лица на одном или обоих изображениях.";
}