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