⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 jetstream.cpp

📁 关于时下流行的粒子滤波程序的源码
💻 CPP
📖 第 1 页 / 共 2 页
字号:
		cvSetData(sampleMat, *m_flSamples , m_nStDim * sizeof(float));
		char name[50];
		sprintf(name, "samples-%d.dat", nStep);
		WriteMat32F(name, sampleMat);
		cvReleaseMatHeader(&sampleMat);

#endif

	m_nCurStep++;
	//Set current sample
	//SetVec(*m_flSamples, *x_ip1, m_nStDim * m_nSamplesNum);
}
///////////////////////////////////////////////////////////////////
//
// Selection()
//
//Purpose:
//	Sample index a(m)(m = 1, ..., M) from m_flConfidence[k]	over
//	{1,...,M}, and Set x_0:i+1(m) = (x_0:i_(a(m)), x_i+1(a(m))
//
///////////////////////////////////////////////////////////////////
void CJetStream::Selection(int nStep)
{
	//Selection performed at each step
//	if ((nStep - m_nCurStep) != 1)
	if (nStep != m_nCurStep)

		return;
	int *index = new int[m_nSamplesNum];
	//backup
	for(int i = 0; i <= nStep - 1; i++)
	{
		memcpy(*(*(m_tmpStream + i)), *(*(m_flStream + i)), m_nStDim * m_nSamplesNum * sizeof(float));
	}
	float **tmp_i, **stream_i;

	//Sample a(m)
	Resample(index);
	//a(m)
	int index_a;
	//re-set
	for (int m = 0; m < m_nSamplesNum; m ++)
	{
		//a(m)
		index_a = index[m];
		//Update x_0:i
		for (i = 0; i <= nStep - 1; i++)
		{
			tmp_i = *(m_tmpStream + i);
			stream_i = *(m_flStream + i);
			memcpy(*(stream_i + m), *(tmp_i + index_a), m_nStDim * sizeof(float));
			//SetVec(*(stream_i + m), *(tmp_i + index_a), m_nStDim);
		}
		//Update x_i+1
		stream_i = *(m_flStream + nStep);
		memcpy(*(stream_i + m), *(m_flSamples + index_a), m_nStDim * sizeof(float));
	}
	//Update current samples and confidences
#ifdef _WRITE_SAMPLE
		CvMat *sampleMat = cvCreateMatHeader(m_nSamplesNum, m_nStDim, CV_32FC1);
		cvSetData(sampleMat, *(*(m_flStream + nStep )) , m_nStDim * sizeof(float));
		char name[50];
		sprintf(name, "Updated-%d.dat", nStep);
		WriteMat32F(name, sampleMat);
		cvReleaseMatHeader(&sampleMat);

#endif
	memcpy(*(m_flSamples), *(*(m_flStream + nStep )), 
		m_nStDim * m_nSamplesNum * sizeof(float));
	SetVec(m_flConfidence, (float)(1.0 / m_nSamplesNum), m_nSamplesNum);
	CalCumulative();
	delete [] index;
//Write the samples projected to X-axis until now
//The ith row of smapleXMat is the X-Sample of the ith Step
#ifdef _WRITE_X_SAMPLE
	CvMat *sampleXMat = cvCreateMat(nStep + 1, m_nSamplesNum, CV_32FC1);
	float *data = NULL;
	float *srcSample = NULL;
	for (i = 0; i <= nStep; i++)
	{
		data = (float *)cvGetPtrAt(sampleXMat, i);
		srcSample = *(*(m_flStream + i));
		for (m = 0; m < m_nSamplesNum; m++, srcSample += m_nStDim)
		{
			*data++ = *srcSample;
		}
	}
	char Xname[50];
	//sprintf(Xname, "Samples-X-%d-%S.dat", nStep, GetTime());
	sprintf(Xname, "Samples-X-%d.dat", nStep, GetTime());
	WriteMat32F(Xname, sampleXMat);
	cvReleaseMat(&sampleXMat);
#endif

	//An iteration complete
	//m_nCurStep++;

}
/////////////////////////////////////////////////////////////////////////////////////
//
//	EstState()
//
//Purpose:
//	Estimate the states as the mean of the particles
//
/////////////////////////////////////////////////////////////////////////////////////
void CJetStream::EstState(int nStep)
{
	//Here Estimation performed after the selection/resampling
	if (nStep > m_nCurStep)
		return;
	for (int i = 0; i <= nStep; i++)
	{
		MeanSample(*(m_flStateSeq + i), *(m_flStream + i));
	}
	memcpy(m_flState, *(m_flStateSeq + nStep), m_nStDim * sizeof(float));
}
void * CJetStream::GetState(int nStep) const
{
	//Return current estmated states
	if (nStep > m_nCurStep)
		return 0;
	CvMat *state = cvCreateMat(nStep + 1, m_nStDim, CV_32FC1);
	float *data = (float *)cvGetPtrAt(state, 0, 0);
	memcpy(data, *m_flStateSeq, (nStep + 1) * m_nStDim * sizeof(float));
	return (void*)state;
}




