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

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

Recommended Posts

Создание нового проекта в среде C++ Builder 6.

(Для OpenCV v1.1)

Библиотеки

* cv.lib

* cvaux.lib

* cvhaartraining.lib

* cxcore.lib

* cxts.lib

* Half.lib

* highgui.lib

* Iex.lib

* IlmImf.lib

* IlmThread.lib

* Imath.lib

* libjasper.lib

* libjpeg.lib

* libjpeg_bcc.lib

* libpng.lib

* libpng_bcc.lib

* libtiff.lib

* libtiff_bcc.lib

* ml.lib

* videoInput.lib

* zlib.lib

* zlib_bcc.lib

короче все файлы из директории OpenCV с расширением lib, необходимо сконвертировать при помощи утилиты coff2omf.exe лежащей в поддиректории /bin директории, где у Вас установлен C++ Builder 6

(или LibConverter см. в прикрепленных ниже файлах)

Конвертация необходима ввиду того, что в OpenCV библиотеки с расширением .lib сделаны для использования с Microsoft Visual C.

Подключить сконвертированные библиотеки проекту (Меню Project -> Add to project).

Еще нужно указать пути к заголовочным файлам библиотеки OpenCV,

делается это на вкладке Directories/Conditionals,

диалога Options вызываемого выбором пункта меню Project.

Эти файлы расположены в нескольких поддиректориях

директории в которую Вы поставили OpenCV.Например для OpenCV v1.1 это директории представленные ниже.

* C:\Program Files\OpenCV\cv\include

* C:\Program Files\OpenCV\cvaux\include

* C:\Program Files\OpenCV\cxcore\include

* C:\Program Files\OpenCV\ml\include

* C:\Program Files\OpenCV\otherlibs\_graphics\include

* C:\Program Files\OpenCV\otherlibs\ffopencv

* C:\Program Files\OpenCV\otherlibs\highgui

Побросать все сконвертированные lib файлы в директорию libs проекта (или другую) и указать путь к этой нашей директории аналогично тому, как это сделано для заголовочных файлов.

Чекбокс Use dynamic RTL на вкладке Linker должен быть установлен, иначе требует несуществующую haartraining.dll

Чекбокс Build with runtimre packages тоже должем быть установлен, иначе требует ilmthread.dll (тоже не знаю где взять).

Так же рекомендуется установить флажок MFC compatibility, это необходимо для правильной работы функции cvGetSize().

И не забудте что DLL должны быть в зоне видимости программы. Приведенный ниже пример использует библиотеку OpenCV v1.1.

Проект просто выводит захваченное видео в форму в соответствии с заданными координатами, в данном случае x=10, y=10

И еще если возникает ошибка 0xc0150002, то для корректной работы OpenCV1.1pre1 надо установить MSVCRT 8.0 (visual c++ run time).

MSVCRT8.0

*Архив с проектом:simple.rar

*Конвертер библиотек:LibConverter.rar

*Набор сконвертированных lib:libs.rar

*Набор DLL (на всякий случай):OpenCV11DLLs.rar

//---------------------------------------------------------------------------
#include <vcl.h>
#pragma hdrstop

#include "cv.h"
#include "highgui.h"

#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
CvCapture* capture = 0;
IplImage *frame, *frame_copy = 0;
void ProcessFrame( IplImage* image );
// Описатель шрифта (см. дальше)
CvFont font;

