Jump to content
Compvision.ru

CornersKir

Пользователи
  • Content count

    11
  • Joined

  • Last visited

Community Reputation

0 Новичек

About CornersKir

  • Rank
    Бывалый
  1. Как прикрутить OpenCV к билдеру?

    Указатель на запись с требуемыми Вам данными. Для ранее приведённого примера с cvHoughLines2 и CV_HOUGH_STANDARD: Объявление: TLineRecord = record Rho: single; Theta: single; end; PLineRecord = ^TLineRecord; Использование: var LineRecord: PLineRecord; Lines: pCvSeq; Rho: single; Theta: single; i: integer; for i := 0 to Lines.total - 1 do begin LineRecord := PLineRecord(cvGetSeqElem(Lines, i)); Rho := LineRecord^.Rho; Theta := LineRecord^.Theta; // обработка end;
  2. Можно использовать CuneiForm. Автоматизация через COM-сервер Puma. Лицензия тоже хорошая.
  3. Спасибо за новые идеи. Буду реализовывать, о результатах сообщу.
  4. Реализовал указанный метод. Исходное изображение загружено с опцией CV_LOAD_IMAGE_GRAYSCALE. На нём рассматривается увеличенная на 30% область, найденная по прошлому методу. Суммы интенсивностей каждого столбца и каждой строки поделил на соответственно число элементов в каждом столбце (каждой строке). Получил два массива значений: XArr для столбцов и YArr для строк (все значения от 0 до 255). Описываю, как находил новые границы изображения. Ввёл два пороговых значения: цветовое и процентное. Прохожу по XArr, считаю число элементов XArr меньше цветового порога. Если их процент от общего числа меньше процентного порога, то увеличиваю на 1 минимальный X, уменьшаю на 1 максимальный X, осуществляю повторный проход в новых границах. Если их больше процентного порога, то минимальный и максимальный X - новые границы изображения. Аналогичную процедуру выполняю для Y. Данный метод сильно зависит от выбранных порогов и не позволяет улучшить выделение иллюстраций (по крайней мере в моей реализации).
  5. Спасибо, исправил. Да, на многих иллюстрациях есть "что-то типа заливки". Я хочу сохранить эту заливку. На одной странице может быть и несколько иллюстраций. Попробую реализовать.
  6. ImageWidth, ImageHeight - размеры изображения. Data - ImageData pIplImage WidthStep - widthStep pIplImage GetMaximum - нахождение максимума в массиве. for y := 0 to ImageHeight - 1 do begin Row := pRGBArray(Data); for x := 0 to ImageWidth - 1 do begin Maximum := GetMaximum([abs(Row^[x].rgbtRed - Row^[x].rgbtGreen), abs(Row^[x].rgbtGreen - Row^[x].rgbtBlue), abs(Row^[x].rgbtRed - Row^[x].rgbtGreen)]); if (Maximum > Threshold) then begin Row^[x].rgbtRed := 0; Row^[x].rgbtGreen := 0; Row^[x].rgbtBlue := 0; end else begin Row^[x].rgbtRed := 255; Row^[x].rgbtGreen := 255; Row^[x].rgbtBlue := 255; end; end; Data := pointer(integer(Data) + WidthStep); end; Слишком большой порог - области вне иллюстраций идеально белые, но и сами иллюстрации обрезаны. По краям многих иллюстраций идёт что-то вроде фона иллюстрации - он в основном и страдает. В результате, выделяется центральный фрагмент иллюстрации вместо полной иллюстрации. Слишком малый порог - области вне иллюстраций очищены крайне плохо, cvFindContours считает иллюстрациями области, которые таковыми не являются. Применение дополнительной очистки шума (например, cvDilate) приводит к тем же проблемам, что и при применении большого порога - иллюстрация обрезается. Проблема в том, что для каждой страницы с иллюстрациями нужен свой порог, при котором изображение выделится идеально. То есть никакой константный порог не подходит для решения задачи. Нужен адаптивный порог, но непонятно, по какому алгоритму его вычислять.
  7. Реализовал пробный вариант. Приблизительное равенство определяется некоторым порогом. Для каждой отдельной иллюстрации можно подобрать порог, чтобы она определялась безошибочно. При уменьшении порога нарастает шум и сбивается работа cvFindContours. При увеличении порога возникают погрешности в определении границ. В среднем в первой реализации Ваш метод обеспечивает примерно такую же точность, как и cvMorphologyEx с CV_MOP_CLOSE.
  8. Спасибо за советы. Попробую применить их на практике и посмотреть, что получится.
  9. Есть отсканированная книга с набором иллюстраций. Стоит задача - отделить иллюстрации от текстовых данных. Иллюстрации - цветные, текст - визуально чёрный, фон - визуально серый. Пробовал рассматривать текст в качестве шума и использовал cvMorphologyEx с CV_MOP_CLOSE для его устранения. В результате изображения извлекаются с большой погрешностью. Какие функции в составе OpenCV могут помочь решить поставленную задачу?
  10. Как прикрутить OpenCV к билдеру?

    Пришёл к выводу, что надо создать дополнительные типы записей и указатели на них для каждого конкретного вида возвращаемых функциями cvHoughCircles и cvHoughLines данных. Например, для cvHoughLines2 и CV_HOUGH_STANDARD запись будет содержать два поля типа single. Затем получить запись через PRecord(cvGetSeqElem(Results, i)) и использовать как стандартную запись.
  11. Как прикрутить OpenCV к билдеру?

    Мне тоже интересен этот вопрос. Если интерпретировать p как указатель на вещественное число (PFloat = ^real;), то возникает естественная ошибка "E2016 Array Type Required" при обращении к p[0] и к p[1]. Если использовать "pt: pCvPoint;" и "pt := PCvPoint(cvGetSeqElem(circles, i));", то в координатах pt x и y оказывается мусор. Каким образом в Delphi можно правильно извлечь "pCvPoint" из "pCvSeq", возвращаемого cvHoughCircles и cvHoughLines. Заранее спасибо за ответ.
×