OpenCV 2.xでトラックバーを使ってみる


このエントリーをはてなブックマークに追加

またOpenCVの記事。この間作ったSURFの特徴点を表示するプログラムを改造して、あるスコア以上の特徴点のみを表示するようにしました。下図がその例です。response値が2397以上の特徴点のみを表示しています。

f:id:minus9d:20140321174949p:plain

トラックバーは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;
}