Поиск объектов на изображении при помощи OpenCV

Нахождение дескриптора. Изучение детерменированных блоков, в которых вычисляется доминирующее градиентное направление, магнитуда. Использование гомографии. Алгоритм RANSAC в основе которого лежит итеративная оценка гомографии для случайно выбранных точек.

Рубрика Программирование, компьютеры и кибернетика
Вид отчет по практике
Язык русский
Дата добавления 08.04.2021
Размер файла 267,8 K

Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже

Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.

Размещено на http://www.allbest.ru/

Размещено на http://www.allbest.ru/

Федеральное государственное автономное

образовательное учреждение

высшего образования

«СИБИРСКИЙ ФЕДЕРАЛЬНЫЙ УНИВЕРСИТЕТ»

Институт математики и фундаментальной информатики

Базовая кафедра вычислительных и информационных технологий

Отчет о практике по получению профессиональных умений и опыта профессиональной деятельности

Поиск объектов на изображении при помощи OpenCV

Руководитель __________ Баранов С.Н.

подпись, дата

Студент ИМ19-06, 171942577 __________ Смирнов И.Б.

номер группы, зачетной книжки подпись, дата

Красноярск 2020

Содержание

  • Постановка задачи
  • Введение
  • Решение задачи
  • Список использованных источников

Постановка задачи

На вход подается изображение полки с объектами и изображение целевого плоского объекта (например книга). Задача: найти целевой объект на входном изображении.

Введение

OpenCV - библиотека алгоритмов компьютерного зрения, обработки изображений и численных алгоритмов общего назначения с открытым кодом.

Для реализации поставленной задачи будем использовать h файлы core.hpp и opencv.hpp, отвечающие за базовые классы opencv и features2d.hpp, -- определяющий классы различных детекторов и дескрипторов (нас будет интересовать SURF).

#include <iostream>

#include "opencv2/opencv.hpp"

#include "opencv2/core/core.hpp"

#include "opencv2/nonfree/features2d.hpp"

#include <vector>

using namespace std;

using namespace cv;

void readme(string &message) { cout << message << endl; }

Далее начинается тело main, будем считать, что к исполняемому файлу мы передаем 1 параметр, -- путь к картинке образцу (плоскому объекту). Конструктор класса VideoCapture принимает на вход номер девайса (камеры), 0 -- устройство по умолчанию (вероятно встроенная камера). Далее считывается целевая картинка в img_object.

int main( int argc, char** argv )

{ if(argc != 2) {

string message = "Использование: ./cv_test <img_object>";

readme(message); return -1;

}

VideoCapture cap(1); // Открыть камеру (устройство 1). Для открытия встроенной камеры вызывать 0 устройство.

if(!cap.isOpened()) // Проверка корректности отработки {

string message = "Проверьте камеру или укажите другой номер устройства в коде";

readme(message); return -1;

}

Mat img_object = imread( argv[1], CV_LOAD_IMAGE_GRAYSCALE );

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

