画像の特徴量のクラスタリングをしていくために、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, ¢ers);
#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);
}
入力した画像はcv::imshowメソッドで表示することは出来ましたので、画像データの取得ができていないということはないと思います。
どうすればきちんと動作するようになるのか、もしよければご助言宜しくお願い致します。