Модераторы: Rickert, Alexeis, BorisVorontsov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Определение поворота изображения, OpenCV 2.3.1 
:(
    Опции темы
TheDestroyer
Дата 7.3.2012, 22:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Здравствуйте!
Пытаюсь с  помощью OpenCV 2.3.1 на VC 2010 определить поворот изображения относительно эталонного и повернуть это изображение правильно.

На сколько я понимаю, надо определить матрицу гомографии с помощью findHomography, затем опрелелить угол поворота с помощью getAffineTransform, затем повернуть с помощью warpAffine.

Вот код:
Код

int main(int argc, char* argv[])
{

    Mat warp_dst, warp_mat;

    // загрузим картинку для обработки
    Mat img = imread("img_st1.jpg", CV_LOAD_IMAGE_GRAYSCALE); //imread( argv[1], 1 );

    // загрузим эталонную картинку
    Mat img_st = imread("kant1.jpg", CV_LOAD_IMAGE_GRAYSCALE);

    // определение поворота исследуемой картинки

    // Initialize the destination image as having the same size and type as the source
    warp_dst = Mat::zeros( img.rows, img.cols, img.type() );

    // матрица гомографии

    //findHomography
    //getAffineTransform
    // определить поворот
    warp_mat = getAffineTransform( srcTri, dstTri );

    // повернем картинку

    warpAffine( img, warp_dst, warp_mat, warp_dst.size() );


    return 0;
}

Проблема: функция
Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method=0, double ransacReprojThreshold=3, OutputArray mask=noArray() )
принимает в качестве параметров массивы точек, которые надо найти, как я понимаю методом SURF или SIFT.
[url=http://opencv.itseez.com/modules/calib3d/doc/camera_calibration_and_3d_reconstruction.html#Mat findHomography(InputArray srcPoints, InputArray dstPoints, int method, double ransacReprojThreshold, OutputArray mask)]Ссылка на мануал по OpenCV[/url]
Для этого используется функция SurfFeatureDetector..., нашел в примере SURF_Homography.cpp, но во-первых этот пример не запускается, т.к. нет библиотеки opencv_calib3d231.dll, а во-вторых непонятно как в итоге получить массивы точек, которые потом передать в findHomography.

Подскажите, пожалуйста, как правильно определить поворот картинки относительно эталона и затем повернуть ее?
PM MAIL   Вверх
TheDestroyer
Дата 9.3.2012, 20:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Update:
Запустить пример SURF_Homography.cpp удалось, dll нашел и положил рядом с исполняемым файлом.
На основе примера сделал несколько экспериментов, и стало ясно, что методом SURF поиск особенных точек в моем случае неэффективен, либо я его неправильно использую.
Предметы, которые  надо распознать и повернуть их изображение находятся на однородном фоне, перспективных искажений почти нет, есть в основном поворот. 
По результатам эксперимента видно, что особенные точки определяются неправильно уже при небольшом повороте.
Вопросы следующие: 
1. правильно ли применять в данном случае метод SURF и если нет, то какой?
2. Возможно, что задача поиска угла поворота изображения решается по другому (например, с помощью маски), если да, то как?

Заранее спасибо за ответы.
PM MAIL   Вверх
TheDestroyer
Дата 11.3.2012, 22:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 112
Регистрация: 5.11.2007

Репутация: нет
Всего: нет



Update2:
На похожее изображение никак не получается найти пары, так что этот метод применим только для поиска одного и того же объекта.

Сейчас ищу другой способ поиска поворота изображения.

Поясню задачу, на самом деле изначально есть упрощения/начальные условия:
1. Изображение находится на однородном фоне, перспективных искажений почти нет, есть в основном поворот.
2. Освещение всегда одинаковое
3. Посторонних предметов нет

Задача состоит в том, чтобы отличать дефекты на круглых изделиях, на которых нанесен немного выпуклый рисунок.
На мой взгляд это выполнимо в 2 этапа:
1. Поворот изображения
2. Сравнение с эталонным изображением

Вот бьюсь над первым пунктом.
Сейчас кажется, что определение поворота реально решить с помощью контуров, читаю информацию по ним.
Возможно есть какой-то известный способ определения поворота?
PM MAIL   Вверх
mrgloom
Дата 5.4.2012, 09:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 829
Регистрация: 8.6.2011

Репутация: нет
Всего: нет



это тема скорее относится к алгоритмам
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Вы можете найти полезным что...
Alexeis
Rickert
  • Английская документация по DirectX лежит где-то здесь.
  • Английская документация по OpenGL лежит где-то там.
  • Гейм-дев у нас обсуждают где-то тут

Ждём вас! С уважением, Alexeis, Rickert.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Мультимедия, OpenGL/DirectX | Следующая тема »


 




[ Время генерации скрипта: 0.1026 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.