代码中调用的头文件以及部分源码在之前上传的资源中。
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++;
}
}
}