Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Нахождение и поворот объекта на OpenCV


DelphiN! ©   (17.05.17 22:53

Доброго времени суток!
Задача:
На фото имеется документ прямоугольной формы.
Документ может лежать под каким угодно углом.
Мне необходимо повернуть документ ровно. Также необходимо обрезать весь лишний фон.
Раньше никогда с графикой не работал и не хватает времени основательно в этом разобраться.
Вот что сделал:


uses
 System.SysUtils,
 ocv.highgui_c,
 ocv.core_c,
 ocv.core.types_c,
 ocv.imgproc_c,
 ocv.imgproc.types_c,
 ocv.tracking_c,
 ocv.lib;

var
 img,img_new,img_res: pIplImage;

 storage: pCvMemStorage = nil;
 contours: pCvSeq = nil;
 curr_cont,bigest_contur,bigest_contur2: pCvSeq;

 ploshad,curr_ploshad: Double;
begin
 img := cvLoadImage('C:\1.jpg');
 img_new := cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
 img_res := cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);

 //Перевел в черно белое
 cvCvtColor(img, img_new, CV_RGB2GRAY);
 //Нарисовал все границы
 cvCanny(img, img_new, 100, 200, 3);

 //Ищу контуры на нарисованных методом cvCanny границах
 storage := cvCreateMemStorage(0);
   contours := AllocMem(SizeOf(TCvSeq));
   cvFindContours(img_new, storage, @contours, SizeOf(TCvContour),
     CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE, cvPoint(0, 0));

   //Теперь пытаюсь найти контур с наибольшей площадью
   bigest_contur := nil;
   curr_cont := contours;
   curr_ploshad := 0;
   while (curr_cont <> nil) do
   begin
     ploshad := Abs(cvContourArea(curr_cont,CV_WHOLE_SEQ));
     if curr_ploshad<ploshad then
     begin
      bigest_contur := curr_cont;
      curr_ploshad := ploshad;
     end;  
     curr_cont := curr_cont.h_next;  
   end;

  //Рисую найденный наибольший контур
img_res := cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);
       cvDrawContours(img_res, bigest_contur, CV_RGB(255, 0, 255),
     CV_RGB(255, 0, 255), 1, CV_FILLED, 8, cvPoint(0, 0));

  //Вывожу в окно
 cvNamedWindow('original', CV_WINDOW_AUTOSIZE);
 cvShowImage('original', img_res);

 cvWaitKey();
end.


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

Вот сама картинка которая получилась в результате:
https://cloud.mail.ru/public/DNyj/MgJXm5R1n


DelphiN! ©   (23.05.17 06:46[1]

Готов оплатить за помощь в решении данного вопроса! Пожалуйста пишите на почту


Цукор5   (23.05.17 12:47[2]

Картинки исходники вышли куда-нибудь. Гляну...

Я делал не так. Для того, чтобы найти угол поворота нужно найти строки текста. Их с помощью HoughLines преобразовать в линии. Потом по линии и найдешь угол поворота.

Или вторым вариантом. Если на твоем документе есть какой-то неизменный шаблон, то можно его найти. После нахождения у тебя координаты. Их сопоставить с ровным эталоном и получить угол.


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо