Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.03.04;
Скачать: [xml.tar.bz2];

Вниз

Помогите. 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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.5 MB
Время: 0.063 c
2-1171137763
Рустам
2007-02-10 23:02
2007.03.04
Как перенести приложение на другую машину


1-1168662909
ПАСЮТА
2007-01-13 07:35
2007.03.04
directX


1-1168354965
sia
2007-01-09 18:02
2007.03.04
принудительное закрытие приложения


15-1171291432
oldman
2007-02-12 17:43
2007.03.04
Вернемся к теме лицензирования?


15-1170946604
Rouse_
2007-02-08 17:56
2007.03.04
Хто тут работу искал?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский