Для OpenCv 1.1pre1
Материал из CompVision
Создание нового проекта в среде C++ Builder 6.
Библиотеки:
* 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
Исходник минимального проекта
//--------------------------------------------------------------------------- #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; 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; long int length=0; if(_Grab->nChannels==1) // Серое или бинарное { length = _Grab->width*(_Grab->height); for (int i=0;i<_Grab->height;i++) { for (int j=0;j<_Grab->width;j++) { App[_Grab->width*3*(_Grab->height-i-1)+j*3]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+1]=_Grab->imageData[_Grab->width*(i)+j]; App[_Grab->width*3*(_Grab->height-i-1)+j*3+2]=_Grab->imageData[_Grab->width*(i)+j]; } } } if(_Grab->nChannels==3) // Цветное { for (int i=0;i<_Grab->height;i++) { memcpy(App+_Grab->width*3*(_Grab->height-i-1),_Grab->imageData+_Grab->width*3*i,_Grab->width*3); // Копируем память } } 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); }