Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
Help us understand the problem. What is going on with this article?

OpenCVで物体追跡し、対象にモザイクをかけ続ける(動画)

More than 3 years have passed since last update.

概要

OpenCVのtrackingを使用して物体の追跡を行う

環境

  • Windows 10(64Bit)
  • OpenCV3.1
  • CMake 3.6.1(64Bit)
  • Visual Studio 2015

対象

  • Visual StudioでC(++)の実行環境を構築出来る
  • PATHの設定が出来る

記事を読んで出来る事

  • OpenCVのVisual Studio向けビルド環境構築
  • 動画の1フレーム目を利用して追跡対象の物体を選択し、その後追跡中にモザイクをかけるプログラムの実行

発展させるとしたら

  • AviUtlのプラグイン作成
  • スマホからの動画編集アプリ

注意

  • 公開するプログラムは最小単位なのでエラー等は考慮しないものとする
  • ファイルを取得し展開する必要のあるものは全て『c:\』へ展開したものとして記載する
  • パスを通す手順は記載を省くので各自対応しているものとする

手順

OpenCVの取得

https://github.com/opencv/opencv/releases からOpenCV 3.1を取得し任意の場所に展開する

contribの取得

https://github.com/opencv/opencv_contrib より、cloneするか、zipでファイルを取得し任意の場所に展開する

contribビルド

Visual Studio 2015向けビルド環境構築

Visual Studioのソリューションファイル生成

CMakeを起動し以下の設定を行う

設定内容
Where is the source code C:/opencv/sources
Where to build the binaries C:/opencv/build

入力後、「Configure」する

設定内容
Specify the generator for this project Visual Studio 14 2015
Radio Button Use default native compilers

更に以下のオプション設定を行う

Name Value
OPENCV_EXTRA_MODULES_PATH c:/opencv_contrib-master/modules

入力後再度、「Configure」する
エラーが出ていなければ続いて「Generate」する

Visual Studioからcontribビルド

C:\opencv\build\OpenCV.slnを実行し、Debug・Release共にビルドする

実装

Visual Studioのソリューションを作成する

アプリケーション設定

設定
アプリケーションの種類 Windows アプリケーション
追加オプション 空のプロジェクト

コンソールでも問題ないと思うが拡張する上でファイルの読み込みやUI設計する可能性があるのでこうした

main.cpp
#include <opencv2\opencv.hpp>
#include <opencv2\video.hpp>
#include <opencv2\tracking.hpp>
#include <opencv2\highgui.hpp>
#include <opencv2\imgproc.hpp>
#include <Windows.h>

#pragma comment(lib, "opencv_core310.lib")
#pragma comment(lib, "opencv_videoio310.lib")
#pragma comment(lib, "opencv_tracking310.lib")
#pragma comment(lib, "opencv_highgui310.lib")
#pragma comment(lib, "opencv_imgproc310.lib")

int WINAPI WinMain(
    HINSTANCE hInstance,
    HINSTANCE hPrevInstance,
    LPSTR lpCmdLine,
    int nCmdShow
)
{
    cv::VideoCapture cap(『任意の動画ファイルを指定』);
    if (!cap.isOpened()) return 0;

    cv::Mat frame;
    cap >> frame;
    cv::Rect2d roi = cv::selectROI("Target", frame);

    cv::Ptr<cv::Tracker> tracker = cv::Tracker::create("MIL");
    tracker->init(frame, roi);

    for (;;)
    {
            // 切り出してモザイクかけてもどす.
            // 倍率は20
            cv::Mat mosaic(frame, roi);
            cv::resize(mosaic, mosaic, cv::Size(), 0.05, 0.05);
            cv::resize(mosaic, mosaic, cv::Size(), 20, 20, cv::INTER_NEAREST);
            cv::Mat mat = (cv::Mat_<double>(2, 3) << 1.0, 0.0, roi.x, 0.0, 1.0, roi.y);
            cv::warpAffine(mosaic, frame, mat, frame.size(), CV_INTER_LINEAR, cv::BORDER_TRANSPARENT);
            cv::imshow("Tracking", frame);

            if (cv::waitKey(1) == 0x1B) break;

            cap >> frame;
            if (frame.empty()) break;
            tracker->update(frame, roi);
    }

    cv::destroyAllWindows();
    return 0;
}

実施している事

  • 動画の読み込み
  • 1フレーム目から追跡対象特定(マウスで枠を作成し、Enterキーで確定)
  • 1フレームづつ追跡対象にモザイクをかけ画像を合成し表示
  • 最終フレームまたはEscキー入力で終了
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away