#define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)
//---------------------------------------------------------------------------
// Создание API шного битмапа из интеловского RGB изображения
//---------------------------------------------------------------------------
HBITMAP CreateRGBBitmap(IplImage* _Grab)
{
char *App;

IplImage *_Grab3=0,*_Grabf=0;

LPBITMAPINFO lpbi = new BITMAPINFO;
lpbi->bmiHeader.biSize = sizeof(BITMAPINFOHEADER);
lpbi->bmiHeader.biWidth = _Grab->width;
lpbi->bmiHeader.biHeight =_Grab->height;
lpbi->bmiHeader.biPlanes = 1;
lpbi->bmiHeader.biBitCount = 24;
lpbi->bmiHeader.biCompression = BI_RGB;
lpbi->bmiHeader.biSizeImage = WIDTHBYTES((DWORD)_Grab->width * 8) * _Grab->height;
lpbi->bmiHeader.biXPelsPerMeter = 0;
lpbi->bmiHeader.biYPelsPerMeter = 0;
lpbi->bmiHeader.biClrUsed = 0;
lpbi->bmiHeader.biClrImportant = 0;
void* pBits;
HBITMAP hBitmap = CreateDIBSection(
NULL,
lpbi,
DIB_RGB_COLORS,
(void **)&pBits,
NULL,
0 );
delete lpbi;
if ( hBitmap )
App=(char*)pBits;
// Если глубина изображения не IPL_DEPTH_8U (однобайтовое целое), конвертируем
if(_Grab->depth!=IPL_DEPTH_8U)
{
_Grabf=cvCloneImage(_Grab);
if(_Grab) {cvReleaseImage( &_Grab);}
_Grab = cvCreateImage( cvSize(_Grabf->width,_Grabf->height),IPL_DEPTH_8U,_Grabf->nChannels);
cvConvert(_Grabf,_Grab);
if(_Grabf) {cvReleaseImage( &_Grabf);}
}
// Если изображение содержит один канал, создаем трехканальное изображение
// Серое или бинарное
if(_Grab->nChannels==1)
{
_Grab3 = cvCreateImage( cvSize(_Grab->width,_Grab->height),IPL_DEPTH_8U,3);
cvMerge(_Grab,_Grab,_Grab,NULL,_Grab3);
}
// Если входное изображение трехканальное, просто копируем указатель на него
// Цветное
if(_Grab->nChannels==3)
{
_Grab3=_Grab;
}
// Получаем указатель на данные
unsigned char* data;
cvGetRawData(_Grab3, (uchar**)&data);
// Копируем данные
if(_Grab3)
{
for (int i=0;i<_Grab->height;i++)
{
memcpy(App+_Grab3->widthStep*(_Grab3->height-i-1),data+_Grab3->widthStep*i,_Grab3->width*3);
}
}
// Очищаем память если создавали изображение, а не копировали указатель
if(_Grab->nChannels==1) {cvReleaseImage( &_Grab3);}

return hBitmap;
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
// Функция вывода изображения на HANDLE оконного компонента
//---------------------------------------------------------------------------
void APIDrawIpl(int x,int y,IplImage* _Grab,void *HANDLE)
{
HDC hMemDC,hDC;
hDC=GetDC(HANDLE);
hMemDC = CreateCompatibleDC(hDC);
HBITMAP Bitmap=CreateRGBBitmap(_Grab);
SelectObject(hMemDC,Bitmap);
BitBlt(hDC,x,y,_Grab->width,_Grab->height,hMemDC,0,0,SRCCOPY);
DeleteObject(Bitmap);
DeleteDC(hMemDC);
DeleteDC(hDC);
}
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
capture = cvCaptureFromCAM(0);
// Инициализация шрифта (теперь можем вывести какой-нибудь текст)
cvInitFont(&font, CV_FONT_HERSHEY_SIMPLEX,0.5,0.5,0,1,8);
Application->OnIdle = IdleLoop; // Поток обработки простоя
}
//---------------------------------------------------------------------------

