top of page

Функция нечеткого распознавания объектов

Ссылка для скачивания архива с библиотекой

библиотека на доработке. новая версия будет доступна в конце июня

Библиотека пока сыровата и содержит всего одну функцию.

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

Разработка в самой начальной стадии и качество конечно оставляет желать лучшего, но функция уже вполне работоспособна. Пока в консоль выводит некоторую отладочную информацию, которая была бы интересна для автора. Время выполнения пока не оптимизировано, поэтому не подходит для трекинга объектов в режиме реального времени. Работает пока поверх 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;
}

 

bottom of page