基于surf的特征点匹配C语言源码

代码中调用的头文件以及部分源码在之前上传的资源中。


bool SameSide(vect3f A, vect3f B, vect3f C, vect3f P)
{    
	vect3f AB = vector3Sub(B , A) ;    
	vect3f AC = vector3Sub(C , A) ;     
	vect3f AP = vector3Sub(P , A) ;     
	vect3f v1 = vector3Cross(AB,AC) ;    
	vect3f v2 = vector3Cross(AB,AP) ;   
	// v1 and v2 should point to the same direction    
	return (vector3Dot(v1,v2) > 0) ;
}
// Same side method
// Determine whether point P in triangle ABC
bool PointinTriangle(vect3f A, vect3f B, vect3f C, vect3f P)
{    
	return (SameSide(A, B, C, P) &&       
		SameSide(B, C, A, P) &&        
		SameSide(C, A, B, P)) ;
}
void getHaarImage(float *haarData,uint *pIntegral,int maxKeyWinSize,int w,int h)
{
	int pad = maxKeyWinSize;
	int i,j;
	float averge;
	float scale = 1.0f/(maxKeyWinSize * maxKeyWinSize);

	for(i = pad;i < h - pad;i += 1)
	{
		for(j = pad;j < w - pad;j += 1)
		{
			averge = (float)(pIntegral[i * w + j] - (pIntegral[(i - pad) * w + j] 
				+ pIntegral[i * w + j - pad] - pIntegral[(i - pad) * w + j - pad])) * scale;
			
			haarData[i * w + j] = (averge);
		}
	}
}
void imgDeviaOfHaarImage(IMAGE_t *Img0,IMAGE_t *Img1,IMAGE_t *ImgDst,int pad)
{
	int p,q,c;
	int img0Width;
	int ch = Img1->nChannels;
	float *imgData0,*imgData1,*imgData2 = (float *)ImgDst->imageData;
	
	imgData0 = (float *)Img0->imageData;
	imgData1 = (float *)Img1->imageData;
	img0Width = Img1->width;
	
	for(p = pad;p < Img1->height - pad;p++)
	{
		for(q = pad;q < Img1->width - pad;q++)
		{
			uint idx = (p * img0Width + q) * ch;
			for(c = 0;c < ch;c++)
			{
				imgData2[idx + c] = (imgData1[idx + c] - imgData0[idx + c]);
				//printf("%f\n",imgData2[idx + c] );
			}
		}
	}
}
uint getRectSum(uint *pIntegral,int x,int y,int sizex,int sizey,int imageWidth)
{
	uint sum = 0;
	sum = pIntegral[y * imageWidth + x] - 
		(pIntegral[(y - sizey) * imageWidth + x] + pIntegral[y * imageWidth + x - sizex] 
		- pIntegral[(y - sizey) * imageWidth + x - sizex]);

	return sum;
}
int getSurfKeyPoint(IMAGE_t *srcImg,uint *pIntegral,int gaussSize,int maxPointNum,vect2f *pKeyPoint,
	float sigma,int maxKeyWinSize,float maxDogPix)
{
	int i,j,p,q,m,n;
	int h = srcImg->height;
	int w = srcImg->width;
	int pad = maxKeyWinSize;
	int maxFlag = 0;
	
	float *pGaussData0,*pGaussData1,*pGaussData2,*pGaussData3,*pGaussData4;
	float *pDogData0,*pDogData1,*pDogData2,*pDogData3,*pDogData4;
	float calcMaxPix[27];
	IMAGE_t *gaussImage,*_srcImg;
	int pointIndex = 0;
	IplImage *cvImage0;

	IMAGE_t * _srcImgeCh1 = mvCreateImage(w,h,IPL_DEPTH_8U,1);
	IMAGE_t *pGaussImage0,*pGaussImage1,*pGaussImage2,*pGaussImage3,*pGaussImage4,*pGaussImage5;

	memcpy(_srcImgeCh1->imageData,srcImg->imageData,_srcImgeCh1->imageSize);
	IMAGE_t *pDogImage0 = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_32F,1);
	IMAGE_t *pDogImage1 = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_32F,1);
	IMAGE_t *pDogImage2 = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_32F,1);
	IMAGE_t *pDogImage3 = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_32F,1);
	IMAGE_t *pDogImage4 = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_32F,1);
	
	_srcImg = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_32F,1);
	gaussImage = mvCreateImage(_srcImgeCh1->width,_srcImgeCh1->height,IPL_DEPTH_8U,1);
	float *imageDataf32 = (float *)_srcImg->imageData;
	for(i = 0;i < _srcImgeCh1->imageSize;i++)
	{
		imageDataf32[i] = _srcImgeCh1->imageData[i];
	}
	//cvImage0 = mvImage2CvImage(f32gaussImage,0);
	//cvShowImage("image0",cvImage0);
	//cvWaitKey(0);
	
	memcpy(gaussImage->imageData,srcImg->imageData,_srcImgeCh1->imageSize);

	mvImageIntegrate((const IMAGE_t*)gaussImage,pIntegral);
	
	cvImage0 = mvImage2CvImage(_srcImg,0);
	
	float *featerPix = (float *)malloc(maxPointNum * sizeof(float));
	memset(featerPix,0,maxPointNum * sizeof(float));
	float *kernel32f = (float *)malloc(17 * sizeof(float));
	initGaussKernel(NULL,kernel32f,sigma * pow(2.0f,0.0f),5);
	pGaussImage0 = getGaussDownPyramidsf32(_srcImg,kernel32f,5,0);
	
	initGaussKernel(NULL,kernel32f,sigma * pow(2.0f,0.3f),7);
	pGaussImage1 = getGaussDownPyramidsf32(_srcImg,kernel32f,7,0);

	initGaussKernel(NULL,kernel32f,sigma * pow(2.0f,0.6f),9);
	pGaussImage2 = getGaussDownPyramidsf32(_srcImg,kernel32f,9,0);

	initGaussKernel(NULL,kernel32f,sigma * pow(2.0f,0.9f),11);
	pGaussImage3 = getGaussDownPyramidsf32(_srcImg,kernel32f,11,0);

	initGaussKernel(NULL,kernel32f,sigma * pow(2.0f,1.2f),13);
	pGaussImage4 = getGaussDownPyramidsf32(_srcImg,kernel32f,13,0);
	
	initGaussKernel(NULL,kernel32f,sigma * pow(2.0f,1.5f),15);
	pGaussImage5 = getGaussDownPyramidsf32(_srcImg,kernel32f,15,0);
	

	pGaussData0 = (float *)pGaussImage0->imageData;
	pGaussData1 = (float *)pGaussImage1->imageData;
	pGaussData2 = (float *)pGaussImage2->imageData;
	pGaussData3 = (float *)pGaussImage3->imageData;
	pGaussData4 = (float *)pGaussImage4->imageData;
	mvZeroImage(pDogImage0);
	mvZeroImage(pDogImage1);
	mvZeroImage(pDogImage2);
	mvZeroImage(pDogImage3);

	imgDeviaOfGauss(pGaussImage0,pGaussImage1,pDogImage0);
	
	imgDeviaOfGauss(pGaussImage1,pGaussImage2,pDogImage1);
	
	imgDeviaOfGauss(pGaussImage2,pGaussImage3,pDogImage2);
	
	imgDeviaOfGauss(pGaussImage3,pGaussImage4,pDogImage3);

	imgDeviaOfGauss(pGaussImage4,pGaussImage5,pDogImage4);
/*
	cvImage0 = mvImage2CvImage(pDogImage0,0);
	cvShowImage("image0",cvImage0);
	cvWaitKey(0);
	cvImage0 = mvImage2CvImage(pDogImage1,0);
	cvShowImage("image0",cvImage0);
	cvWaitKey(0);
	cvImage0 = mvImage2CvImage(pDogImage2,0);
	cvShowImage("image0",cvImage0);
	cvWaitKey(0);
	cvImage0 = mvImage2CvImage(pDogImage3,0);
	cvShowImage("image0",cvImage0);
	cvWaitKey(0);
*/	
	pDogData0 = (float *)pDogImage0->imageData;
	pDogData1 = (float *)pDogImage1->imageData;
	pDogData2 = (float *)pDogImage2->imageData;
	pDogData3 = (float *)pDogImage3->imageData;
	pDogData4 = (float *)pDogImage4->imageData;
	
	uchar * pTmpImageData = (uchar *)gaussImage->imageData;
	float *_pDogData[5];
	_pDogData[0] = pDogData0;
	_pDogData[1] = pDogData1;
	_pDogData[2] = pDogData2;
	_pDogData[3] = pDogData3;
	_pDogData[4] = pDogData4;
	
	for(p = 0;p < 3;p++)
	{
		float *pDogDataUp = _pDogData[p];
		float *pDogDataMid = _pDogData[p + 1];
		float *pDogDataDown = _pDogData[p + 2];

		for(i = 3 * maxKeyWinSize;i < h - 3 * maxKeyWinSize;i += 1)
		{
			for(j = 3 * maxKeyWinSize;j < w - 3 * maxKeyWinSize;j += 1)
			{
				float *pCalcMaxPix = calcMaxPix;
				float currPix =  pDogDataMid[(i - 0) * w + j - 0];
				
				*pCalcMaxPix++ = pDogDataUp[(i - 1) * w + j - 1];
				*pCalcMaxPix++ = pDogDataUp[(i - 1) * w + j - 0];
				*pCalcMaxPix++ = pDogDataUp[(i - 1) * w + j + 1];
				*pCalcMaxPix++ = pDogDataUp[(i - 0) * w + j - 1];
				*pCalcMaxPix++ = pDogDataUp[(i - 0) * w + j - 0];
				*pCalcMaxPix++ = pDogDataUp[(i - 0) * w + j + 1];
				*pCalcMaxPix++ = pDogDataUp[(i + 1) * w + j - 1];
				*pCalcMaxPix++ = pDogDataUp[(i + 1) * w + j - 0];
				*pCalcMaxPix++ = pDogDataUp[(i + 1) * w + j + 1];

				*pCalcMaxPix++ = pDogDataMid[(i - 1) * w + j - 1];
				*pCalcMaxPix++ = pDogDataMid[(i - 1) * w + j - 0];
				*pCalcMaxPix++ = pDogDataMid[(i - 1) * w + j + 1];
				*pCalcMaxPix++ = pDogDataMid[(i - 0) * w + j - 1];
				*pCalcMaxPix++ = pDogDataMid[(i - 0) * w + j + 1];
				*pCalcMaxPix++ = pDogDataMid[(i + 1) * w + j - 1];
				*pCalcMaxPix++ = pDogDataMid[(i + 1) * w + j - 0];
				*pCalcMaxPix++ = pDogDataMid[(i + 1) * w + j + 1];

				*pCalcMaxPix++ = pDogDataDown[(i - 1) * w + j - 1];
				*pCalcMaxPix++ = pDogDataDown[(i - 1) * w + j - 0];
				*pCalcMaxPix++ = pDogDataDown[(i - 1) * w + j + 1];
				*pCalcMaxPix++ = pDogDataDown[(i - 0) * w + j - 1];
				*pCalcMaxPix++ = pDogDataDown[(i - 0) * w + j - 0];
				*pCalcMaxPix++ = pDogDataDown[(i - 0) * w + j + 1];
				*pCalcMaxPix++ = pDogDataDown[(i + 1) * w + j - 1];
				*pCalcMaxPix++ = pDogDataDown[(i + 1) * w + j - 0];
				*pCalcMaxPix++ = pDogDataDown[(i + 1) * w + j + 1];
				maxFlag = 0;
				for(q = 0;q < 26;q++)
				{
					if(currPix < calcMaxPix[q])
					{
						maxFlag = 1;
						q = 26;
					}
				}
				if(currPix < maxDogPix)
					maxFlag = 1;
				
				if(maxFlag == 0)
				{
					if(pointIndex < maxPointNum)
					{
						maxFlag = 0;
						
						for(m = 0;m < pointIndex;m++)
						{
							if(currPix < featerPix[m] && currPix > featerPix[m + 1])
							{
								for(n = pointIndex;n > m;n--)
								{
									featerPix[n + 1] = featerPix[n];
									pKeyPoint[n + 1].x = pKeyPoint[n].x;
									pKeyPoint[n + 1].y = pKeyPoint[n].y;
								}
								featerPix[m + 1] = currPix;
								pKeyPoint[m + 1].x = (float)(j);
								pKeyPoint[m + 1].y = (float)(i);
								maxFlag = 1;
							}
						}
						if(maxFlag == 0)
						{
							for(n = pointIndex - 1;n >= 0;n--)
							{
								featerPix[n + 1] = featerPix[n];
								pKeyPoint[n + 1].x = pKeyPoint[n].x;
								pKeyPoint[n + 1].y = pKeyPoint[n].y;
							}
							featerPix[0] = currPix;
							pKeyPoint[0].x = (float)(j);
							pKeyPoint[0].y = (float)(i);
						}

						pointIndex++;
						
					}
					
					
				}
			}
		}
	}
	/*
	for(m = 0;m < pointIndex;m++)
	{
		printf("%d,%f,%f,%f\n",m,featerPix[m],pKeyPoint[m].x,pKeyPoint[m].y);
		point.x = pKeyPoint[m].x;
		point.y = pKeyPoint[m].y;
		cvCircle(cvImage0,point,8,cvScalar(255u,255u,255u));
		cvShowImage("image0",cvImage0);
		cvWaitKey(0);
	}
	*/
	//cvShowImage("image0",cvImage0);
	//cvWaitKey(0);
	return pointIndex;
	
}
int getSurfKeyPointFeater(vect2f *pKeyPoint,IMAGE_t *gaussImage,uint *pIntegral,
	int pointNum,SURF_KEYPOINTS_t *keyPointInf)
{
	int i,j,p,q,m,n;
	int pad;
	int h = gaussImage->height;
	int w = gaussImage->width;
	int pointIndex = 0;

	CvPoint point;
	double x00,x01,x10,x11;

	int row,col;
	float c_rot,r_rot,r_dot,c_dot;
	float pixVal;
	
	#define SIDE_SIZE			8
	uchar * pTmpImageData = (uchar *)gaussImage->imageData;
	vect2f *pointAllFan = (vect2f *)malloc(81 * sizeof(vect2f));
	vect2f *pointAllRect = (vect2f *)malloc(1024 * sizeof(vect2f));
	int angPointNum = 0;
	vect3f vertexTmp;
	vect3f vertex[3];
	vertex[0].x = 0;
	vertex[0].y = 0;
	vertex[1].x = SIDE_SIZE;
	vertex[1].y = 0;
	vertex[2].x = vertex[1].x * cos(PI/3) - vertex[1].y * sin(PI/3);
	vertex[2].y = vertex[1].x * sin(PI/3) + vertex[1].y * cos(PI/3);
	vertex[0].z = 0;
	vertex[1].z = 0;
	vertex[2].z = 0;
	vertexTmp.z = 0;
	for(p = 0;p <= SIDE_SIZE;p++)
	{
		for(q = 0;q <= SIDE_SIZE;q++)
		{
			vertexTmp.x = (float)q;
			vertexTmp.y = (float)p;
			if(PointinTriangle(vertex[0],vertex[1],vertex[2],vertexTmp))
			{
				pointAllFan[angPointNum].x = (float)q;
				pointAllFan[angPointNum].y = (float)p;
				angPointNum++;
			}
		}
		
	}	
	#define SURF_FEATER_RECT			8
	#define SURF_FEATER_WIN		(SURF_FEATER_RECT * 4)
	#define SURF_FEATER_HAlFWIN		(SURF_FEATER_WIN >> 1)
	int kpIdx = 0;
	float sumx0 = 0.0f,sumx1 = 0.0f,sumy0 = 0.0f,sumy1 = 0.0f;
	for(i = 0;i < pointNum;i++)
	{
		
		float haarVerHaar = 0.0f,haarHolHaar = 0.0f,maxHaarVal = 0.0f,maxHaarAng;
		float x = pKeyPoint[i].x;
		float y = pKeyPoint[i].y;
		vect2f *pointRotateFan = (vect2f *)malloc(SURF_FEATER_RECT * SURF_FEATER_RECT * sizeof(vect2f));
		vect2f *pointRotateRect = (vect2f *)malloc(SURF_FEATER_WIN * SURF_FEATER_WIN * sizeof(vect2f));
		float pixRotate[SURF_FEATER_WIN * SURF_FEATER_WIN];
		vect2i pixPos;
		float upPix,downPix,leftPix,rightPix;
		
		float rotateAng = ((2 * PI)/72.0f);
		float cosRotate = cos(rotateAng);
		float sinRotate = sin(rotateAng);
		
		memcpy((char *)pointRotateFan,(char *)pointAllFan,angPointNum * sizeof(vect2f));
		memcpy((char *)pointRotateRect,(char *)pointAllRect,81 * sizeof(vect2f));

		pad = SURF_FEATER_RECT;
		for(j = 0;j < 72;j++)
		{
			haarHolHaar = 0.0f;
			haarVerHaar = 0.0f;
			cosRotate = cos((float)j * rotateAng);
			sinRotate = sin((float)j * rotateAng);
			for(p = 0;p < angPointNum;p++)
			{
				vertexTmp.x = pointAllFan[p].x;
				vertexTmp.y = pointAllFan[p].y;
				pointRotateFan[p].x = vertexTmp.x * cosRotate - vertexTmp.y * sinRotate;
				pointRotateFan[p].y = vertexTmp.x * sinRotate + vertexTmp.y * cosRotate;
				pixPos.x = mvRound(x + pointRotateFan[p].x);
				pixPos.y = mvRound(y + pointRotateFan[p].y);
				upPix =  (float)getRectSum(pIntegral,pixPos.x + pad,pixPos.y,2 * pad,pad,w);
				downPix = (float)getRectSum(pIntegral,pixPos.x + pad,pixPos.y + pad,2 * pad,pad,w);
				leftPix =  (float)getRectSum(pIntegral,pixPos.x,pixPos.y + pad,pad,2 * pad,w);
				rightPix =  (float)getRectSum(pIntegral,pixPos.x + pad,pixPos.y + pad,2 * pad,pad,w);;
	
				haarHolHaar += 0.5f * fabs(upPix - downPix)/(pad * pad);
				haarVerHaar += 0.5f * fabs(leftPix - rightPix)/(pad * pad);
			}
			if(maxHaarVal < haarHolHaar)
			{
				maxHaarVal = haarHolHaar;
				maxHaarAng = (float)j * rotateAng;
			}
			if(maxHaarVal < haarVerHaar)
			{
				maxHaarVal = haarVerHaar;
				maxHaarAng = (float)j * rotateAng;
			}
			
		}

		point.x = (int)pKeyPoint[i].x;
		point.y = (int)pKeyPoint[i].y;
		//cvCircle(cvImage0,point,8,cvScalar(255u,255u,255u));
		//printf("%f %f\n",maxHaarVal,maxHaarAng/PI * 180.0f);
		//cvShowImage("image0",cvImage0);
		//cvWaitKey(0);
		keyPointInf[kpIdx].x = pKeyPoint[i].x;
		keyPointInf[kpIdx].y = pKeyPoint[i].y;
		keyPointInf[kpIdx].haarVal = maxHaarVal;
		keyPointInf[kpIdx].haarAng = maxHaarAng;
		
		
	#if 1	
		cosRotate = cos(maxHaarAng);
		sinRotate = sin(maxHaarAng);
		
		
		for(p = -SURF_FEATER_HAlFWIN;p < SURF_FEATER_HAlFWIN;p++)
		{
			for(q = -SURF_FEATER_HAlFWIN;q < SURF_FEATER_HAlFWIN;q++)
			{
				pointAllRect[(p + SURF_FEATER_HAlFWIN) * SURF_FEATER_WIN + q + SURF_FEATER_HAlFWIN].x = (float)q;
				pointAllRect[(p + SURF_FEATER_HAlFWIN) * SURF_FEATER_WIN + q + SURF_FEATER_HAlFWIN].y = (float)p;
			}
		}
		int ix = (int)x;
		int iy = (int)y;
		for(p = 0;p < SURF_FEATER_WIN;p++)
		{
			for(q = 0;q < SURF_FEATER_WIN;q++)
			{
				c_rot = ( (float)q * cosRotate - (float)p * sinRotate );  
	            r_rot = ( (float)q * sinRotate + (float)p * cosRotate );  

				row = (int)r_rot;
				col = (int)c_rot;
				x00 = pTmpImageData[w * (iy + row + 1) + col + ix + 0];
				x01 = pTmpImageData[w * (iy + row + 1) + col + ix + 1];
				x10 = pTmpImageData[w * (iy + row) + col + ix + 0];
				x11 = pTmpImageData[w * (iy + row) + col + ix + 1];

				r_dot = fabs(r_rot - row);
				c_dot = fabs(c_rot - col);
				
				pixVal = (float)x00 * (1.0f - c_dot) * (1.0f - r_dot) + (float)x01 * (1.0f - c_dot) * r_dot 
					+ (float)x11 * c_dot * r_dot + (float)x10 * c_dot * (1.0f - r_dot);
				pixRotate[p * SURF_FEATER_WIN + q] = pixVal;
			}
		}
		for(p = 0;p < 4;p++)
		{
			for(q = 0;q < 4;q++)
			{
				sumx0 = 0.0f;
				sumx1 = 0.0f;
				sumy0 = 0.0f;
				sumy1 = 0.0f;
				int idx = (p * SURF_FEATER_RECT) * SURF_FEATER_WIN + q  * SURF_FEATER_RECT;
				float *pTmpPix = &pixRotate[idx];
				for(m = 0;m < SURF_FEATER_RECT;m++)
				{
					for(n = 0;n < SURF_FEATER_RECT >> 1;n++)
					{
						sumx0 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				for(m = 0;m < SURF_FEATER_RECT;m++)
				{
					for(n = SURF_FEATER_RECT >> 1;n < SURF_FEATER_RECT;n++)
					{
						sumx1 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				for(m = 0;m < SURF_FEATER_RECT >> 1;m++)
				{
					for(n = 0;n < SURF_FEATER_RECT;n++)
					{
						sumy0 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				for(m = SURF_FEATER_RECT >> 1;m < SURF_FEATER_RECT;m++)
				{
					for(n = 0;n < SURF_FEATER_RECT;n++)
					{
						sumy1 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}

				keyPointInf[kpIdx].description[p * 32 + q * 8 + 0] = sumx0 - sumx1;
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 1] = fabs(sumx0 - sumx1);
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 2] = sumy0 - sumy1;
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 3] = fabs(sumy0 - sumy1);

				sumx0 = 0.0f;
				sumx1 = 0.0f;
				sumy0 = 0.0f;
				sumy1 = 0.0f;

				/* 135 degree */
				/* ----*/
				/*\   |
				   \  |
				    \ |
				     \| */
				        
				for(m = 0;m < SURF_FEATER_RECT;m++)
				{
					for(n = m;n < SURF_FEATER_RECT;n++)
					{
						sumx0 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				/*|\         
				  | \      
				  |   \   
				  |----- */
				for(m = 0;m < SURF_FEATER_RECT;m++)
				{
					for(n = 0;n <= m;n++)
					{
						sumx1 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				/* 45 degree */
				/* --------*/
				/*|      /
				  |    /
				  |  / 
				  |/ */
				for(m = 0;m < SURF_FEATER_RECT;m++)
				{
					for(n = 0;n <= SURF_FEATER_RECT - m;n++)
					{
						sumy0 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				/*   /|
				    / |
				   /  |
				  /---- */
				for(m = 0;m < SURF_FEATER_RECT;m++)
				{
					for(n = SURF_FEATER_RECT - m - 1;n < SURF_FEATER_RECT;n++)
					{
						sumy1 += (pTmpPix[m * SURF_FEATER_WIN + n]);
					}
				}
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 4] = sumx0 - sumx1;
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 5] = fabs(sumx0 - sumx1);
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 6] = sumy0 - sumy1;
				keyPointInf[kpIdx].description[p * 32 + q * 8 + 7] = fabs(sumy0 - sumy1);
				
			}
		}
		#endif
		
		
		float *descF32 = keyPointInf[kpIdx].description;

		float max = -10000000.0f;
		float min = 10000000.0f;
		
		for(m = 0;m < 128;m++)
		{
			if(descF32[m] < min)
				min = descF32[m];
			if(descF32[m] > max)
				max = descF32[m];
		}
		float scale  = (1.0f/(max - min));
		for(m = 0;m < 128;m++)
		{
			descF32[m] = (descF32[m] - min) * scale;
		}
		
		/*
		for(m = 0;m < 8;m++)
		{
			for(n = 0;n < 8;n++)
			{
				printf("%f ",descF32[m * 8 + n]);
			}
			printf("\n");
		}
		printf("\n");
		*/
		kpIdx++;

	}
	return kpIdx;
}
void surfTest(void)
{
	int i,j,k,idx = 0;
	CvPoint point0,point1;
	vect2f  image_points0[2000];
	vect2f  image_points1[2000];
	IplImage *cvImage0,*cvImageDst;
	int pointNum0,pointNum1,matchNum = 0;

	
	IMAGE_t * testImage0 = mvLoadImage("D:/vc++/imagelib/imagelibtest/image/5.bmp",3);
	IMAGE_t * reSizeImage0 = mvCreateImage(640,480,8,testImage0->nChannels);
	mvImageResize(testImage0,reSizeImage0);
	SURF_KEYPOINTS_t *keyPointFeater0 = (SURF_KEYPOINTS_t *)malloc(2000 * sizeof(SURF_KEYPOINTS_t));
	uint *pIntegral = (uint *)malloc(reSizeImage0->width * reSizeImage0->height * sizeof(uint));
	IMAGE_t *srcImgeCh1 = mvCreateImage(reSizeImage0->width,reSizeImage0->height,IPL_DEPTH_8U,1);
	mvImageBGR2Gray(reSizeImage0,srcImgeCh1);
	mvImageU8Norm(srcImgeCh1->imageData,srcImgeCh1->width,srcImgeCh1->height);	
	pointNum0 = getSurfKeyPoint(srcImgeCh1,pIntegral,7,2000,image_points0,1.5,16,4.0);
	pointNum0 = getSurfKeyPointFeater(image_points0,srcImgeCh1,pIntegral,pointNum0,keyPointFeater0);
	
	IMAGE_t * testImage1 = mvLoadImage("D:/vc++/imagelib/imagelibtest/image/6.bmp",3);
	IMAGE_t * reSizeImage1 = mvCreateImage(640,480,8,testImage0->nChannels);
	mvImageResize(testImage1,reSizeImage1);
	SURF_KEYPOINTS_t *keyPointFeater1 = (SURF_KEYPOINTS_t *)malloc(2000 * sizeof(SURF_KEYPOINTS_t));
	IMAGE_t *dstImgeCh1 = mvCreateImage(reSizeImage0->width,reSizeImage0->height,IPL_DEPTH_8U,1);
	mvImageBGR2Gray(reSizeImage1,dstImgeCh1);
	mvImageU8Norm(dstImgeCh1->imageData,dstImgeCh1->width,dstImgeCh1->height);
	pointNum1 = getSurfKeyPoint(dstImgeCh1,pIntegral,7,2000,image_points1,1.5,16,4.0);
	pointNum1 = getSurfKeyPointFeater(image_points1,dstImgeCh1,pIntegral,pointNum1,keyPointFeater1);
		

	cvImage0 = mvImage2CvImage(srcImgeCh1,0);
	cvImageDst = mvImage2CvImage(dstImgeCh1,0);
	
	for(i = 0;i < pointNum0;i++)
	{
		image_points0[i].x = keyPointFeater0[i].x;
		image_points0[i].y = keyPointFeater0[i].y;
		point0.x = mvRound(image_points0[i].x);
		point0.y = mvRound(image_points0[i].y);
		cvCircle(cvImage0,point0,10,cvScalar(255u,255u,255u));
	}
	for(i = 0;i < pointNum1;i++)
	{
		image_points1[i].x = keyPointFeater1[i].x;
		image_points1[i].y = keyPointFeater1[i].y;
		point1.x = mvRound(image_points1[i].x);
		point1.y = mvRound(image_points1[i].y);
		cvCircle(cvImageDst,point1,10,cvScalar(255u,255u,255u));
	}
	cvShowImage("image0",cvImage0);
	cvShowImage("image1",cvImageDst);
	cvWaitKey(0);
	

	for(i = 0;i < pointNum0;i++)
	{
		float min = 10000000.0f;

		for(k = 0;k < pointNum1;k++)
		{
			float sum = 0.0f;
			float *desc0 = &keyPointFeater0[i].description[0];
			float *desc1 = &keyPointFeater1[k].description[0];
			for(j = 0;j < 128;j++)
			{
				sum += (desc0[j] - desc1[j]) * (desc0[j] - desc1[j]);
			}
			
			if(sum < min)
			{
				idx = k;
				min = sum;
			}
		}

		float *desc0 = &keyPointFeater0[i].description[0];
		float *desc1 = &keyPointFeater1[idx].description[0];
		if(fabs(min) < 5.0f)
		{
			/*
			for(g = 0;g < 4;g++)
			{
				for(h = 0;h < 4;h++)
				{
					for(p = 0;p < 8;p++)
					{
						printf("%f ",fabs(desc0[g * 32 + h * 8 + p] - desc1[g * 32 + h * 8 + p]));
					}
					printf("\n");
				}
			}
			*/
			printf("\n");
			image_points0[matchNum].x = keyPointFeater0[i].x;
			image_points0[matchNum].y = keyPointFeater0[i].y;
			
			image_points1[matchNum].x = keyPointFeater1[idx].x;
			image_points1[matchNum].y = keyPointFeater1[idx].y;
			printf("%d %f %f %f %f %f\n",matchNum,min,image_points0[matchNum].x,image_points0[matchNum].y,image_points1[matchNum].x,image_points1[matchNum].y);
			printf("%f %f\n",image_points1[matchNum].x - image_points0[matchNum].x,image_points1[matchNum].y - image_points0[matchNum].y);
			cvImage0 = mvImage2CvImage(srcImgeCh1,0);
			cvImageDst = mvImage2CvImage(dstImgeCh1,0);
			
			point0.x = mvRound(image_points0[matchNum].x);
			point0.y = mvRound(image_points0[matchNum].y);
			cvCircle(cvImage0,point0,10,cvScalar(255u,255u,255u));
			
			point1.x = mvRound(image_points1[matchNum].x);
			point1.y = mvRound(image_points1[matchNum].y);
			cvCircle(cvImageDst,point1,10,cvScalar(255u,255u,255u));
			cvShowImage("image0",cvImage0);
			cvShowImage("image1",cvImageDst);
			cvWaitKey(0);

			cvReleaseImage(&cvImage0);
			cvReleaseImage(&cvImageDst);
			//printf("%f %f\n",src[matchNum].x,src[matchNum].y);
			//printf("%f %f\n",dst[matchNum].x,dst[matchNum].y);
			matchNum++;
		}
	}
}

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值