2011-08-11 6 views
3

kmeans関数から返されるデータからクラスターイメージを作成しようとしています。私はOpenCVの例と同様の方法でデータを取り出しようとしていますが、それは私にとってはクラッシュするようです。さらなる研究の後、私は、誰かがセンターを使ってデータを取り出したが、そのデータで何もしなかったので、そこで私の道が終わったことが分かりました。OpenCVのkmeansデータからクラスターイメージを作成する

私のコードのスニペットと、私が以下でやっていることを記載しました。どんな助けでも大歓迎です。

EDIT 私のコードをテスト変数なしの元の状態に戻しました。それでも上記のエラーは解決しません。また、私は以下の私のイメージに関するいくつかのデバッグ情報を追加しました:

イメージ情報:

  • 寸法:2
  • 画像データ:
  • サイズ0:256
  • サイズ1:256
  • エレムサイズ1:12
  • エレメンツ2:4

データはNULLですが、cv::imshowを呼び出してもデータを見ることができます。

// mImage is a cv::Mat that was created from a 256 x 256 image with the depth of 
// CV_32F and 3 channels 
// labels is a cv::Mat that was created by converting the image into a 256 x 256 
// CV_8UC1 IplImage 
kmeans(mImage, 6, labels, termcrit, 3, cv::KMEANS_PP_CENTERS, centers); 
float* c = new float[6]; 
memcpy(c, centers.ptr<float>(0), sizeof(float)*6); 

// Block of code that crashes when I do "mImage.at<cv::Point2f>(i)" with the error: 
/* OpenCV Error: Assertion failed (dims <= 2 && data && (size.p[0] == 1 || 
     size.p[1] == 1) && (unsigned)i0 < (unsigned)(size.p[0] + size.p[1] - 1) && 
     elemSize() == (((((DataType<_Tp>::type) & ((512 - 1) << 3)) >> 3) + 1) << 
     ((((sizeof(size_t)/ 4+1)*16384|0x3a50) >> ((DataType<_Tp>::type) & 
     ((1 << 3) - 1))*2) & 3))) in unknown function, file 
     c:\opencv-2.3.0\modules\core\include\opencv2\core\mat.hpp, line 583 */ 

for(int i = 0; i < list.rows; i++) 
{ 
    int clusterIdx = list.at<int>(i); 
    cv::Point ipt = mImage.at<cv::Point2f>(i); 
    circle(miplImage, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA); 
} 

答えて

1

mRegion.at()の呼び出しでアサーションエラーが発生しています。 mRegionはどこに定義されていますか?

kmeans(points, clusterCount, labels, 
      TermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), 
      3, KMEANS_PP_CENTERS, centers); 

    img = Scalar::all(0); 

    for(i = 0; i < sampleCount; i++) 
    { 
     int clusterIdx = labels.at<int>(i); 
     Point ipt = points.at<Point2f>(i); 
     circle(img, ipt, 2, colorTab[clusterIdx], CV_FILLED, CV_AA); 
    } 

それはkmeansおよびforループ内iptのソースとして最初の引数の両方に同じ変数pointsを使用:

ここkmeans.cppサンプルコードから同等のスニペットです。おそらくをforループで使用したいと思うでしょう。mRegionでは使用しません。

編集ループでmImageを使用するようにコードを変更したので、なぜアサーションエラーが発生するのかを確認する必要があります。アサーションメッセージはテンプレートコードによって非常に乱雑ですのでここではmat.hppからです:

dims <= 2 && data && (size.p[0] == 1 || size.p[1] == 1) && 
      (unsigned)i0 < (unsigned)(size.p[0] + size.p[1] - 1) && 
      elemSize() == CV_ELEM_SIZE(DataType<_Tp>::type) 

これらのテストの1つ以上が失敗します。空のmImageを使用している場合は、dataがnilになるため、失敗します。空の行列にはatを呼び出すことはできません。いずれにしても、mImageのプロパティを調べて、アサーションエラーの原因を調べます。

+0

私は何かを得ることができるかどうかを見ている別のテクニックをテストしていたので、申し訳ありません。 mRegionは、次元と型がmImageである空の行列です。私はmImageとそれを試してみたので、空の行列を試してみたところ、同じエラーが出ました。 – Seb

+0

その場合、私は256x256イメージを65536x1の配列に変換する必要がありますか? – Seb

+0

いいえ、256x256は問題ありません。これは 'dims <= 2'テストです。 'data'がnilであるか' i'がポイント数より多いので、おそらく失敗しているでしょう。 'for'ループの前に' cout << "データ:" << mImage.data << endl; "を追加してみてください。 – SSteve

関連する問題