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

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

Recommended Posts

а что делать если не помагают :

msvcrt2008: http://www.microsoft...aylang=en&id=29

msvcrt2005: http://www.microsoft...ls.aspx?id=3387

на других РС получаю даже с ними "Ошибка при инициализации приложения (0х0150002). Для выхода из приложения нажмите "ОК". "

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


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

Ребят по прошу помощи

http://gidesa.altervista.org/camshiftdemo.php

LK demo программа, там чего то не хватает, можете скинуть полностью рабочий комплект сорсов

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


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

HI AGAIN, WELL I ALREADY SOLVED THE PROBLEM AND NOW A'M WORKING ON BUILDER 6 AND OPENCV 2.0, BUT CAN YOU EXPLAIN ME HOW TO COMPILE THE OPENCV FOR BUILDER C++, BECAUSE I WANT TO TRY THE NEW OPENCV VERSION 2.4

THANKS...

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


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

Hi.

Try this solution (version 2.3.x + builder XE2):

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

Compiling opencv with borland is very hard, and you don't need do it.

Just compile opencv with microsoft visual studio, to get dll and lib files.

To use it in builder you need to convert lib files (see topic above) and fix some headers (example of fixed headers in arhive from topic above).

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


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

Народ так всё-таки что с этим делать http://www.compvision.ru/forum/index.php?showtopic=64&view=findpost&p=5946 ? на многих компьютерах моё приложение не работает :-(

ПОМОГИТЕ !!!! :bow:

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


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

Кодеки на тех компах такие-же стоят?

TBB, IPP проект требует?

Этой тулзой смотрели, что ему надо? http://www.dependencywalker.com/

Запуск от админа?

Пути к DLL прописаны?

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


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

Всем привет. Поставил BC-6, распаковал OpenCV 2.4, но конвертнуть библиотеки не могу. Сама утилита coff2omf.exe выдает ошибку. Кто-то конвертировал свежие библиотеки v2.3x или v2.4 под BC-6? Поделитесь пожалуйста.

Заранее спасибо.

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


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

Надо их сначала в Visual Studio собрать, а затем, конвертировать. Кстати, без исправленных заголовочников работать не будет, наверное Вы уже это поняли. См. http://www.compvision.ru/forum/index.php?showtopic=763

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


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

Потребовалось выводить изображение на экран. Использую пример Builder6+OpenCV1.1. Пример работает, но я решил его улучшить - чтобы при изменении размера окна видео тоже масштабировась.



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

CvFont font;double ratio, x_ratio, y_ratio;


#define WIDTHBYTES(bits) ((((bits) + 31) / 32) * 4)


HBITMAP CreateRGBBitmap(IplImage* _Grab)

{  

  char *App;  

  void* pBits;  


  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;  


  HBITMAP hBitmap = CreateDIBSection(NULL, lpbi, DIB_RGB_COLORS, (void **)&pBits, NULL, 0);  

  delete lpbi;  


  if(hBitmap) App = (char*)pBits;  




if(_Grab->nChannels == 1) // Серое или бинарное  


{    


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; iheight; i++)    


{      


memcpy(App + _Grab->width*3*(_Grab->height - i - 1), _Grab->imageData + _Grab->width*3*i, _Grab->width*3);    


}  


}  


return hBitmap;


}


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


//---------------------------------------------------------------------------


void __fastcall TForm1::ProcessFrame(IplImage* img)


{  


APIDrawIpl((ClientWidth - frame_copy->width)/2, (ClientHeight - frame_copy->height)/2, img, Form1->Handle);


}


//---------------------------------------------------------------------------


__fastcall TForm1::TForm1(TComponent* Owner) : TForm(Owner)


{  


Color = clBlack;  


capture = cvCaptureFromCAM(0);  


cvInitFont(&font, CV_FONT_HERSHEY_DUPLEX, 0.5, 0.5, 0, 1, 8);  


Application->OnIdle = IdleLoop;


}


//---------------------------------------------------------------------------


void __fastcall TForm1::IdleLoop(TObject*, bool& done)


{  


done = false;  


if(capture)  


{    


if(!cvGrabFrame(capture)) return;    


frame = cvRetrieveFrame(capture);    


if(!frame) return;    


x_ratio = (double)ClientWidth/frame->width;    


y_ratio = (double)ClientHeight/frame->height;    


ratio = x_ratio < y_ratio ? x_ratio : y_ratio;    


if(!frame_copy) frame_copy = cvCreateImage(cvSize(frame->width*ratio, frame->height*ratio), IPL_DEPTH_8U, frame->nChannels);    


cvResize(frame, frame_copy);    


ProcessFrame(frame_copy);  


}


}


//---------------------------------------------------------------------------


void __fastcall TForm1::FormClose(TObject *Sender, TCloseAction &Action)


{  


cvReleaseImage(&frame_copy);  


cvReleaseCapture(&capture);


}


//---------------------------------------------------------------------------


void __fastcall TForm1::FormResize(TObject *Sender)


{  


Canvas->Brush->Color = clBlack;  


Canvas->FillRect(TRect(0, 0, Width, Height));  


if(frame_copy) cvReleaseImage(&frame_copy);  


if(frame)  


{    


x_ratio = (double)ClientWidth/frame->width;    


y_ratio = (double)ClientHeight/frame->height;    


ratio = x_ratio < y_ratio ? x_ratio : y_ratio;    


if(!frame_copy) frame_copy = cvCreateImage(cvSize(frame->width*ratio, frame->height*ratio), IPL_DEPTH_8U, frame->nChannels);  


}


}


