• 締切済み

OpenCV2.2でのk-means法について

プログラミング初心者です。 今回、OpenCV2.2を使って画像処理(クラスタリング)をk-means法で行うことになりました。 Visual C++で以下のサンプルコードをデバッグしてみたのですが実行できません。 #include "stdafx.h" #include "C:\\OpenCV2.2\\include\\opencv\\highgui.h" #include "C:\\OpenCV2.2\\include\\opencv\\cv.h" #include "opencv2\\opencv.hpp" using namespace cv; //int _tmain(int argc, _TCHAR* argv[]) int main(int argc , char **argv) { const int cluster_count = 10; /* number of cluster */ // (1)load a specified file as a 3-channel color image const char *imagename = argc > 1 ? argv[1] : "C:\Penguins.jpg"; Mat src_img = imread(imagename); if(!src_img.data) return -1; // (2)reshape the image to be a 1 column matrix Mat points; src_img.convertTo(points, CV_32FC3); points = points.reshape(3, src_img.rows*src_img.cols); // (3)run k-means clustering algorithm to segment pixels in RGB color space Mat_<int> clusters(points.size(), CV_32SC1); Mat centers; kmeans(points, cluster_count, clusters, cvTermCriteria(CV_TERMCRIT_EPS+CV_TERMCRIT_ITER, 10, 1.0), 1, KMEANS_PP_CENTERS, &centers); // (4)make a each centroid represent all pixels in the cluster Mat dst_img(src_img.size(), src_img.type()); MatIterator_<Vec3f> itf = centers.begin<Vec3f>(); MatIterator_<Vec3b> itd = dst_img.begin<Vec3b>(), itd_end = dst_img.end<Vec3b>(); for(int i=0; itd != itd_end; ++itd, ++i) { Vec3f color = itf[clusters(1,i)]; (*itd)[0] = saturate_cast<uchar>(color[0]); (*itd)[1] = saturate_cast<uchar>(color[1]); (*itd)[2] = saturate_cast<uchar>(color[2]); } // (5)show source and destination image, and quit when any key pressed namedWindow("src_img", CV_WINDOW_AUTOSIZE); imshow("src_img", src_img); namedWindow("dst_img", CV_WINDOW_AUTOSIZE); imshow("dst_img", dst_img); waitKey(0); return 0; } デバッグすると、ウィンドウが一瞬だけ立ち上がってすぐに消えてしまいます。 最後に、 「プログラム '[2568] k-means1.exe: ネイティブ' はコード -1 (0xffffffff) で終了しました。」 のメッセージが残されています。 ソースにエラーがあるわけでもなさそうなので困っています。 何らかの対処法はあるのでしょうか?

みんなの回答

  • myuki1232
  • ベストアンサー率57% (97/170)
回答No.2

込み入っていて代わりにデバッグする気になれないので、とりあえず一般論だけ書きます。 1. Visual C++ のブレークポイント機能を使って、どこでエラーが発生しているか特定して下さい。 2. opencv と opencv2 のヘッダファイルを混在させるのは好ましくありません。どちらかに統一して下さい。 3. Visual C++ で新しいプロジェクトを作るときに、プリコンパイルヘッダーを使わず、空のプロジェクトにしないと問題が起こることを経験したことがあります。

  • kmee
  • ベストアンサー率55% (1857/3366)
回答No.1

> ネイティブ' はコード -1 (0xffffffff) で終了しました。 main関数のreturnの値です。-1を返しているのは > if(!src_img.data) return -1; です。 src_imgはimreadで画像を読んでます。エラーがあったときdataがNULLになります。 つまり、imreadで読みこめてないということです。 "C:\Penguins.jpg"; で\がエスケープされていないのが原因かもしれません

underbaka
質問者

補足

回答ありがとうございました。 \ではなく/で実行したところ、先日のようなエラーにはなりませんでした。 ありがとうございました。 ただ、うまく動作しません。 ウィンドウが立ち上がってしばらくすると別のウィンドウが立ち上がり、 「k-means1.exe の 0x7504d36f でハンドルされていない例外が発生しました: Microsoft C++ の例外: cv::Exception (メモリの場所 0x0016f0e4)。」 というメッセージが表示されます。 元のウィンドウには、 「OpenCV Error:Assertion failed (elemSize() == sizeof(_Tp)) in unknown function , file c:\opencv2.include\opencv2.2\core\mat.hpp, line 599」 と出ます。 対処法はあるのでしょうか。 教えていただければ助かります。

関連するQ&A