(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);