Конференция "Media" » Нахождение и поворот объекта на OpenCV
 
  • DelphiN! © (17.05.17 22:53) [0]
    Доброго времени суток!
    Задача:
    На фото имеется документ прямоугольной формы.
    Документ может лежать под каким угодно углом.
    Мне необходимо повернуть документ ровно. Также необходимо обрезать весь лишний фон.
    Раньше никогда с графикой не работал и не хватает времени основательно в этом разобраться.
    Вот что сделал:


    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 преобразовать в линии. Потом по линии и найдешь угол поворота.

    Или вторым вариантом. Если на твоем документе есть какой-то неизменный шаблон, то можно его найти. После нахождения у тебя координаты. Их сопоставить с ровным эталоном и получить угол.
 
Конференция "Media" » Нахождение и поворот объекта на OpenCV
Есть новые Нет новых   [134427   +37][b:0][p:0]