for(;;) {

Mat frame;

cap >> frame; // Получить очередной фрейм из камеры Mat img_scene = frame; if( !img_object.data || !img_scene.data ) // Проверка наличия информации в матрице изображения

{

string message = " Ошибка чтения ";

readme(message);

}

Решение задачи

Нахождение дескриптора - дескриптор, вектор кодирующий геометрию локальной окрестности вокруг точки. В основе этого, как правило, лежит SIFT (SURF это быстрый SIFT). Принцип тут следующий:

Патч вокруг данной точки разбивается на детерменированные блоки, в каждом блоке вычисляется доминирующее градиентное направление и магнитуда + осуществляется поворот в сторону доминирующего направления (инвариантность к повороту). Данный «градиентный рисунок» описывает локальный патч.

SurfDescriptorExtractor extractor;

Mat descriptors_object, descriptors_scene;

extractor.compute( img_object, keypoints_object, descriptors_object );

extractor.compute( img_scene, keypoints_scene, descriptors_scene );

Сравнение дескрипторов - на следующем этапе мы должны «сматчить» вектора дескрипторов, т.е. найти соответствующие точки на целевом объекте и в сцене. Для этой цели можно использовать FlannBasedMatcher (его следует использовать для больших наборов ключевых точек) или BruteForceMatcher (наоборот). Далее мы отбираем из всех сматченных точек только те, расстояние между дескрипторами которых не более 3 * min_dist, где min_dist -- минимальное расстояние между дескрипторами.

FlannBasedMatcher matcher;

vector< DMatch > matches;

matcher.match( descriptors_object, descriptors_scene, matches );

double max_dist = 0; double min_dist = 100; //-- Вычисление максимального и минимального расстояния среди всех дескрипторов // в пространстве признаков

for( int i = 0; i < descriptors_object.rows; i++ ) {

double dist = matches[i].distance;

if( dist < min_dist ) min_dist = dist; if( dist > max_dist ) max_dist = dist; }

printf("-- Max dist : %f \n", max_dist );

printf("-- Min dist : %f \n", min_dist ); //-- Отобрать только хорошие матчи, расстояние меньше чем 3 * min_dist

vector< DMatch > good_matches;

for( int i = 0; i < descriptors_object.rows; i++ ) {

if( matches[i].distance < 3 * min_dist ) {

good_matches.push_back( matches[i]);

} детерменированный гомография ransac градиентный

}

Mat img_matches; //-- Нарисовать хорошие матчи

drawMatches( img_object, keypoints_object, img_scene, keypoints_scene, good_matches, img_matches, Scalar::all(-1), Scalar::all(-1), vector<char>(), DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS );

Использование гомографии - В компьютерного зрении любые два изображения одного и того же плоского объекта в пространстве связаны гомографией (если мы используем pin-hole модель камеры). Иными словами это преобразование плоскость -- плоскость. Т.е. имея набор точек на целевом объекте и сопоставленный ему набор точек в сцене мы можем найти между ними соответствие в виде матрицы гомографии H (и наоборот соответственно). В основе нахождения этого преобразования лежит алгоритм RANSAC в основе которого лежит итеративная оценка гомографии для случайно выбранных точек.

//-- Локализация объектов

vector<Point2f> obj;

vector<Point2f> scene;

for( int i = 0; i < good_matches.size(); i++ ) {

obj.push_back( keypoints_object[ good_matches[i].queryIdx ].pt );

scene.push_back( keypoints_scene[ good_matches[i].trainIdx ].pt );

}

Mat H = findHomography( obj, scene, CV_RANSAC );

Далее необходимо взять 4 точки по краям целевого объекта и отобразить их с помощью найденного преобразования на изображении сцены. Таким образом, мы найдем bounding box объекта в сцене. Заметьте, что при рисовании линий, к каждой точке мы прибавляем Point2f( img_object.cols, 0), т.к. изображение img_matches предполагает смежное размещение картинки целевого объекта (слева) и сцены (справа).

//-- Получить "углы" изображения с целевым объектом

std::vector<Point2f> obj_corners(4);

obj_corners[0] = cvPoint(0,0);

obj_corners[1] = cvPoint( img_object.cols, 0 );

obj_corners[2] = cvPoint( img_object.cols, img_object.rows );

obj_corners[3] = cvPoint( 0, img_object.rows );

std::vector<Point2f> scene_corners(4); //-- Отобразить углы целевого объекта, используя найденное преобразование, на сцену

perspectiveTransform( obj_corners, scene_corners, H); //-- Соеденить отображенные углы

line( img_matches, scene_corners[0] + Point2f( img_object.cols, 0), scene_corners[1] + Point2f( img_object.cols, 0), Scalar(0, 255, 0), 4 );

line( img_matches, scene_corners[1] + Point2f( img_object.cols, 0), scene_corners[2] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );

line( img_matches, scene_corners[2] + Point2f( img_object.cols, 0), scene_corners[3] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 );

line( img_matches, scene_corners[3] + Point2f( img_object.cols, 0), scene_corners[0] + Point2f( img_object.cols, 0), Scalar( 0, 255, 0), 4 ); //-- Show detected matches

imshow( "Good Matches & Object detection", img_matches );

if(waitKey(30) >= 0) break;

} //-- Конец основного цикла обработки