//---------------------------------------------------------------------------


А в итоге получается вот что:post-5568-0-53899600-1337708526_thumb.jp

Когда начинаешь менять размер окна, иногда получается нормальная картинка. Но чаще такая галиматья.

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


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

TBB, IPP проект требует?

Этой тулзой смотрели, что ему надо? http://www.dependencywalker.com/

Запуск от админа?

Пути к DLL прописаны?

Можно ли по подробнее как этим пользоваться ?

И ещё один вопрос возник, всё равно некуда больше обращаться, ни кто объяснить должным образом не может :-\


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

            if( frame->origin == IPL_ORIGIN_TL )

                cvCopy( frame, frame_copy, 0 );

            else

                cvFlip( frame, frame_copy, 0 );


            ProcessFrame( frame_copy );

    }

skip:;

}

c помощью этого цикла можно уменьшить как нибудь нагрузку на процессор ? уменьшить количество кадров в секунду ? или ещё как нибудь ? машина у меня не сильно мощная :-\

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


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

Чем пользоваться DW?

Запускаете его, open и открываете Ваше приложение. Он покажет, какие библиотеки загружаются.

Этот цикл съедает все СВОБОДНОЕ время, он не мешает другим процессам (по крайней мере не должен :) ).

Уменьшить можно, но не с помощью этого цикла, а сделать эту процедуру выполняемой по таймеру.

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


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

Т.е. вместо этого цикла можно положить таймер, с какой то частотой, и в него влить эту же логику ? правильно я понимаю ?

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


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

Правильно, соорудить таймер и в функцию обратного вызова

один-в-один скопировать содержимое метода.

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


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

Добрый день, Smorodov!

Пытаюсь "прикрутить" opencv к С++Builder XE. Прочитал обе темы на Вашем форуме: эту и "Opencv 2.3.2 + Builder XE2". Запускать демо-проекты у меня получается.

Builder XE работает и со сборкой opencv 2.0 и с 2.3.2. Также получается выполнять какие-нибудь простые функции, типа загрузки изображений.

Но вот

cv::Mat img;
или, к примеру
cv::Mat img = cv::imread("some.bmp", 2);
не работают. Компилятор (в случае примера из данной ветки) ругается: [iLINK32 Error] Error: Unresolved external 'cv::fastFree(void *)' referenced from C:\RAD STUDIO\PROJECTS\SIMPLE\DEBUG_BUILD\UNIT1.OBJ [iLINK32 Error] Error: Unresolved external 'cv::imread(std::basic_string<char, std::char_traits<char>, std::allocator<char> >&, int)' referenced from C:\RAD STUDIO\PROJECTS\SIMPLE\DEBUG_BUILD\UNIT1.OBJ Если использовать пример с opencv 2.3.2, то еще ругнется на
[ILINK32 Error] Error: Unresolved external 'cv::Mat::allocate()(void *)...

Все либы подключены, dll - в папке экзешника. Примеры и другие функции работают, а эти нет...Не могли бы Вы помочь? Что нужно сделать?

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


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

Я, честно говоря, не использовал в билдере интерфейс C++, есть мысль, что от проекта надо отладочные варианты библиотек отключить(или наоборот подключить, если это отладочный профиль), но это только предположение. В студии тоже отладочная и релизная версии плохо вместе работают.

Сейчас у меня билдер не установлен.

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


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

С версиями библиотек пробовал (ставил профиль -дебаг, грузил соответствующие либы)- не получилось.

Простите за глупый вопрос, а если не использовать интерфейс С++, как мне по-билдеровски написать

cv::Mat img;

?

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


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



// Объявляем
IplImage *img;
// Создаем изображение нужного типа
img=cvCreateImage(w,h,CV_8UC3);[/code]

Это во всех примерах билдеровских есть.

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


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

Понятно, но тут вот, что получается. Я переписал весь свой нехитрый "проект" в синтаксисе типа:


CvMat *img, *imggauss , *edges;


img=cvLoadImageM("input.bmp",0);

edges=cvCloneMat(img);

imggauss=cvCloneMat(img);


cvSmooth(img,imggauss,CV_GAUSSIAN,3,3,1);

cvCanny(imggauss,edges,100,20,3);


cvShowImage("inputGaus",imggauss);

cvShowImage("edges",edges);
Все работает без замечаний. Но, ведь, если я правильно понимаю, получается, что я использую старые функции OpenCV, чуть ли не версии 1.1 ? В тоже время, использовать вместо CvMat новый класс Mat, и , соответственно, новые функции у меня не получается:
	cv::Mat *mat;

	mat->create(3,3,img->type);

Выдает ошибку "Unresolved external cv::Mat::create"

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


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

Ну тада Visual Studio ждет Вас :)

Borland такие навороченные шаблоны не переваривает, или очень много придется переписывать.

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


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

Правильно, соорудить таймер и в функцию обратного вызоваодин-в-один скопировать содержимое метода.

Организация таймера не привела ни к чему хорошему

после строки инициализации устройства:

capture = cvCaptureFromCAM(0);

происходит 100% загрузка, если грузить вторую камеру, комп виснет напроч

даже если Таймер установлен на 20 сек.

Что с этим делать? :startle:

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


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

А код можно посмотреть?

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


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

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

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

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

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

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

Войти

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

Войти сейчас


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

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

×