Jump to content
Compvision.ru
FormatCft

Как прикрутить OpenCV к билдеру?

Recommended Posts

Все, разобрался! Только возникает другой вопрос: пытаюсь загрузить картинку с помощью команды frame = cvLoadImage("img.jpg",1), но содержимое frame = NULL?

Причин может быть пара:

1) картика не в директории с запускаемым файлом, можно прпробовать задать путь жестко, например : "C:\\img.jpg", скопировав туда изображение.

2) не поддерживаемый (какой-нибудь модифицированный формат картинки).

скорее всего первое.

Share this post


Link to post
Share on other sites
Пробные заголовки для OpenCV на паскале. Библиотека VCopenCV.dll, используемая в хедерах, выдрана из VisionLab Mitov Software (одна dll вместо нескольких - кому неудобно, может исправить имя библиотеки в соответсвующих юнитах на исходные имена dll). Багов уйма, но кто хочет попробовать - вперед. Комментариии, замечания и исправления приветствуются. Код максимально старался перенести, но не все процедуры и функции экспортируются, поэтому примеры использования в Делфи и СиБилдере будут немного отличаться. Там, где в исходных хедерах использовался двойной указатель - в паскале оставил одинарный. Пробовал компилить - пришлось использовать все-таки двойной (передавать адрес указателя вместо самого указателя). Лучше варианта пока нет (либо пишем на VC++, C++).

Замечательная библиотека! Но если я правильно понял, то работа с камерой здесь не реализована? Поскольку данная запись вызывает ошибку ([Error] Unit1.pas(20): Undeclared identifier: 'CvCapture'):

var

capture : CvCapture;

Share this post


Link to post
Share on other sites
Замечательная библиотека! Но если я правильно понял, то работа с камерой здесь не реализована? Поскольку данная запись вызывает ошибку ([Error] Unit1.pas(20): Undeclared identifier: 'CvCapture'):

var

capture : CvCapture;

Не реализована. Если есть желание - можете дополнить и обновить заголовочные файлы. Самому пока некогда.

Share this post


Link to post
Share on other sites

Помогите, пожалуйста! Есть либа, созданная в MS Visual Studio 2008 (lib и dll). Файл .lib сконвертил через coff2omf, добавил в проект C++Builder, а он все равно пишет:

[iLINK32 Error] Error: Unresolved external ......

Файл .dll лежит рядом с файлом .lib....Может кто-что посоветует...2 дня бьюсь, а ответа так и не нашел :)

Share this post


Link to post
Share on other sites
Помогите, пожалуйста! Есть либа, созданная в MS Visual Studio 2008 (lib и dll). Файл .lib сконвертил через coff2omf, добавил в проект C++Builder, а он все равно пишет:

[iLINK32 Error] Error: Unresolved external ......

Файл .dll лежит рядом с файлом .lib....Может кто-что посоветует...2 дня бьюсь, а ответа так и не нашел :)

Значит не все Lib подключены, что он конкретно пишет? Какие функции не может найти?

Share this post


Link to post
Share on other sites
Набрел в сети на проект оболочки под Делфи:

http://opencv-delphi.svn.sourceforge.net/v.../opencv-delphi/

видели. он сильно не полный. хотя и вроде под версию 2.0 адаптирован. я автору того проекта где-то полгода назад давал ссылку на эту тему - видимо проект заброшен... :)

Share this post


Link to post
Share on other sites

Задача связана с поиском радужной оболонки. Был вот такой вот код на С:

int main(int argc, char** argv)

{

    IplImage* img;

    if( argc == 2 && (img=cvLoadImage(argv[1], 1))!= 0)

    {

        IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );

        CvMemStorage* storage = cvCreateMemStorage(0);

        cvCvtColor( img, gray, CV_BGR2GRAY );

        cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smooth it, otherwise a lot of false circles may be detected

        CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );

        int i;

        for( i = 0; i < circles->total; i++ )

        {

             float* p = (float*)cvGetSeqElem( circles, i );

             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );

             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

        }

        cvNamedWindow( "circles", 1 );

        cvShowImage( "circles", img );

    }

    return 0;

}
Я его переделал на Делфу:
procedure TForm1.Button2Click(Sender: TObject);