Список использованных источников

1. SURF: Speeded Up Robust Features: https://people.ee.ethz.ch/~surf/eccv06.pdf

2. Planar homographies: http://www.sci.utah.edu/~gerig/CS6640-F2010/tutorial2-homographies.pdf

Размещено на Allbest.ru


Подобные документы

  • Существующие методы нахождения графических примитивов и программных реализаций. Базовое преобразование Хафа: поиск прямых, выделение окружностей на изображении, нахождение кривых высшего порядка. Составление руководства программиста и пользователя.

    курсовая работа [2,7 M], добавлен 20.03.2012

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

    дипломная работа [3,1 M], добавлен 27.06.2012

  • Анализ основных аспектов технологии компьютерного зрения, необходимых для выполнения работы. Изучение характеристик библиотеки OpenCV, оценка актуальности работы по распознаванию жестов рук. Поэтапный отчет о работе над программным обеспечением.

    курсовая работа [669,9 K], добавлен 20.05.2017

  • Использование информационных технологий для планирования размещения оптимальных точек водоснабжения, используя теорию графов. Функциональные возможности разрабатываемого приложения. Программная реализация основных модулей на основе алгоритма Флойда.

    курсовая работа [818,3 K], добавлен 31.01.2012

  • Поиск в массивах и списках, ключ и произвольные данные. Линейный (последовательный) поиск. Бинарный поиск в упорядоченном массиве. Алгоритм Рабина-Карпа, простая и улучшенная хэш-функция. Алгоритм Бойера-Мура со сдвигом по стоп-символам и по суффиксам.

    презентация [1,5 M], добавлен 19.10.2014

  • Использование номеров индексных дескрипторов для обозначения файлов в программах для системных администраторов в операционной системе UNIX. Описание индексного дескриптора в POSIX. Адрес индексного дескриптора в записи директории, относящейся к файлу.

    контрольная работа [31,7 K], добавлен 18.06.2014

  • Определение понятия трехмерной компьютерной графики. Особенности создания 3D-объектов при помощи булевых операций, редактируемых поверхностей, на основе примитивов. Моделирование трехмерных объектов при помощи программного пакета Autodesk 3ds Max.

    дипломная работа [4,2 M], добавлен 13.04.2014

  • Метод главных компонент. Процесс распознавания. Ковариационная матрица, диагональная матрица собственных чисел. Использовании метрики Махаланобиса и Гауссовского распределения для оценки близости изображений. Входные вектора. Библиотека OpenCV.

    статья [22,1 K], добавлен 29.09.2008

  • Методика сериализации объектов и её практическое применение. Клонирование объектов при помощи сериализации. Обработка действий мыши и клавиатуры. Изучение классов Menu, MenuBar, MenuItem, Dialog, FileDialog пакета java.awt, использование таблиц.

    лабораторная работа [180,8 K], добавлен 30.06.2009

  • Правила монтирования и демонтирования файловых систем на диске. Описание полей файла /etc/fstab. Создание суперблока, таблицы индексного дескриптора, совокупности блоков данных. Строение и структура описания группы блоков. Система адресации данных.

    презентация [143,1 K], добавлен 20.12.2013

Работы в архивах красиво оформлены согласно требованиям ВУЗов и содержат рисунки, диаграммы, формулы и т.д.
PPT, PPTX и PDF-файлы представлены только в архивах.
Рекомендуем скачать работу.