Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.03.04;
Скачать: CL | DM;

Вниз

Помогите. C++ в Delphi.   Найти похожие ветки 

 
danila_master ©   (2007-02-12 17:55) [0]

Подскажите пожалуйста, можно ли этот код с с++ в делфи написать?
Стоит ли вообще мучаться?
#include "ExternalForce.h"
#include "ActiveContour.h"

#include <cv.h>
#include <highgui.h>
#include <math.h>

class calcCenter
{
public:
calcCenter();
~calcCenter();

void calculate(int* size);
void setImage(unsigned char* image, int* size);
void setParameter(float alpha, float beta, float gamma, float kappa, int iter);
void setExternalForce(float* px, float* py);
void setResolution(float res);
void setIteration(int _iter);
float* getParameter() { return _parameter; }

private:
IplImage* _origImage;

unsigned char _levels;
int _iter;
bool _start;

float* _parameter;

ExternalForce* force;
ActiveContour* contour;
};

calcCenter::calcCenter()
{
_origImage = NULL;

_levels = 2;
_iter = 10;
_start = true;

_parameter = new float[6];

for (int i=0; i<6; i++)
 _parameter[i] = 0.f;

contour = new ActiveContour();
force = new ExternalForce();
}

calcCenter::~calcCenter()
{
if (_origImage!=NULL) cvReleaseImage(&_origImage);

if (_parameter!=NULL)
 delete[] _parameter;

delete contour;
delete force;

}

void calcCenter::setImage(unsigned char* image, int* size)
{
if (_origImage!=NULL)
 cvReleaseImage(&_origImage);

_origImage = cvCreateImage(cvSize(size[0], size[1]), IPL_DEPTH_8U, 1);

memcpy(_origImage->imageData, image, sizeof(unsigned char)*size[0]*size[1]);
}

void calcCenter::calculate(int* size)
{
IplImage** pyrImage;
pyrImage = new IplImage*[_levels];

for (int i=0; i<_levels; i++)
{
 if (i==0)
 {
  pyrImage[i] = cvCreateImage(cvSize(_origImage->width/2, _origImage->height/2), IPL_DEPTH_8U, _origImage->nChannels);
  cvPyrDown( _origImage, pyrImage[i] );
 }
 else
 {
  pyrImage[i] = cvCreateImage(cvSize(pyrImage[i-1]->width/2, pyrImage[i-1]->height/2), IPL_DEPTH_8U, pyrImage[i-1]->nChannels);
  cvPyrDown( pyrImage[i-1], pyrImage[i] );
 }
}

int length = pyrImage[_levels-1]->width*pyrImage[_levels-1]->height;

float* image = new float[length];
float* px = new float[length];
float* py = new float[length];

for (int i=0, j=0; i<length; i++)
 image[i] = (unsigned char)(pyrImage[_levels-1]->imageData[i])/255.f;

int size1[2] = { pyrImage[_levels-1]->width, pyrImage[_levels-1]->height };

int xdim = _origImage->width;
int ydim = _origImage->height;

bool ok = false;

force->computeExternalForce(image, px, py, size1, TRADITIONAL);
contour->setSize(size1);
contour->setExternalForce(px, py);
ok = contour->deform(pyrImage[_levels-1]);

if (ok)
{
 float* param = contour->calcCenter(_levels);
 float* x = contour->getActiveContour()[0];
 float* y = contour->getActiveContour()[1];

 length = contour->getActiveContourLength();

 cvSetImageROI(_origImage, cvRect(cvRound(param[0]-100), cvRound(param[1]-100), 200, 200));

 CvMemStorage* storage = cvCreateMemStorage(0);
 CvSeq* circles = cvHoughCircles( _origImage , storage, CV_HOUGH_GRADIENT, 2, _origImage->height/4, 200, 100 );

 float* p=NULL;
 if (circles->total>0)
  p = (float*)cvGetSeqElem( circles, 0 );

 cvSetImageROI(_origImage, cvRect(0, 0, _origImage->width, _origImage->height));

 if (_parameter==NULL)
 {
  _parameter = new float[6];
  memset(_parameter, 0, 6*sizeof(float));
 }

 _parameter[0] = param[0];
 _parameter[1] = param[1];
 if (circles->total>0)
 {
  _parameter[2] = param[0]-100+p[0];
  _parameter[3] = param[1]-100+p[1];
 }
 _parameter[4] = param[2];
 _parameter[5] = param[3];

  cvClearMemStorage(storage);
     cvClearSeq(circles);
}
else
{
 if (_parameter==NULL)
  _parameter = new float[6];

 memset(_parameter, 0, 6*sizeof(float));
}

delete[] px;
delete[] py;
delete image;

for (int i=0; i<_levels; i++)
 cvReleaseImage(&pyrImage[i]);

delete[] pyrImage;
}

void calcCenter::setParameter(float alpha, float beta, float gamma, float kappa, int iter)
{
contour->setParameter(alpha, beta, gamma, kappa, iter);
}

