您的位置:首页 > 其它

关于使用cvSobel 和 cvCanny 内存问题

2012-01-17 16:17 387 查看
(1)关于cvSobel
IplImage *dstimg=cvCreateImage(isize,IPL_DEPTH_8U,1);
cvSobel(srcgray,dstimg,0,1,7);


cvSobel出错,精细看看未曾问题啊。其实,这里是问题的,因为以Sobel措施求完导数后会有负值,还有会大于255的值而你建的Sobel的图像是 IPL_DEPTH_8U,也即便8位无符号数,因而Sobel发生的图像位数不够,要16位有符号的,也即便 IPL_DEPTH_16S。cvSobel函数最后的参数选择也很重要
 

(2)关于cvCanny
IplImage *dstimg=cvCreateImage(isize,IPL_DEPTH_8U,1);
cvCanny(srcgray,dstimg,30,100,3);
 

cvCanny出错,发现是这样的,源图像srcgray是由jpg(完全rgb色)转换得到的的灰度图cvCanny就会出问题,而如果是由bmp转换得到的的灰度图cvCanny就能得到正确结果。问题还没解决。。。。。如何解决??

……

上面的问题都解决了,jpg和bmp都可以解决,是编码不够小心,前面一些加载参数设置不正确,下面附可执行正确代码的函数主体

wchar_t _curPath[MAX_PATH];
GetCurrentDirectory(MAX_PATH,_curPath);
int len=wcslen(_curPath);
char *curPath=new char[MAX_PATH];
curPath[len]='\0';
WideCharToMultiByte(CP_ACP,0,_curPath,len,curPath,len,0,0);
strcat(curPath,"\\images\\1.jpg");

//
cvNamedWindow("srcimg",1);
cvNamedWindow("srcgray",1);
cvNamedWindow("sobel dstimg",1);

//
IplImage *srcimg=cvLoadImage(curPath,1);

CvSize isize=cvGetSize(srcimg);

IplImage *srcgray=cvCreateImage(isize,IPL_DEPTH_8U,1);

cvCvtColor(srcimg,srcgray,CV_RGB2GRAY);

IplImage *dstimg=cvCreateImage(isize,IPL_DEPTH_8U,1);

//执行canny变换
cvCanny(srcgray,dstimg,50,150,3);

char *dstdata=dstimg->imageData;
cout<<strlen(dstimg->imageData)<<endl;

//
cvShowImage("srcimg",srcimg);
cvShowImage("srcgray",srcgray);
cvShowImage("sobel dstimg",dstimg);
cvWaitKey(0);


 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  path