void __fastcall TForm1::IdleLoop(TObject*, bool& done)
{
done = false;// Поток обработки простоя
if( capture )
{
if( !cvGrabFrame( capture ))
goto skip;
frame = cvRetrieveFrame( capture );
if( !frame )
goto skip;
//*********************************************************
// Если стерли то что ниже - это надо раскомментировать
// if( !frame_copy )
// frame_copy = cvCreateImage( cvSize(frame->width,frame->height),
// IPL_DEPTH_8U, frame->nChannels );
// Делаем копию кадра, иначе может пропасть.
// cvCopy( frame, frame_copy, 0 );
// Если стерли то что ниже - это надо раскомментировать
//*********************************************************

//*********************************************************
// Если не нужно подгонять размер кадра - это можно стереть
// Выделяем память под копию кадра
if( !frame_copy )
frame_copy = cvCreateImage( cvSize(352,288),
IPL_DEPTH_8U, frame->nChannels );
// Масштабируем под заданный размер
cvResize( frame, frame_copy, CV_INTER_LINEAR );
// Если не нужно подгонять размер кадра - это можно стереть
//*********************************************************


ProcessFrame( frame_copy );
}
skip:;
}
//---------------------------------------------------------------------------
void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)
{
cvReleaseImage( &frame_copy );
cvReleaseCapture( &capture );
}
//---------------------------------------------------------------------------
void ProcessFrame( IplImage* img )
{
APIDrawIpl(10,10,img,Form1->Handle);
}[/code]

  • Like 2

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


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

О! Спасибо огромное! И сконвертированные библиотеки как раз кстати :)

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


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

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

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

Google рулит.

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

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

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


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

Если кому интересно.

Долго искал в инете пример использования OpenCV в Делфи - все отправляют учить C.

Есть ресурс Набор библиотек компонентов для Delphi, C++ Builder.

Смотрите VisionLab. Для некоммерческого использования бесплатна. Исходники компонентов закрыты (можно купить правда).

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


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

Здравствуйте!

У меня следующий вопрос: можно ли обойтись без использования класса VECTOR в примере Find_obj?

P.S. Зачем это надо - нужен простейший пример для переноса на Делфи.

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


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

У меня следующий вопрос: можно ли обойтись без использования класса VECTOR в примере Find_obj?

P.S. Зачем это надо - нужен простейший пример для переноса на Делфи.

Можете использовать вместо vector<int>& указатель на обычный массив, лучше динамический.

С vector<CvPoint2D32f> pt1, pt2; аналогично. Vector здесь просто для удобства. Можно попытаться приспособить cvSeq. Если у Вас не получится, я пример, скорее всего подкину только на выходных (пока времени очень мало, студенты донимают).

А Вы собираетесь заголовочные файлы OpenCV переписывать на паскаль, или каким то другим способом хотите с Делфи взаимодействовать?

PS: Класс Vector еще используется в заголовочном файле C:\Program Files\OpenCV\cv\src\_cvkdtree.hpp, но вроде бы он больше никуда не включается.

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


Ссылка на сообщение
Поделиться на других сайтах
Можете использовать вместо vector<int>& указатель на обычный массив, лучше динамический.

С vector<CvPoint2D32f> pt1, pt2; аналогично. Vector здесь просто для удобства. Можно попытаться приспособить cvSeq. Если у Вас не получится, я пример, скорее всего подкину только на выходных (пока времени очень мало, студенты донимают).

А Вы собираетесь заголовочные файлы OpenCV переписывать на паскаль, или каким то другим способом хотите с Делфи взаимодействовать?

PS: Класс Vector еще используется в заголовочном файле C:\Program Files\OpenCV\cv\src\_cvkdtree.hpp, но вроде бы он больше никуда не включается.

Именно так. Дамаете, что идея бредовая? Facedetect я переписал на делфи. Сейчас пробую переписать заголовочные файлы полностью - надеюсь, что терпения хватит. Могу потом выложить, что получится.

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


Ссылка на сообщение
Поделиться на других сайтах
Именно так. Дамаете, что идея бредовая? Facedetect я переписал на делфи. Сейчас пробую переписать заголовочные файлы полностью - надеюсь, что терпения хватит. Могу потом выложить, что получится.

Титанический труд (хотел сам взяться, но знания паскаля не хватает и терпения), думаю что многие Вам будут благодарны если опубликуете. Только может немного подождать, в конце месяца новую версию вроде обещали ("next major release of OpenCV is here: OpenCV 2009.06").

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


Ссылка на сообщение
Поделиться на других сайтах
Титанический труд (хотел сам взяться, но знания паскаля не хватает и терпения), думаю что многие Вам будут благодарны если опубликуете. Только может немного подождать, в конце месяца новую версию вроде обещали ("next major release of OpenCV is here: OpenCV 2009.06").

