Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Мультимедия, OpenGL/DirectX > Определение поворота изображения


Автор: TheDestroyer 7.3.2012, 22:00
Здравствуйте!
Пытаюсь с  помощью 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.

Подскажите, пожалуйста, как правильно определить поворот картинки относительно эталона и затем повернуть ее?

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

Заранее спасибо за ответы.

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

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

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

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

Вот бьюсь над первым пунктом.
Сейчас кажется, что определение поворота реально решить с помощью контуров, читаю информацию по ним.
Возможно есть какой-то известный способ определения поворота?

Автор: mrgloom 5.4.2012, 09:20
это тема скорее относится к алгоритмам

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)