7

この質問は opencv に固有のものです: opencv のドキュメントに記載されている kmeans の例には、2 チャネルのマ​​トリックス (特徴ベクトルの各次元に 1 つのチャネル) があります。しかし、他の例のいくつかは、サンプルごとに1行の列に沿った機能を持つ1チャネルマトリックスであるべきだと言っているようです。正しいのはどれか。

5次元の特徴ベクトルがある場合、使用する入力マトリックスは次のとおりです。これは次のとおりです。

cv::Mat inputSamples(numSamples, 1, CV32FC(numFeatures))

またはこれ:

cv::Mat inputSamples(numSamples, numFeatures, CV_32F)
4

2 に答える 2

31

正解はcv::Mat inputSamples(numSamples, numFeatures, CV_32F)です。についてのOpenCVドキュメントにkmeans は次のように書かれています:

samples – 入力サンプルの浮動小数点行列、サンプルごとに 1 行

したがって、他のオプションのように n 次元浮動小数点数の浮動小数点ベクトルではありません。そのような行動を示唆する例はどれですか?

これは、kmeans の使用方法を示す小さな例です。画像のピクセルをクラスター化し、結果を表示します。

#include "opencv2/imgproc/imgproc.hpp"
#include "opencv2/highgui/highgui.hpp"

using namespace cv;

int main( int argc, char** argv )
{
  Mat src = imread( argv[1], 1 );
  Mat samples(src.rows * src.cols, 3, CV_32F);
  for( int y = 0; y < src.rows; y++ )
    for( int x = 0; x < src.cols; x++ )
      for( int z = 0; z < 3; z++)
        samples.at<float>(y + x*src.rows, z) = src.at<Vec3b>(y,x)[z];


  int clusterCount = 15;
  Mat labels;
  int attempts = 5;
  Mat centers;
  kmeans(samples, clusterCount, labels, TermCriteria(CV_TERMCRIT_ITER|CV_TERMCRIT_EPS, 10000, 0.0001), attempts, KMEANS_PP_CENTERS, centers );


  Mat new_image( src.size(), src.type() );
  for( int y = 0; y < src.rows; y++ )
    for( int x = 0; x < src.cols; x++ )
    { 
      int cluster_idx = labels.at<int>(y + x*src.rows,0);
      new_image.at<Vec3b>(y,x)[0] = centers.at<float>(cluster_idx, 0);
      new_image.at<Vec3b>(y,x)[1] = centers.at<float>(cluster_idx, 1);
      new_image.at<Vec3b>(y,x)[2] = centers.at<float>(cluster_idx, 2);
    }
  imshow( "clustered image", new_image );
  waitKey( 0 );
}
于 2012-04-20T07:40:20.900 に答える