学习新玩意儿的事情,必须要懂人家的规矩,openCV就有自己的规范和数据结构的,要用人家的那些库函数,必须要把传入参数的基础结构搞搞明白,比如RGBA,人家opencv已经说了,用CvScalar,就别自己去搞个 double val[4]了,不然传进去,都是个问题。
这里的type是很关键的,如果传入是一个CV_8UC1,代表每个元素是1个8位的uchar,如果传入的是一个CV_8UC2,代表每个元素是2个8位的uchar
虽然宽高还是三列二行,但是实际上,存了3列*2行*2uchar,总计12个uchar,也即里面的step是12
这不就是cvkmeans用不来嘛,搞了整整2天,现在算是搞好了,还真是严格啊,2个地方没搞清楚:
CvMat* cm = cvCreateMat(20,3,CV_32FC1); //这里如果是写CV_8UC1,死活通不过程序,必须要32位的,才肯给你干活
CvMat* label = cvCreateMat(20,1,CV_32SC1);//这里如果不是这样的类型,也死活不给干活,我真是晕死了
CvMat* centers = cvCreateMat(3,3,CV_32FC1);//这里的第一个参数必须是几个类别就设置几个,多了也不行,真是服了,多了干他啥事情,把数据塞进去就得了嘛,第二个参数自然要和cm的列是一致的,其实就是维度,算欧拉距离用的,第三个参数也要和cm的数据类型一致
cvKMeans2(cm, 3, label, TermCriteria( CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0),1, 0, 0, centers);
这样子才总算运行成功,这些规范,网上就是没找到有人提过,不过我就是那opencv做实验用用的,到时候还是要转成我们的项目语言的。