-
Доброго времени суток! Задача: На фото имеется документ прямоугольной формы. Документ может лежать под каким угодно углом. Мне необходимо повернуть документ ровно. Также необходимо обрезать весь лишний фон. Раньше никогда с графикой не работал и не хватает времени основательно в этом разобраться. Вот что сделал: 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
-
Готов оплатить за помощь в решении данного вопроса! Пожалуйста пишите на почту
-
Картинки исходники вышли куда-нибудь. Гляну...
Я делал не так. Для того, чтобы найти угол поворота нужно найти строки текста. Их с помощью HoughLines преобразовать в линии. Потом по линии и найдешь угол поворота.
Или вторым вариантом. Если на твоем документе есть какой-то неизменный шаблон, то можно его найти. После нахождения у тебя координаты. Их сопоставить с ровным эталоном и получить угол.
|