////////////////////////////////////////////////////////////////////////////////////\
//																					|
//																					|
//	IMPLEMENTATION for CJetImgData													|
//																					|
//																					|
/////////////////////////////////////////////////////////////////////////////////////
CJetImgData::CJetImgData()
{
	corner_mask = NULL;
	gradient_norm = NULL;
	gradient_orient = NULL;
}
CJetImgData::~CJetImgData()
{
	if (corner_mask != NULL)	
		cvReleaseMat((CvMat**)&corner_mask);
	if (gradient_norm != NULL)
		cvReleaseMat((CvMat**)&gradient_norm);
	if (gradient_orient != NULL)
		cvReleaseMat((CvMat**)&gradient_orient);
}
CJetImgData::CopyOf(const CJetImgData *jetImgData)
{
	if (jetImgData->gradient_norm != NULL)
		gradient_norm = (void *)cvCloneMat((CvMat*)jetImgData->gradient_norm);
	if (jetImgData->gradient_orient != NULL)
		gradient_orient = (void *)cvCloneMat((CvMat*)jetImgData->gradient_orient);
	if (jetImgData->corner_mask != NULL)
		corner_mask = (void *)cvCloneMat((CvMat*)jetImgData->corner_mask);
}

//////////////////////////////////////////////////////////////////////////////////////
//
//	SetMagOr()
//Purpose:
//	Compute the magnitude and orientation of the gradients
//Paras:
//	dX	---------------- derivative image along x
//	dY	---------------- derivative image along y
/////////////////////////////////////////////////////////////////////////////////////
void CJetImgData::SetMagOr(void * dX, void * dY)
{
	//Access to Original Image
	if (((IplImage*)dX)->depth != IPL_DEPTH_16S || 
		((IplImage*)dY)->depth != IPL_DEPTH_16S)
		return ;
	short * _dX = (short *)(((IplImage *)dX)->imageData);
	short * _dY = (short *)(((IplImage *)dY)->imageData);
	int width = ((IplImage *)dX)->width;
	int height = ((IplImage *)dX)->height;
	//Access to allocated norm and or
	if (gradient_norm != NULL)
		cvReleaseMat( (CvMat**)&gradient_norm );
	gradient_norm = cvCreateMat(height, width, CV_32FC1);
	if (gradient_orient != NULL)
		cvReleaseMat( (CvMat**)&gradient_orient );
	gradient_orient = cvCreateMat(height, width, CV_32FC1);
	int step;
	CvSize size;
	float *_norm, *_or;
	cvGetRawData(gradient_norm, (unsigned char**)&_norm, &step, &size);
	cvGetRawData(gradient_orient , (unsigned char**)&_or, &step, &size);
	short dx, dy;
	for (int i = 0; i < width * height; i++)
	{
		dx = *(_dX + i);
		dy = *(_dY + i);
		//Cal magnitude
		//can be replaced by abs(dx) + abs(dy)
		*(_norm+i) = (float)sqrt(dx * dx + dy * dy);
		//with hadeling dx is close to zero
		*(_or+i)  = (float) atan_u( (double)dx, (double)dy );
	}
	//gradient_norm = (void *) norm;
	//gradient_orient = (void *)or;
#ifdef _DEBUG
	WriteMat32F("GradNorm.dat", gradient_norm);
	WriteMat32F("GradOr.dat", gradient_orient);
#endif
}

