Перейти к содержимому
Compvision.ru
FormatCft

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

Recommended Posts

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

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

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

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

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

Поделиться сообщением


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

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

var

capture : CvCapture;

Поделиться сообщением


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

var

capture : CvCapture;

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Набрел в сети на проект оболочки под Делфи:

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Набрел в сети на проект оболочки под Делфи:

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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 );

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

Поделиться сообщением


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

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].

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

Поделиться сообщением


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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Как видите, я вместо 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.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Мне тоже интересен этот вопрос. Если интерпретировать 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 по дельфофски (два четырехбайтовых числа).

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
О подключении версии 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'

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Подскажи как исправил)?

к примеру у меня в 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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Builder6+OpenCV2

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

post-609-1261909792_thumb.jpg

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Аналогичная ошибка. Получилось решить проблему?

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

#define _STLP_NO_CSTD_FUNCTION_IMPORTS

#define _FM_NO_REMAP

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
#define _STLP_NO_CSTD_FUNCTION_IMPORTS

#define _FM_NO_REMAP

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
IPP существенно (в разы) ускоряющая работу OpenCV хреновина берется с сайта Intel.

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

Google рулит.

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

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

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

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

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

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

Поделиться сообщением


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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
Здравствуйте, уважаемые.

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

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

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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

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

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

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

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 могу скачать образ, с остальными более проблемно.

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

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Создайте учётную запись или войдите для комментирования

Вы должны быть пользователем, чтобы оставить комментарий

Создать учётную запись

Зарегистрируйтесь для создания учётной записи. Это просто!

Зарегистрировать учётную запись

Войти

Уже зарегистрированы? Войдите здесь.

Войти сейчас


  • Сейчас на странице   0 пользователей

    Нет пользователей, просматривающих эту страницу

×