最近在研究一个手势识别的程序,程序的第一步是肤色检测,由于我所研究的代码定义的图像的类型是IplImage类型,而我更喜欢使用Mat类型,所以我决定自己写一个肤色检测的程序,用Mat类型的图像。然而就是这样一个简单的肤色检测的程序,我写了将近两天。今天研究了很长时间,发现一些函数的形参类型都是Mat类型,在各种报错之后,我原本准备放弃。然而一不小心搜到了一个能形参是mat类型的可以分割多通道图像的函数,于是又开始写了起来,可是写着写着我发现我连打开摄像头的程序都调不出来了。找到各种资料对比之后,我才终于调通了打开摄像头的图像。这虽然是一个很小很小的程序,但是今天下午我还是发现了一些问题,积累了一些经验。现在记录下来。
1.在遇到形参与实参类型不匹配时,要想到强制类型转换。比如今天遇到的 CvArr*类型转换成Mat 类型需要用 Mat image; CvArr * s=(Cvarr *)ℑ
2.一些作用相同,但是形参类型不同的函数:
Mat IplImage
图像的初始化 M.create(size,type); M= cvCreateImage(size,Depth,channals);
多通道图像的分离 split(src,vector<Mat>) cvSplit(img_YCrCb,Y_channel,Cr_channel,Cb_channel,0);(原图,各个通道的图像)
(其中vector中盛放着各个通道的图像,可以用遍历的方法(at函数)来读取各个通道的图像)
3.如果出现摄像头打不开等问题,可能是没写waitkey(),或者waitkey()写的出问题。