void calcCenter::setResolution(float res)
{
contour->setResolution(res);
}


 
DrPass ©   (2007-02-12 18:20) [1]


> можно ли этот код с с++ в делфи написать?

Можно. Код как код...

> Стоит ли вообще мучаться?

Мы-то откуда знаем, стоит ли тебе мучаться %)


 
Rouse_ ©   (2007-02-13 13:25) [2]

Можно.


 
danila_master ©   (2007-02-13 13:51) [3]

А как? Подскажите если не трудно. Оцобенно меня интересует строка

IplImage** pyrImage;
pyrImage = new IplImage*[_levels];


Я просто не совсем понимаю как можно сделать указатель на указатель в паскале. И еще, как я понимаю эта из библиотеки OpenCV, а она насколько я знаю только для С++, или есть какойто аналог?


 
clickmaker ©   (2007-02-13 13:59) [4]

var
 IplImage: array of pyrImage;

SetLength(IplImage, _levels);


 
clickmaker ©   (2007-02-13 14:00) [5]


> [4] clickmaker ©   (13.02.07 13:59)

тьфу, блин. наоборот, конечно
var
pyrImage: array of IplImage;

SetLength(pyrImage, _levels);


 
Danila_master ©   (2007-02-13 14:09) [6]

Спасибо, только IplImage это класс из библиотеки OpenCV со своими функциями и т.д., а всю библиотеку с с++ на паскаль переписывать, сам понимаешь :(. Может кто знает есть какая-нить алтернатива только под делфи.


 
Danila_master ©   (2007-02-13 15:27) [7]

И еще один вопросик, как можно такую функцию написанную на срр переоисать на паскаль?

BOOL APIENTRY DllMain (HINSTANCE hInst     /* Library instance handle. */ ,
                      DWORD reason        /* Reason this function is being called. */ ,
                      LPVOID reserved     /* Not used. */ )
{
   switch (reason)
   {
     case DLL_PROCESS_ATTACH:
       break;

     case DLL_PROCESS_DETACH:
       break;

     case DLL_THREAD_ATTACH:
       break;

     case DLL_THREAD_DETACH:
       break;
   }

   /* Returns TRUE on success, FALSE on failure */
   return TRUE;
}


 
Romkin ©   (2007-02-13 15:31) [8]

Реализуй DLLProc


 
Elen ©   (2007-02-13 15:54) [9]


> Danila_master ©   (13.02.07 15:27) [7]

Хм. Интересно а вообще эта функция когда-нибудь False вернет? Break в Switch это вроде выход из него. А аналог для switch в паскале - Case.
Я что-то смысл этой функции не пойму...


 
Danila_master ©   (2007-02-13 16:07) [10]

Вот и я не пойму, я даже название понять не могу, что оно означает?
bool это понятно - возвращает да или нет.
dllmain это тоже понятно - название функции.
А apientry что означает?


 
Elen ©   (2007-02-13 16:15) [11]


> А apientry что означает?

Цитата :
" а   APIENTRY   это  макро, которое на самом деле определяет форму вызова функции.

Если считать, что эта информация

http://www.subduck.com/history/topic/292.html

не устарела, то  APIENTRY   это  на самом деле far pascal :)"


 
Игорь Шевченко ©   (2007-02-13 16:18) [12]


> И еще один вопросик, как можно такую функцию написанную
> на срр переоисать на паскаль?


Можно. Для этого достаточно вообще ничего не писать в Delphi


 
Игорь Шевченко ©   (2007-02-13 16:24) [13]

Elen ©   (13.02.07 15:54) [9]


> Я что-то смысл этой функции не пойму...


Матчасть учить - оно всегда полезно и увлекательно


 
Elen ©   (2007-02-13 16:29) [14]


> Игорь Шевченко ©   (13.02.07 16:24) [13]

А подсказать душа не снизойдет, любитель матчасти?


 
Игорь Шевченко ©   (2007-02-13 16:32) [15]

Elen ©   (13.02.07 16:29) [14]


> А подсказать душа не снизойдет, любитель матчасти?


Подсказывает яндекс и гугль. Также F1 и msdn. Удачи.


 
DrPass ©   (2007-02-13 16:58) [16]

Удалено модератором
Примечание: Offtopic


 
Elen ©   (2007-02-13 17:03) [17]

Удалено модератором
Примечание: Offtopic



Страницы: 1 вся ветка

Текущий архив: 2007.03.04;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.039 c
15-1171019492
ПЛОВ
2007-02-09 14:11
2007.03.04
Подскажите компонент


2-1171543139
Muscat
2007-02-15 15:38
2007.03.04
Файлы *.rtl . Помогите кто чем может!!!


15-1170970395
ferr
2007-02-09 00:33
2007.03.04
маки и висты.


15-1170917756
fisherman
2007-02-08 09:55
2007.03.04
Завод купил напольные весы...


6-1159376066
SanJouK
2006-09-27 20:54
2007.03.04
Как отслеживать кол-во скачанных мегабайт с инета ?