このような感じでどうでしょうか?
cpp
1#include <opencv2/opencv.hpp>
2
3int main(int argc, const char *argv[])
4{
5 cv::Mat src1 = cv::imread("src1.jpg");
6 cv::Mat src2 = cv::imread("src2.jpg");
7
8 // Akaze で特徴点を抽出する。
9 cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create();
10
11 // 特徴点を計算する。
12 std::vector<cv::KeyPoint> keypoint1, keypoint2;
13 cv::Mat descriptor1, descriptor2;
14 akaze->detectAndCompute(src1, cv::noArray(), keypoint1, descriptor1);
15 akaze->detectAndCompute(src2, cv::noArray(), keypoint2, descriptor2);
16
17 // 特徴点のマッチングを行う。
18 cv::Ptr<cv::DescriptorMatcher> matcher =
19 cv::DescriptorMatcher::create("BruteForce");
20 std::vector<cv::DMatch> match1to2, match2to1;
21 matcher->match(descriptor1, descriptor2, match1to2);
22 matcher->match(descriptor2, descriptor1, match2to1);
23
24 // クロスチェック
25 std::vector<cv::DMatch> match;
26 for (size_t i = 0; i < match1to2.size(); i++) {
27 cv::DMatch forward = match1to2[i];
28 cv::DMatch backward = match2to1[forward.trainIdx];
29 if (backward.trainIdx == forward.queryIdx) {
30 match.push_back(forward);
31 }
32 }
33
34 std::ofstream ofs("output.csv");
35 // 特徴点出力
36 ofs << "keypoint1,keypoint2" << std::endl;
37 for (const auto &m : match) {
38 cv::Point2f pt1 = keypoint1[m.queryIdx].pt; // src1 の特徴点
39 cv::Point2f pt2 = keypoint2[m.trainIdx].pt; // src2 の特徴点
40 ofs << pt1.x << "," << pt1.y << "," << pt2.x << "," << pt2.y
41 << std::endl;
42 }
43
44 // マッチング結果の描画
45 cv::Mat dst;
46 cv::drawMatches(src1, keypoint1, src2, keypoint2, match, dst);
47
48 //マッチング結果の書き出し
49 cv::imwrite("output.png", dst);
50}
51
入力画像1
入力画像2
特徴点マッチング Akaze の結果
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/10/15 06:59