今天写程序遇到了一个问题,错误如下:
代码如下:
switch(m_Radio_Contour)
{
case 0:
//Sobel算子边缘检测
Ptr<IplImage> pImage=NULL;
Ptr<IplImage> pImgSobelGray=NULL;
Ptr<IplImage> pImg8u=NULL;
Ptr<IplImage> pImg8uSmooth=NULL;
Ptr<IplImage> pImgColor=NULL;
Ptr<IplImage> pImgSobelColor=NULL;
Ptr<IplImage> pImgPlanes[3]={NULL,NULL,NULL};
//创建打开图像的副本,并开闭空间用来存储处理后的结果
pImage=cvCloneImage(img);
pImg8u=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
pImg8uSmooth=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//RGB到GRAY的图像转换
cvCvtColor(pImage,pImg8u,CV_RGB2GRAY);
//图像的高斯滤波
cvSmooth(pImg8u,pImg8uSmooth,CV_GAUSSIAN,3,0,0);
//建立位深为16位的新图像区域,因为Sobel算子要求图像的位深为16位、
pImgSobelGray=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1);
//计算一阶X方向的图像差分
cvSobel(pImg8uSmooth,pImgSobelGray,0,1,3);
cvConvertScaleAbs(pImgSobelGray,pImg8u,1,0);
cvvNamedWindow("Sobel Gray Image",1);
cvvShowImage("Sobel Gray Image",pImg8u);
………………………………
看了一下网页,是说这个case 语句可能没有被执行到(执行其他case了)导致变量没有初始化而导致接下来的错误,所以需要把变量放到switch前面声明初始化,可是我又不想把初始化放在switch前面,还有一个解决方法,在swith中定义内部变量加括号,就可以了。
switch(m_Radio_Contour)
{
case 0:
{
//Sobel算子边缘检测
Ptr<IplImage> pImage=NULL;
Ptr<IplImage> pImgSobelGray=NULL;
Ptr<IplImage> pImg8u=NULL;
Ptr<IplImage> pImg8uSmooth=NULL;
Ptr<IplImage> pImgColor=NULL;
Ptr<IplImage> pImgSobelColor=NULL;
Ptr<IplImage> pImgPlanes[3]={NULL,NULL,NULL};
//创建打开图像的副本,并开闭空间用来存储处理后的结果
pImage=cvCloneImage(img);
pImg8u=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
pImg8uSmooth=cvCreateImage(cvGetSize(img),IPL_DEPTH_8U,1);
//RGB到GRAY的图像转换
cvCvtColor(pImage,pImg8u,CV_RGB2GRAY);
//图像的高斯滤波
cvSmooth(pImg8u,pImg8uSmooth,CV_GAUSSIAN,3,0,0);
//建立位深为16位的新图像区域,因为Sobel算子要求图像的位深为16位、
pImgSobelGray=cvCreateImage(cvGetSize(pImage),IPL_DEPTH_16S,1);
//计算一阶X方向的图像差分
cvSobel(pImg8uSmooth,pImgSobelGray,0,1,3);
cvConvertScaleAbs(pImgSobelGray,pImg8u,1,0);
cvvNamedWindow("Sobel Gray Image",1);
cvvShowImage("Sobel Gray Image",pImg8u);
………………………………
}
case 1:
至此,问题解决了。