var img, gray: PIplImage;

    storage : PCvMemStorage;

    circles : PCvSeq;

    s : CvSize;

    i : integer;

    r : PCVRect;

begin

  img := cvLoadImage(pchar(OpenPictureDialog1.FileName),1);

  s.width := img.width;

  s.height := img.height;

  gray := cvCreateImage(s,8,1);

  storage := cvCreateMemStorage(0);

  cvCvtColor(PCvArr(img),PCvArr(gray),CV_BGR2GRAY);

  cvSmooth(PCvArr(gray),PCvArr(gray),CV_GAUSSIAN,9,9,0,0);

  circles := cvHoughCircles(PCvArr(gray),storage,CV_HOUGH_GRADIENT,2,gray.height/4,200,100,0,0);

  for i:=0 to circles.total do

    begin

      r := PCvRect(cvGetSeqElem(circles,i));

      Image1.Canvas.Brush.Color := clRed;

      Image1.Canvas.Ellipse(r.x,r.y,r.x+r.width,r.y+r.height);

    end;

end;
Как видите, я вместо cvCircle писал CvRect. Оно то что-то считает, но как Вы понимаете не то, есть ли какая-то алтернатива вот этому кусочку кода на Делфи:
            float* p = (float*)cvGetSeqElem( circles, i );

             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );

             cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

Мне нужно просто вытянуть координаты кругов:

Share this post


Link to post
Share on other sites
Задача связана с поиском радужной оболонки. Был вот такой вот код на С:

int main(int argc, char** argv)

{

IplImage* img;

if( argc == 2 && (img=cvLoadImage(argv[1], 1))!= 0)

{

IplImage* gray = cvCreateImage( cvGetSize(img), 8, 1 );

CvMemStorage* storage = cvCreateMemStorage(0);

cvCvtColor( img, gray, CV_BGR2GRAY );

cvSmooth( gray, gray, CV_GAUSSIAN, 9, 9 ); // smooth it, otherwise a lot of false circles may be detected

CvSeq* circles = cvHoughCircles( gray, storage, CV_HOUGH_GRADIENT, 2, gray->height/4, 200, 100 );

int i;

for( i = 0; i < circles->total; i++ )

{

float* p = (float*)cvGetSeqElem( circles, i );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

}

cvNamedWindow( "circles", 1 );

cvShowImage( "circles", img );

}

return 0;

}

Я его переделал на Делфу:

procedure TForm1.Button2Click(Sender: TObject);

var img, gray: PIplImage;

storage : PCvMemStorage;

circles : PCvSeq;

s : CvSize;

i : integer;

r : PCVRect;

begin

img := cvLoadImage(pchar(OpenPictureDialog1.FileName),1);

s.width := img.width;

s.height := img.height;

gray := cvCreateImage(s,8,1);

storage := cvCreateMemStorage(0);

cvCvtColor(PCvArr(img),PCvArr(gray),CV_BGR2GRAY);

cvSmooth(PCvArr(gray),PCvArr(gray),CV_GAUSSIAN,9,9,0,0);

circles := cvHoughCircles(PCvArr(gray),storage,CV_HOUGH_GRADIENT,2,gray.height/4,200,100,0,0);

for i:=0 to circles.total do

begin

r := PCvRect(cvGetSeqElem(circles,i));

Image1.Canvas.Brush.Color := clRed;

Image1.Canvas.Ellipse(r.x,r.y,r.x+r.width,r.y+r.height);

end;

end;

Как видите, я вместо cvCircle писал CvRect. Оно то что-то считает, но как Вы понимаете не то, есть ли какая-то алтернатива вот этому кусочку кода на Делфи:

float* p = (float*)cvGetSeqElem( circles, i );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

Мне нужно просто вытянуть координаты кругов:

cvCircle ничего не считает, эта команда рисует окружности, это всего лишь вывод результата. Координаты кругов: x=p[0] ; y=p[1] ; радиус = p[2].

Share this post


Link to post
Share on other sites

Я понимаю, но я спрашивал можно ли на Делфе как нибудь заменить данную строчку:

float* p = (float*)cvGetSeqElem( circles, i );

Если я правильно понял, то вот это (float*)cvGetSeqElem( circles, i ) - перевод в формат типа Float, если написать на делфе float(cvGetSeqElem( circles, i )), то выдаст ошибку: типы PChar i Float - несовместимы. Вот я и спрашиваю можно ли как-то это обойти или только так?