Спасибо за подсказку. Точно, анонсировали в июне-июле новый релиз. Но начать, нужно, наверное, сейчас. Наврядли базовый код сильно изменится - дополнений много будет. Надеюсь, что из этого получится что-нибудь полезное.

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


Ссылка на сообщение
Поделиться на других сайтах
Спасибо за подсказку. Точно, анонсировали в июне-июле новый релиз. Но начать, нужно, наверное, сейчас. Наврядли базовый код сильно изменится - дополнений много будет. Надеюсь, что из этого получится что-нибудь полезное.

Начнете - выкладывайте, попробую присоединиться, заодно и паскаль подучу :(

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


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

А как всё это прикрутить к BDS2006? Мучаюсь уже 3 дня. Нифига не выходит. Пробовал на 2-х разных машинах, сделал конвертацию библиотек.

При запуске выдаёт экран с кодами процессора \ и ошибки 0х00000130.

Где-то скачал проект с OPENCV, интересно, что сам проект идёт, а создать такой же снуля, скопировав из исходного все сопутствующие файлы, 1 в 1 установил все данные в Options(project), не выходит. Мыстика какая-то.

Что делать, товарищи знатоки?

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


Ссылка на сообщение
Поделиться на других сайтах
Еще интересно как к Qt прикрутить опенцв.

Пока могу сюда перенаправить: http://www.qtcentre.org/forum/f-qt-program...tion-11655.html

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


Ссылка на сообщение
Поделиться на других сайтах
А как всё это прикрутить к BDS2006? Мучаюсь уже 3 дня. Нифига не выходит. Пробовал на 2-х разных машинах, сделал конвертацию библиотек.

При запуске выдаёт экран с кодами процессора \ и ошибки 0х00000130.

Где-то скачал проект с OPENCV, интересно, что сам проект идёт, а создать такой же снуля, скопировав из исходного все сопутствующие файлы, 1 в 1 установил все данные в Options(project), не выходит. Мыстика какая-то.

Что делать, товарищи знатоки?

Такие ошибки могут быть реакцией на функцию cvGetSize(), хоть у willowgarage и написано что её можно заставить работать, выставив совместимость с MS VC, но у меня на шестом билдере выдает ошибки лучше использовать cvSize(ширина, высота).

А вообще надежда есть, там они упоминают BDS2006 : http://opencv.willowgarage.com/wiki/C%2B%2BBuilder

Посмотрите отладчиком, в какой строке возникает ошибка. Приведите кусок кода.

PS: Попробуйте собрать самый минимальный проект + убрать вывод на форму (вывод делать в стандартное окно OpenCV).

PS:PS: Библиотеки вроде должны и с этого форума подходить.

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


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

Собственно я и пытался собрать минимальный проект. Сделал копию работающего проекта (я так понимаю он собран на 5 билдере) по настройкам и по файлам. И нифига, та же песня. В принципе 2 проекта с одними и теми же настройками и файлами должны давать одинаковую реакцию на "Run", но тут это не проходит.

Я не сильно разбираюсь в билдырах, но прикрутить к BDS2006 не удалось не только мне. Кто бросил, кто на VC перешёл, а у меня оснавная часть в студии, без права смены IDE.

В такие моменты начинает казаться, что из всех людей на земле твой комп ненавидит именно тебя...

Достают это множество стандартов... Блин как же все на Java легко подключается, а здесь чтобы подключить "легкоподключаемую" библиотеку к программе нужно помучиться больше, чем занимает писанина собственно кода.

Вопрос, почему эти разработчики сразу не сделали библиотеки по Билдеры? Что это маркетинговая война, типа борладн отстой, а дядя Билли рулит.

Хочется все-таки рабочего варианта ОпенСВ под студию.

Да, и.. Ошибка по ходу возникает даже не в программе. Ставлю breakpoint в месте создания форму (тобишь почти что в конструкторе) и она до него не доходит.

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


Ссылка на сообщение
Поделиться на других сайтах
Собственно я и пытался собрать минимальный проект. Сделал копию работающего проекта (я так понимаю он собран на 5 билдере) по настройкам и по файлам. И нифига, та же песня. В принципе 2 проекта с одними и теми же настройками и файлами должны давать одинаковую реакцию на "Run", но тут это не проходит.

Я не сильно разбираюсь в билдырах, но прикрутить к BDS2006 не удалось не только мне. Кто бросил, кто на VC перешёл, а у меня оснавная часть в студии, без права смены IDE.

В такие моменты начинает казаться, что из всех людей на земле твой комп ненавидит именно тебя...

Достают это множество стандартов... Блин как же все на Java легко подключается, а здесь чтобы подключить "легкоподключаемую" библиотеку к программе нужно помучиться больше, чем занимает писанина собственно кода.

Вопрос, почему эти разработчики сразу не сделали библиотеки по Билдеры? Что это маркетинговая война, типа борладн отстой, а дядя Билли рулит.

Хочется все-таки рабочего варианта ОпенСВ под студию.

Да, и.. Ошибка по ходу возникает даже не в программе. Ставлю breakpoint в месте создания форму (тобишь почти что в конструкторе) и она до него не доходит.

Попробую завтра поставить BDS2009 (еще скачать надо) посмотрю что там не так.

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


Ссылка на сообщение
Поделиться на других сайтах
Боюсь, что в 2009 будет ещё что-нибудь, чего нет в 2006. :)

