2011-09-08 28 views
0

我不使用这个代码。它应该打印簇标签然后打印质心。但“中心“矩阵的质心似乎是空的,全是零。什么是错的我的朋友?OpenCV的群集函数cvKMeans2() - 为什么当我使用中心参数

#include <iostream> 
    #include <stdio.h> 


    #include "cxcore.h" 
     #include "highgui.h" 
     using namespace cv; 


     int main(int argc, char** argv) 
     { 

     int i,j; 


       CvMat* points = cvCreateMat(5, 2, CV_32FC1); 
       CvMat* centers2 = cvCreateMat(5, 2, CV_32FC1); 
       CvMat* clusters = cvCreateMat(5, 1, CV_32SC1); 

       cvSetReal2D(points, 0, 0,1); 
        cvSetReal2D(points, 0, 1,1); 
        cvSetReal2D(points, 1, 0,2); 
        cvSetReal2D(points, 1, 1,2); 
        cvSetReal2D(points, 2, 0,6); 
         cvSetReal2D(points, 2, 1,6); 
         cvSetReal2D(points, 3, 0,5); 
         cvSetReal2D(points, 3, 1,5); 
           cvSetReal2D(points, 4, 0,10); 
          cvSetReal2D(points, 4, 1,10); 
cvKMeans2(points,3,clusters,cvTermCriteria(CV_TERMCRIT_EPS,1000,0), 
1000,0,KMEANS_RANDOM_CENTERS,centers2,0); 

for(i=0;i<5;i++) 
    printf(" %lf \n", cvGetReal2D(clusters,i, 0)); 

     for(i=0;i<5;i++){ 
       for(j=0;j<2;j++){ 
     printf("center %i %i = %f \n", i, j, cvGetReal2D(centers2,i, j)); 
    } 
    } 


      cvReleaseMat(&points); 
       cvReleaseMat(&centers2); 
        cvReleaseMat(&clusters); 
         } 

回答

3

您的代码不起作用,因为centers2尺寸更大然后请求群集的数量。然而,似乎你已经找到了OpenCV的错误 - centers2已被重新分配,但不

更改您的代码

CvMat* centers2 = cvCreateMat(3, 2, CV_32FC1); 

for(i=0;i<3;i++){ 
    for(j=0;j<2;j++){ 
     printf("center %i %i = %f \n", i, j, cvGetReal2D(centers2,i, j)); 

但更好地利用C++接口(k均值的C版是只是一​​个包装过C++实现):

float pointsdata[] = { 1,1, 2,2, 6,6, 5,5, 10,10}; 
Mat points(5, 2, CV_32F, pointsdata); 
Mat labels, centers; 

kmeans(points, 3, labels, TermCriteria(CV_TERMCRIT_EPS, 1000, 0), 1000, KMEANS_RANDOM_CENTERS, centers); 

cout << "labels: " << labels << endl; 
cout << "centers " << centers << endl; 
+0

嗯,我一直在努力了一个星期与C++ interf.but我不能明白真希工作如果使用这种类型访问myelements。如果有CvMat * points = cvCreateMat(5,2,CV_32FC1);然后我用cvSetReal2D(points,0,0,1)设置元素;并且我得到cvGetReal2D(clusters,i,0)的元素);但是当我有Mat点(5,2,CV_32F);然后我用float pointsdata [] = {1,1,2,2,6 ,6,5,5,10,10}; 垫点(5,2,CV_32F,pointsdata);但如何获得我的元素?我的意思是,如果我想有一个浮法c与第一个元素相等,那么... c = ?? c = points.at (0,0)???? – sotiraw

+0

如果您对元素访问有问题,您最好发布另一个问题,但通常您是正确的 - 'mat.at (0,0)'返回对单通道CV_32F Mat第一个元素的引用。 –

相关问题