2011-09-08 29 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第一個元素的引用。 –

相關問題