Все собралось и подключилось (с либами из этой темы (см. выше), часть на которые он ругался (говорил что нет dll libjasper, libjpeg, libpng и тп.) удалил).

Поищу завтра как подключить их обратно, а пока вот :)

screenshot.jpg

  • Like 1

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


Ссылка на сообщение
Поделиться на других сайтах
Все собралось и подключилось (с либами из этой темы (см. выше), часть на которые он ругался (говорил что нет dll libjasper, libjpeg, libpng и тп.) удалил).

Поищу завтра как подключить их обратно, а пока вот :)

Вроде и без них нормально работает :), картинки, во всяком случае грузит нормально.

Создание проекта ничем не отличается от Builder 6.

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


Ссылка на сообщение
Поделиться на других сайтах
Начнете - выкладывайте, попробую присоединиться, заодно и паскаль подучу :)

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

delphi_header.zip

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


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

Спасибо огромное у меня тоже заработало. Вы всё очень толково расписали, что каждый может понять.

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


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

Здравствуйте!

Есть такая структура:

typedef struct CvCapture CvCapture;
Ну совершенно не укладывающаяся в голове делфийца... как ее описать? Еще не нашел пару нужных функций, к примеру: cvCaptureFromFile. Перехожу по ней и вижу такое описание:
...

#define cvCaptureFromFile cvCreateFileCapture

#define cvCaptureFromCAM cvCreateCameraCapture

#define cvCaptureFromAVI cvCaptureFromFile

...

Подскажите плиз откуда их экспортировать?

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


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

Есть такая структура:

typedef struct CvCapture CvCapture;
Ну совершенно не укладывающаяся в голове делфийца... как ее описать? Еще не нашел пару нужных функций, к примеру: cvCaptureFromFile. Перехожу по ней и вижу такое описание:
...
#define cvCaptureFromFile cvCreateFileCapture
#define cvCaptureFromCAM cvCreateCameraCapture
#define cvCaptureFromAVI cvCaptureFromFile
...[/code]

Подскажите плиз откуда их экспортировать?

По первому вопросу, не знаю (никогда так не делал), а по второму, нужно копать исходники из папки OpenCV\otherlibs\highgui\cvcap_***.cpp

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


Ссылка на сообщение
Поделиться на других сайтах
По первому вопросу, не знаю (никогда так не делал), а по второму, нужно копать исходники из папки OpenCV\otherlibs\highgui\cvcap_***.cpp

дошло до меня зачем такое:

typedef struct CvCapture CvCapture;

это просто чтобы переменную, допустим cap, типа

struct cvCapture объявлять так:

cvCapture cap;

а не так:

struct cvCapture cap;

век живи - век учись ;)

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×