Форум: "Начинающим";
Текущий архив: 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.044 c