Share this post


Link to post
Share on other sites
Я понимаю, но я спрашивал можно ли на Делфе как нибудь заменить данную строчку:

float* p = (float*)cvGetSeqElem( circles, i );

Если я правильно понял, то вот это (float*)cvGetSeqElem( circles, i ) - перевод в формат типа Float, если написать на делфе float(cvGetSeqElem( circles, i )), то выдаст ошибку: типы PChar i Float - несовместимы. Вот я и спрашиваю можно ли как-то это обойти или только так?

Это приведение не к типу float а к указателю на данные типа float. PChar это указатель на данные типа char или BYTE .

Share this post


Link to post
Share on other sites
Как видите, я вместо cvCircle писал CvRect. Оно то что-то считает, но как Вы понимаете не то, есть ли какая-то алтернатива вот этому кусочку кода на Делфи:

float* p = (float*)cvGetSeqElem( circles, i );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), 3, CV_RGB(0,255,0), -1, 8, 0 );

cvCircle( img, cvPoint(cvRound(p[0]),cvRound(p[1])), cvRound(p[2]), CV_RGB(255,0,0), 3, 8, 0 );

Мне нужно просто вытянуть координаты кругов:

Мне тоже интересен этот вопрос. Если интерпретировать 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.

Заранее спасибо за ответ.

Share this post


Link to post
Share on other sites
Мне тоже интересен этот вопрос. Если интерпретировать 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.

Заранее спасибо за ответ.

Приводить понадобилось, чтобы получть float, а CvPoint определена так:

 typedef struct CvPoint
{
int x;
int y;
}
CvPoint;[/code]

То есть там 8 байт (два int-а по 4 байта), на два float-а не тянет (отсюда ошибка).

Скорее всего это Integer по дельфофски (два четырехбайтовых числа).

ЗЫ: С делфофскими форматами данных знаком поверхностно, могу ошибаться.

Share this post


Link to post
Share on other sites

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

Share this post


Link to post
Share on other sites
О подключении версии 2.0 к билдеру

Заменяем в строках с ошибками "Mat_" на "Mat_<_Tp>".

Попробовал, проблемы с шаблонами это решает (остается много других ошибок, но они не сложно исправляются).

Перспектива есть.

Подскажи как исправил)?

к примеру у меня в cxcore в строке (2144) FileNode operator -> () const;

выдает : cxcore.hpp operator-> must return a pointer or a class

еще есть куча ошибок подобных [cxoperations.hpp(: E2316 '_fm_cos' is not a member of 'std'

Share this post


Link to post
Share on other sites
Подскажи как исправил)?

к примеру у меня в cxcore в строке (2144) FileNode operator -> () const;

выдает : cxcore.hpp operator-> must return a pointer or a class

еще есть куча ошибок подобных [cxoperations.hpp(: E2316 '_fm_cos' is not a member of 'std'

В своей программе пишем так:

#define _STLP_NO_CSTD_FUNCTION_IMPORTS
#define _FM_NO_REMAP

#include "cv.h"
#include "highgui.h"[/code]

А заголовочники (не помню какие правил, поэтому все) в архиве:

include.rar

Share this post


Link to post
Share on other sites
Builder6+OpenCV2

27.12.2009 Здравствуйте. Все вышеперечисленные этапы прошел. Застрял на следующей ошибке (на рисунке)

post-609-1261909792_thumb.jpg

[C++ Error] cxoperations.hpp(107): E2316 '_fm_cos' is not a member of 'std'

Аналогичная ошибка. Получилось решить проблему?

Share this post


Link to post
Share on other sites
Аналогичная ошибка. Получилось решить проблему?

Вроде как эти директивы должна её решать:

#define _STLP_NO_CSTD_FUNCTION_IMPORTS

#define _FM_NO_REMAP

Share this post


Link to post
Share on other sites
#define _STLP_NO_CSTD_FUNCTION_IMPORTS

#define _FM_NO_REMAP

Да на пустом проекте, все работает и компилируется, но если чуть больше кода то перестает, я думаю что что то не так в этой бибилиотеке http://code.google.com/p/cvblob/

Share this post


Link to post
Share on other sites
IPP существенно (в разы) ускоряющая работу OpenCV хреновина берется с сайта Intel.

Ставим интелловский компилятор Intel C Plus Plus Compiler v10.1.025

Google рулит.

IPP ставится после установки компилятора. И использует его лицензию :unsure:

Подключается автоматически, нужно только указать в системной переменной Path путь к директории, /bin библиотеки IPP, в самой программе ничего отдельно указывать не нужно.

А можно поподробнее? Как я понял из описания, эта библиотека содержит просто оптимизированные под Intel функции.

А как ей пользоваться (совместно с OpenCV)?

Она работает только с этим интеловским компилятором?

И вообще имеет ли смысл с ней заморачиваться на одноядерном процессоре?

Share this post


Link to post
Share on other sites
А можно поподробнее? Как я понял из описания, эта библиотека содержит просто оптимизированные под Intel функции.

А как ей пользоваться (совместно с OpenCV)?

Она работает только с этим интеловским компилятором?

И вообще имеет ли смысл с ней заморачиваться на одноядерном процессоре?

Да, библиотека оптимизирована под интеловские процессоры, но у меня (я правда использовал её с первой версией) ускоряло очень даже неплохо и на амд-шном проце (двухъядерном). Она работает с любым компилятором, правда в последнюю версию её поддержку нужно встраивать при перестройке бинарников OpenCV (не пробовал). На интелловском одноядерном может и стоит заморочиться на другом думаю нет. Скоро выйдет еще одна версия, в ней планируется поддержка вычислений на граф.карте (GPU), это ускорит некоторые функции намного существеннее чем IPP.

Share this post


Link to post
Share on other sites

Здравствуйте, уважаемые.

Я только собираюсь изучать OpenCV. я Программирую на Delphi 2 года. Других языков не знаю и учить не планирую. Познания в Delphi неплохие.

У меня почему то сложилось впечатление, что о делфистах забыли вообще. Я не смог найти нормальных примеров на этом языке.

Прошу у Вас помощи. Если у кого есть поделитесь примерами или статьей. Желательно на русском. И заголовки бы тоже не плохо.

Заранее спасибо, надеюсь на Вашу помощь.

Share this post


Link to post
Share on other sites
Здравствуйте, уважаемые.

Я только собираюсь изучать OpenCV. я Программирую на Delphi 2 года. Других языков не знаю и учить не планирую. Познания в Delphi неплохие.

У меня почему то сложилось впечатление, что о делфистах забыли вообще. Я не смог найти нормальных примеров на этом языке.

Прошу у Вас помощи. Если у кого есть поделитесь примерами или статьей. Желательно на русском. И заголовки бы тоже не плохо.

Заранее спасибо, надеюсь на Вашу помощь.

Посмотрите здесь:

http://www.compvision.ru/forum/index.php?showtopic=64

Share this post


Link to post
Share on other sites

Вечер добрый. глянул ту ссылку. оказалась очень полезной.

поставил компоненты и сделал 1 проект. запустил- и о чудо- о великий и могучий синий экран. в чем проблема?

делал все по инструкции. и тут чудо такое.

пробовал тестить на виртуалке- так не видит камеру, с дровами как всегда на хр проблема)))

Share this post


Link to post
Share on other sites

Здравствуйте уважаемые форумчане!

1.Вопрос будет ли работать библиотека opencv 2.0 на:

Borland C++ Builder 2009,

Borland C++ Builder 2010,

Borland C++ Builder XE?

2.Есть ли какие либо особенности установки библиотеки на данные программные продукты?

3.Стоит ли вообще заморачиваться и ставить более поздние версии, чем Borland C++ Builder 6 для работы с opencv 2.0 и компьютерным зрением в целом (захват, обработка, распознование видео и статичных изображений)?

4.Какие преимущества есть у более поздних версий BCB? Вопрос не праздный, т.к BCB6 есть в наличие, BCB2009 могу скачать образ, с остальными более проблемно.

Заранее благодарен за ответы! :)

Share this post


Link to post
Share on other sites

Create an account or sign in to comment

You need to be a member in order to leave a comment

Create an account

Sign up for a new account in our community. It's easy!

Register a new account

Sign in

Already have an account? Sign in here.

Sign In Now


  • Recently Browsing   0 members

    No registered users viewing this page.

×