OpenCVでのエラーについての質問

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
Y.お手上げ

OpenCVでのエラーについての質問

#1

投稿記事 by Y.お手上げ » 10年前

OpenCV(ver2.4.0)についての質問です。
画像の特徴量のクラスタリングをしていくために、cv::kmeansの使い方の勉強も兼ねて、OpenCVの逆引きリファレンスというところに掲載してあったサンプルプログラムを動かしたいのですが、エラーが出てしまいます。

エラーで処理を中断した時には
「利用可能なソースがありません」 と 「呼び出し履歴の場所:KernelBase.dll!75b4812f()」、「**.exe の 0x75b4812f で初回の例外が発生しました: Microsoft C++ の例外: cv::Exception (メモリの場所 0x0015d414)。」
というものが出ます。

コード:

#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>
#include <opencv2/highgui/highgui.hpp>

#define OPENCV_VERSION(a,b,c) (((a) << 16) + ((b) << 8) + (c))
#define OPENCV_VERSION_CODE OPENCV_VERSION(CV_MAJOR_VERSION, CV_MINOR_VERSION, CV_SUBMINOR_VERSION)

int
main(int argc, char *argv[])
{
  cv::Mat src_img = cv::imread(".\\lena.png", 1);
  if(src_img.empty()) return -1;

  const int cluster_count = 10; /* クラスタ数 */

  // 画像を1列の行列に変形
  cv::Mat points;
  src_img.convertTo(points, CV_32FC3);
  points = points.reshape(3, src_img.rows*src_img.cols);

  // RGB空間でk-meansを実行
  cv::Mat_<int> clusters(points.size(), CV_32SC1);
  cv::Mat centers;
  // クラスタ対象,クラスタ数,(出力)クラスタインデックス,
  // 停止基準,k-meansの実行回数,手法,(出力)クラスタ中心値

#if OPENCV_VERSION_CODE<OPENCV_VERSION(2,3,0)
  cv::kmeans(points, cluster_count, clusters, 
	     cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER, 10, 1.0), 1, cv::KMEANS_PP_CENTERS, &centers);
#else
  cv::kmeans(points, cluster_count, clusters, 
             cvTermCriteria(CV_TERMCRIT_EPS|CV_TERMCRIT_ITER, 10, 1.0), 1, cv::KMEANS_PP_CENTERS, centers);
#endif

  // すべてのピクセル値をクラスタ中心値で置き換え
  cv::Mat dst_img(src_img.size(), src_img.type());
  cv::MatIterator_<cv::Vec3b> itd = dst_img.begin<cv::Vec3b>(), 
    itd_end = dst_img.end<cv::Vec3b>();
  for(int i=0; itd != itd_end; ++itd, ++i) {
    cv::Vec3f &color = centers.at<cv::Vec3f>(clusters(i), 0);
    (*itd)[0] = cv::saturate_cast<uchar>(color[0]);
    (*itd)[1] = cv::saturate_cast<uchar>(color[1]);
    (*itd)[2] = cv::saturate_cast<uchar>(color[2]);
  }

  cv::namedWindow("dst_img", CV_WINDOW_AUTOSIZE|CV_WINDOW_FREERATIO);
  cv::imshow("dst_img", dst_img);
  cv::waitKey(0);
}
開発環境はVC++2010、OpenCV(ver2.4.0)。リンカー入力追加の依存ファイルとして、opencv_core240d.lib opencv_imgproc240d.lib opencv_highgui240d.libを設定しています。

入力した画像はcv::imshowメソッドで表示することは出来ましたので、画像データの取得ができていないということはないと思います。

どうすればきちんと動作するようになるのか、もしよければご助言宜しくお願い致します。

“C言語何でも質問掲示板” へ戻る