///////////////////////////////////////////////////////////////////////////////////////
//	SetCornerMask()
//Purpose:
//	Set corner pixels as '255' 
//Paras:
//	corners	---------------- Detected corners stored in CvPoint2D32F structure
//	corner_count------------ count of the detected corners
//
///////////////////////////////////////////////////////////////////////////////////////
void CJetImgData::SetCornerMask(void *corners, int corner_count, void * szImg)
{
	CvPoint2D32f *_corners = (CvPoint2D32f *)corners;
	CvSize *_szImg = (CvSize *)szImg;
	CvMat *mask = cvCreateMat(_szImg->height, _szImg->width, CV_8UC1);
	cvSetZero(mask);

//	int step;
//	CvSize size;
//	unsigned char * pMask;
//	cvGetRawData(or , (unsigned char**)&_or, &step, &size);
	int x, y;
	int xl, yl;
	int width = _szImg->width;
	int height = _szImg->height;
	for (int i = 0; i < corner_count; i++)
	{
		x = (int)_corners[i].x;
		y = (int)_corners[i].y;
		for (xl = MAX(0,x - mask_bound); xl < MIN(width, x + mask_bound); xl++)
			for (yl = MAX(0,y - mask_bound); yl < MIN(height, y + mask_bound); yl++)
				*(cvGetPtrAt(mask, yl, xl)) = (unsigned char)mask_value;
	//	*(cvGetPtrAt(mask, y, x)) = (unsigned char)mask_value;
	
	}
	if (corner_mask != NULL)
		cvReleaseMat( (CvMat**)corner_mask );
	corner_mask = (void *)mask;
#ifdef _DEBUG
	WriteMat("corners.dat", corner_mask);
#endif

}
//////////////////////////////////////////////////////////////////////////////
//	NormalizeNorm()
//
//Purpose:
//	Normalize norm of the gradient such that the norms fall between 0 and 1
/////////////////////////////////////////////////////////////////////////////
float CJetImgData::NormalizeNorm()
{
	assert(gradient_norm != NULL);
	CvSize size;
	float *_norm;
	int step;
	cvGetRawData(gradient_norm, (unsigned char**)&_norm, &step, &size);
	//Find the maximum
	float max = 0.0;
	for (int i = 0; i < size.width * size.height; i++)
	{
		if (*(_norm + i) > max) max = *(_norm + i);
	}
	//the maximum is not zero
	if (max > 1.0e-3)
	{
		for(i = 0; i < size.width * size.height; i++)
			*(_norm + i) /= max;
	}
	return max;
}


////////////////////////////////////////////////////////////////////////////////////\
//																					|
//																					|
//	IMPLEMENTATION for CJetInit														|
//																					|
//																					|
/////////////////////////////////////////////////////////////////////////////////////
CJetInit::CJetInit(int nPtNum)
{
	assert(nPtNum <= max_order);
	//if (nPtNum <= max_order)
	//	return;
	ptNum = nPtNum;
	for (int i = 0; i < nPtNum; i++)
	{
		pt[i] = (float*) new CvPoint2D32f;
	}
}
CJetInit::~CJetInit()
{
	for (int i = 0; i < ptNum; i++)
		delete pt[i];
}
void CJetInit::SetPoints(long *point, int i)
{
	assert(i <= ptNum);
	CvPoint2D32f * curPt = (CvPoint2D32f *)pt[i];
	curPt->x = (float)*point;
	curPt->y = (float)*(point+1);
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -