opencv图像匹配出了点问题,源码发上来高手帮忙调调,谢谢!!

liweiallen2001 2012-03-01 04:52:45
程序已经通过,用lena那个图片没问题,用car7那个图片就会弹错,我觉得有可能是图片的大小问题,高手帮忙调调,谢谢!!
//#include "stdafx.h"
#include "stdio.h"
#include "cv.h"
#include "highgui.h"

#define max_corners 100

int main( int argc, char* argv[] )
{
int cornerCount_exp = max_corners,cornerCount_src = max_corners;
float element_exp,element_src;
CvPoint2D32f corners_exp[max_corners],corners_src[max_corners];
double qualityLevel = 0.12;
double minDistance = 20;
IplImage *Img_exp = cvLoadImage("car.jpg", 1), *Img_gray_exp = 0, *Img_gray_src = 0,
*Img_exp_corners1 = 0, *Img_exp_corners2 = 0, *Img_src_corners1 = 0, *Img_src_corners2 = 0;
IplImage *Img_src = cvLoadImage("car.jpg",1);
int i,j,k,flag = 0,count = 0;
int xx,yy;
float mapping_rows = 0.0,mapping_cols = 0.0;
// CvScalar color = CV_RGB(255,0,0);
CvMat *Mat_exp = cvCreateMat(Img_exp -> height , Img_exp -> width , CV_32FC1);
CvMat *Mat_src = cvCreateMat(Img_src -> height , Img_src -> width , CV_32FC1);


CvMat *Mat_sparse = cvCreateMat(Img_exp ->height , Img_exp -> width , CV_32FC1);///记录模板图像中角点的坐标
CvScalar scalar;
for(i = 0;i < 4;i++)
scalar.val[i] = -1.0;
cvSet(Mat_sparse,scalar,NULL);



// cvNamedWindow( "image", CV_WINDOW_AUTOSIZE ); //创建显示窗口


Img_gray_exp = cvCreateImage(cvGetSize(Img_exp), IPL_DEPTH_8U, 1); //将原图灰度化
Img_gray_src = cvCreateImage(cvGetSize(Img_src), IPL_DEPTH_8U, 1);
cvCvtColor(Img_exp, Img_gray_exp, CV_BGR2GRAY);
cvCvtColor(Img_src, Img_gray_src, CV_BGR2GRAY);
cvConvert(Img_gray_exp,Mat_exp);
cvConvert(Img_gray_src,Mat_src);

// printf("<%d,%d>\n",grayImage -> height , grayImage -> width);



Img_exp_corners1 = cvCreateImage(cvGetSize(Img_exp), IPL_DEPTH_32F, 1); //创建连个与原图大小相同的临时图像
Img_exp_corners2 = cvCreateImage(cvGetSize(Img_exp),IPL_DEPTH_32F, 1); //角点检测
Img_src_corners1 = cvCreateImage(cvGetSize(Img_src),IPL_DEPTH_32F, 1);
Img_src_corners2 = cvCreateImage(cvGetSize(Img_src),IPL_DEPTH_32F, 1);


///////////////把模板图像角点的像素值输入到cornerstone_exp数组内///////////////////
cvGoodFeaturesToTrack (Img_gray_exp, Img_exp_corners1, Img_exp_corners2, corners_exp, &cornerCount_exp, qualityLevel, minDistance, NULL);
// printf("num corners found: %d\n", cornerCount); //在原图中将角点标记出来
// printf("%d", CV_IMAGE_ELEM(Img_gray_exp,unsigned char,1422,301));

if(cornerCount_exp>0)
{
for (i=0; i <cornerCount_exp;++i)

{
*((float *)CV_MAT_ELEM_PTR(*Mat_sparse,(int)corners_exp[i].x,(int)corners_exp[i].y)) =
CV_IMAGE_ELEM(Img_gray_exp,unsigned char,(int)corners_exp[i].x,(int)corners_exp[i].y);
element_exp = ((float *)(Mat_sparse -> data.ptr + Mat_sparse -> step * (int)corners_exp[i].x))[(int)corners_exp[i].y];
printf("%d:%f---<%f,%f>---",i,element_exp,corners_exp[i].x,corners_exp[i].y);
// printf("%d<%d,%d>:",i,(int)corners_exp[i].x,(int)corners_exp[i].y);
// element_exp = ((float *)(Mat_exp -> data.ptr + Mat_exp -> step * (int)corners_exp[i].x))[(int)corners_exp[i].y];
// element = CV_MAT_ELEM(*Mat_exp,float,(int)corners_exp[i].x,(int)corners_exp[i].y);
// element = cvmGet(Mat_exp,(int)corners_exp[i].x,(int)corners_exp[i].y);
// printf("%f ",element);
// element = 0;
//cvCircle(srcImage, cvPoint((int)(corners[i].x), (int)(corners[i].y)), 6,
// color, 2, CV_AA, 0);
}
}






////////////////src与exp的角点像素对比////////////
cvGoodFeaturesToTrack (Img_gray_src,Img_src_corners1,Img_src_corners2,corners_src,&cornerCount_src,qualityLevel,minDistance,NULL);
if(cornerCount_src>0)
{

//mapping_rows = ((int)corners_src[i].x / (int)Img_src -> width) * (int)Img_exp -> width;
//mapping_rows = (int)corners_src[i].x;

for(i = 0; i <cornerCount_src;i++)
{
printf("---<%f,%f>---",corners_src[i].x,corners_src[i].y);
mapping_rows = ((float)Img_src -> width / (float)Img_exp -> width ) * corners_src[i].x;
mapping_cols = ((float)Img_src -> height / (float)Img_exp -> height ) * corners_src[i].y;
element_src = ((float *)(Mat_src -> data.ptr + Mat_src -> step * (int)corners_exp[i].x))[(int)corners_exp[i].y];
printf("\n%f",element_src);
xx = (int)mapping_rows - 5;//xx\yy是映射后的区域
yy = (int)mapping_cols - 5;

if (xx<0)
xx = 0;
if(yy<0)
yy = 0;
printf("<%d,%d> ",xx,yy);

for(j = xx;j < mapping_rows + 5 ; j++ )
{
for(k = yy;k < mapping_cols + 5 ; k++)
{
element_exp = ((float *)(Mat_sparse -> data.ptr + Mat_sparse -> step * j))[k];//////////设置稀疏矩阵还是有意义的,都是角点做比对!
//printf("element_exp is:%f ",element_exp);
while(element_exp != -1)
{
printf("%f",element_exp);
if((unsigned int)(element_exp - element_src) <= 10)
{
count ++;
printf("count is:%d ",count);
}
break;

if(count > 15)
break;
}
}
if(count > 15)
break;
}
if(count > 15)
break;
}
}

if(count > 15)
printf("yes");








cvShowImage( "image", Img_exp );
// cvReleaseImage(&srcImage);
// cvReleaseImage(&grayImage);
// cvReleaseImage(&corners1);
// cvReleaseImage(&corners2);
cvWaitKey(0);
return 0;
}












/////////////////遍历SRC角点坐标映射后的EXP的区域内角点/////////////
/* for(int xx = mapping_rows - 15;xx <= mapping_rows + 15;xx++)
for(int yy = mapping_cols - 15;yy <= mapping_cols + 15;yy++)
{

while((unsigned int)element_src - CV_MAT_ELEM((int)corners_exp[xx].x,(int)corners_exp[yy].y) < 10)//SRC的角点依次与在EXP中对应区域内角点做比较
{*/
...全文
209 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

4,445

社区成员

发帖
与我相关
我的任务
社区描述
图形图像/机器视觉
社区管理员
  • 机器视觉
  • 迪菲赫尔曼
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