OpenCV的群集函数cvKMeans2()-为什么在使用centers参数时不起作用 [英] OpenCV's clustering function cvKMeans2() - why doesnt work when i use the centers parameter

查看:134
本文介绍了OpenCV的群集函数cvKMeans2()-为什么在使用centers参数时不起作用的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我使用此代码.它应该先打印簇标签,然后再打印质心.但是带有中心点的中心"矩阵似乎是空的,到处都是零.我的朋友们怎么了?

i use this code. its should print the clusters labels an then the centroids. but the 'center"matrix with the centriod seems to be empty,full of zeros. what is wrong my friends?

 #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);
                      }

推荐答案

您的代码不起作用,因为centers2的大小大于请求的簇数.但是,似乎您已经发现OpenCV错误-centers2必须重新分配,但不是.

Your code does not work because size of centers2 is bigger then number of requested clusters. However it seems that you have found an OpenCV bug - centers2 has to be reallocated but is does not.

将代码更改为

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 ++接口(kmeans的C版本只是C ++实现的包装):

But better use C++ interface (C version of kmeans is just a wrapper over C++ implementation):

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;

这篇关于OpenCV的群集函数cvKMeans2()-为什么在使用centers参数时不起作用的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