またOpenCVの記事。この間作ったSURFの特徴点を表示するプログラムを改造して、あるスコア以上の特徴点のみを表示するようにしました。下図がその例です。response値が2397以上の特徴点のみを表示しています。
トラックバーはcv::createTrackbar()により実現できます。
サンプルコード
Windows 7 + Visual Studio Express 2013 + Opencv2.4.8で動作を確認しました。
#include <iostream> #include <vector> #include "opencv2/core/core.hpp" #include "opencv2/features2d/features2d.hpp" #include "opencv2/highgui/highgui.hpp" #include "opencv2/nonfree/features2d.hpp" #include "opencv2/imgproc/imgproc.hpp" /** @brief SURFで検出した特徴点を画像に重畳して表示 */ void drawSurfKeypoints() { cv::Mat img = cv::imread("..\\img\\baboon200.jpg", CV_LOAD_IMAGE_GRAYSCALE); // 特徴点を検出 int minHessian = 400; cv::SurfFeatureDetector detector(minHessian); std::vector<cv::KeyPoint> keypoints; detector.detect(img, keypoints); if (keypoints.empty()) return; // response値の最小・最大を取得 double response_min = (keypoints.end() - 1)->response; double response_max = keypoints[0].response; // WindowとTrackbarを生成 const std::string window_name = "Keypoints"; cv::namedWindow(window_name, CV_WINDOW_KEEPRATIO | CV_GUI_EXPANDED); int trackbar_value = response_min; cv::createTrackbar("res.", window_name, &trackbar_value, response_max + 1); while (1) { int more_than_trackbar_value_index = -1; for (int i = 0; i < keypoints.size(); ++i) { if (keypoints[i].response >= trackbar_value) { more_than_trackbar_value_index = i; } } // keypointを描画 cv::Mat dstImg = img.clone(); if (more_than_trackbar_value_index != -1) { // 現在のTrackbarの値以上の特徴点のみを表示 cv::drawKeypoints( img, // 入力画像 std::vector<cv::KeyPoint>( keypoints.begin(), keypoints.begin() + more_than_trackbar_value_index + 1), // 特徴点 dstImg, // 出力画像 cv::Scalar(0, 0, 255), // 色 cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS // 描画のオプション DRAW_RICH_KEYPOINTSを選んだ場合は、キーポイントのサイズと方向が描画される ); } cv::imshow(window_name, dstImg); // Escで終了 if (cv::waitKey(15) == 27) break; } return; }