AR.Droneでパノラマ画像
OpenCVのパノラマ画像生成機能(Stitching)を使ってみましょう。
最小限のコードはこんな感じです。
58行目のやつです。でもこんなので本当にいいのかな?

CV Droneのサンプルにも収録されています。
https://github.com/puku0x/cvdrone/blob/master/src/samples/sample_stitching.cpp
最小限のコードはこんな感じです。
AR.Droneへ応用するときに毎ループpush_backするとパノラマ画像の生成に時間がかかる(というか画像が多すぎるとメモリ不足になる)ので注意しましょう。
// 画像セット
std::vector<cv::Mat> images;
images.puch_back(何かの画像1);
images.puch_back(何かの画像2);
:
images.puch_back(何かの画像n);
// パノラマ画像生成
cv::Mat result;
cv::Stitcher stitcher = cv::Stitcher::createDefault();
stitcher.stitch(images, result);
本サンプルではORB特徴量を抽出し、前フレームと比較することでシーンの切り替わりを検出しています。
#include "ardrone/ardrone.h"
#include <opencv2/stitching/stitcher.hpp>
#define KEY_DOWN(key) (GetAsyncKeyState(key) & 0x8000)
#define KEY_PUSH(key) (GetAsyncKeyState(key) & 0x0001)
// --------------------------------------------------------------------------
// main(Number of arguments, Argument values)
// Description : This is the entry point of the program.
// Return value : SUCCESS:0 ERROR:-1
// --------------------------------------------------------------------------
int main(int argc, char **argv)
{
// AR.Droneクラス
ARDrone ardrone;
// 初期化
if (!ardrone.open()) {
printf("Failed to initialize.\n");
return -1;
}
// 画像保存用
std::vector<cv::Mat> snapshots;
// 直前の画像
cv::Mat last = cv::Mat(ardrone.getImage(), true);
// ORB
cv::OrbFeatureDetector detector;
cv::OrbDescriptorExtractor extractor;
// メインループ
while (!GetAsyncKeyState(VK_ESCAPE)) {
// 更新
if (!ardrone.update()) break;
// 画像取得
cv::Mat image = cv::Mat(ardrone.getImage());
// 特徴点の抽出
cv::Mat descriptorsA, descriptorsB;
std::vector<cv::KeyPoint> keypointsA, keypointsB;
detector.detect(last, keypointsA);
detector.detect(image, keypointsB);
extractor.compute(last, keypointsA, descriptorsA);
extractor.compute(image, keypointsB, descriptorsB);
// マッチング
std::vector<cv::DMatch> matches;
cv::BFMatcher matcher(cv::NORM_HAMMING, true);
matcher.match(descriptorsA, descriptorsB, matches);
// マッチ数
int count = 0;
for (int i = 0; i < (int)matches.size(); i++) {
if (matches[i].queryIdx == matches[i].trainIdx) count++; // これ合ってんのか?
}
// マッチ数が0なら保存
if (count == 0) {
image.copyTo(last);
cv::Ptr<cv::Mat> tmp(new cv::Mat());
image.copyTo(*tmp);
snapshots.push_back(*tmp);
}
// 表示
cv::Mat matchImage;
cv::drawMatches(last, keypointsA, image, keypointsB, matches, matchImage, cv::Scalar::all(-1), cv::Scalar::all(-1), std::vector<char>(), cv::DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);
cv::imshow("camera", matchImage);
cv::waitKey(1);
}
// ここからStiching
cv::Mat result;
cv::Stitcher stitcher = cv::Stitcher::createDefault();
printf("Stitching images...\n");
if (stitcher.stitch(snapshots, result) == cv::Stitcher::OK) {
cv::imshow("result", result);
cv::imwrite("result.jpg", result);
cvWaitKey(0);
}
// さようなら
ardrone.close();
return 0;
}
58行目のやつです。でもこんなので本当にいいのかな?

CV Droneのサンプルにも収録されています。
https://github.com/puku0x/cvdrone/blob/master/src/samples/sample_stitching.cpp
スポンサーサイト