Функция нечеткого распознавания объектов
Ссылка для скачивания архива с библиотекой
библиотека на доработке. новая версия будет доступна в конце июня
Библиотека пока сыровата и содержит всего одну функцию.
Она выполняет поиск похожего объекта на изображении, при этом может игнорировать масштабирование, повороты, частичное перекрытие объекта и изменение его формы. В конце концов она может просто найти похожий объект. В основе лежит алгоритм собственной разработки, поэтому пока исходный текст библиотеки не публикую.
Разработка в самой начальной стадии и качество конечно оставляет желать лучшего, но функция уже вполне работоспособна. Пока в консоль выводит некоторую отладочную информацию, которая была бы интересна для автора. Время выполнения пока не оптимизировано, поэтому не подходит для трекинга объектов в режиме реального времени. Работает пока поверх OpenCV, т.к. использует его типы данных.
Можно использовать в любых проектах OpenCV. В следущей версии будет отделена от OpenCV совсем и дописана отдельная функция копирования данных из формата IplImage в свою структуру.
Одним из плюсов ее является довольно компактная структура данных описывающее обобщенную структуру картинки, которая позволит в дальнейшем распознавать большое число объектов на любом изображении за короткое время.
Вобщем нужна помощь тестеров.
Пробуйте, тестируйте и присылайте результаты.
Прототип функции.
int poisk(IplImage* image,IplImage* image2,int par1,int ker,int col,int porog, int x1,int x2,int y1,int y2,int x0,int y0);
//1 параметр - где ищем
//2 - что ищем
//3 - допуск по форме от 1 до 100
//4 - ядро от 1 до 16
//5 - допуск по цвету 1-255
//6 - порог от 0 до 1
// возвращаемые значения
// 7 8 - область по х
// 9 10 - область по у
// 11 12 - центр объекта
// возвращает степень соответствие от 0 до 100
Первый параметр - изображение на котором ищем объект.
Второй - сам обьект. Внимание - объект должен быть на белом фоне - пока он у меня принят за прозрачный.
Белый это значит (255,255,255) (ну или около того)
Третий - допуск по форме - на сколько может быть деформирован обьект - (100 - точная копия ,1- вообще непохож) рекомендуемое значение 70-90.
Четвертый - ядро. от 1 до 16. пожалуй самый важный параметр. значения от 1 до 16. рекомендуемое 12-14. Зависит от детализированности и сложности исходных изображений. Чем сложнее изображение и чем больше на нем мелких деталей на которые нужно обращать внимание, тем больше параметр ядра, но время работы при этом резко возрастает. Короче нужно тестировать.
Пятый допуск по цвету 1-255 . 1 - ищем точно совпадающий по цвету. 255 - любой. рекомендуемые значения 10-30.
Шестой порог - от 0 до 1. - рекомендуемое 0,5. Задает общую степень похожести.
Все остальные параметры возвращаемые значения. В них возвращаются результаты поиска.
Функция поиска возвращает значение вероятности нахождения объекта на изображении.
Соответственно 0 - если ничего не нашли.
Ниже примеры результатов поиска
А вот пример программы с помощью которых они получены
#include <cv.h>
#include <highgui.h>
#include <stdlib.h>
#include <stdio.h>
#include <conio.h>
#include <visio2.h>
using namespace std;
int main(int argc, char* argv[])
{
IplImage* image = cvLoadImage("C://pic_res//gerl.jpg",1); // картинка на которой будем искать
IplImage* image2 = cvLoadImage("C://pic_res//gerlgr4.jpg",1); //изображение объекта на белом фоне
cvSmooth(image, image , CV_GAUSSIAN, 5, 5); // не обязательно, просто мне кажется так лучше работает
cvSmooth(image2, image2, CV_GAUSSIAN, 5, 5); // не обязательно, просто мне кажется так лучше работает
// окно для отображения картинки
cvNamedWindow("main",CV_WINDOW_AUTOSIZE);
cvNamedWindow("main2",CV_WINDOW_AUTOSIZE);
cvShowImage("main",image);
cvShowImage("main2",image2);
cvWaitKey(3);
//--------------------------------------------------------------
//---------------------------------------------------------
int x1,x2,y1,y2,x0,y0,s;
//1 параметр - где ищем
//2 - что ищем
//3 - допуск по форме от 1 до 100
//4 - ядро от 1 до 16
//5 - допуск по цвету 1-255
//6 - порог от 0 до 1
// возвращаемые значения
// 7 8 - область по х
// 9 10 - область по у
// 11 12 - центр объекта
// возвращает степень соответствие от 0 до 100
s = poisk(image, image2,70,14,20,0.4,x1,x2,y1,y2,x0,y0);
cvCircle(image,cvPoint(x0, y0),50,CV_RGB(255,0,0),1,8);
cvRectangle( image, cvPoint(x1, y1), cvPoint(x2, y2), CV_RGB(0,0,0), 1);
cvShowImage("main",image);
cvShowImage("main2",image2);
// ждём нажатия клавиши
cvWaitKey(0);
// освобождаем ресурсы
cvReleaseImage(& image);
cvDestroyWindow("main");
cvReleaseImage(& image2);
cvDestroyWindow("main2");
// удаляем окно
return 0;
}