본문 바로가기

OpenCV

ch14 matching

#python

import cv2
import numpy as np

def keypoint_matching():
    src1 = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch14\\matching\\box.png", cv2.IMREAD_GRAYSCALE)
    src2 = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch14\\matching\\box_in_scene.png", cv2.IMREAD_GRAYSCALE)

    if src1 is None or src2 is None:
        print("Image load failed!")
        return

    feature = cv2.ORB_create()

    keypoints1, desc1 = feature.detectAndCompute(src1, None)
    keypoints2, desc2 = feature.detectAndCompute(src2, None)

    print("desc1.size():", desc1.shape)
    print("desc2.size():", desc2.shape)

    matcher = cv2.BFMatcher_create(cv2.NORM_HAMMING)

    matches = matcher.match(desc1, desc2)

    dst = cv2.drawMatches(src1, keypoints1, src2, keypoints2, matches, None)

    cv2.imshow("dst", dst)
    cv2.waitKey()
    cv2.destroyAllWindows()

def good_matching():
    src1 = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch14\\matching\\box.png", cv2.IMREAD_GRAYSCALE)
    src2 = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch14\\matching\\box_in_scene.png", cv2.IMREAD_GRAYSCALE)

    if src1 is None or src2 is None:
        print("Image load failed!")
        return

    feature = cv2.ORB_create()

    keypoints1, desc1 = feature.detectAndCompute(src1, None)
    keypoints2, desc2 = feature.detectAndCompute(src2, None)

    matcher = cv2.BFMatcher_create(cv2.NORM_HAMMING)

    matches = matcher.match(desc1, desc2)

    matches = sorted(matches, key=lambda x: x.distance)
    good_matches = matches[:50]

    dst = cv2.drawMatches(src1, keypoints1, src2, keypoints2, good_matches, None,
                          flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

    cv2.imshow("dst", dst)
    cv2.waitKey()
    cv2.destroyAllWindows()

def find_homography():
    src1 = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch14\\matching\\box.png", cv2.IMREAD_GRAYSCALE)
    src2 = cv2.imread("D:\\projects\\SampleCode\\006939-master\\ch14\\matching\\box_in_scene.png", cv2.IMREAD_GRAYSCALE)

    if src1 is None or src2 is None:
        print("Image load failed!")
        return

    feature = cv2.ORB_create()

    keypoints1, desc1 = feature.detectAndCompute(src1, None)
    keypoints2, desc2 = feature.detectAndCompute(src2, None)

    matcher = cv2.BFMatcher_create(cv2.NORM_HAMMING)

    matches = matcher.match(desc1, desc2)

    matches = sorted(matches, key=lambda x: x.distance)
    good_matches = matches[:50]

    pts1 = np.array([keypoints1[m.queryIdx].pt for m in good_matches]).reshape(-1, 1, 2)
    pts2 = np.array([keypoints2[m.trainIdx].pt for m in good_matches]).reshape(-1, 1, 2)

    H, _ = cv2.findHomography(pts1, pts2, cv2.RANSAC)

    corners1 = np.array([[0, 0], [src1.shape[1] - 1, 0], [src1.shape[1] - 1, src1.shape[0] - 1], [0, src1.shape[0] - 1]], dtype=np.float32).reshape(-1, 1, 2)
    corners2 = cv2.perspectiveTransform(corners1, H)

    corners_dst = np.round(corners2 + np.array([src1.shape[1], 0])).astype(np.int32)

    dst = cv2.drawContours(cv2.cvtColor(src1, cv2.COLOR_GRAY2BGR), [corners_dst], -1, (0, 255, 0), 2, cv2.LINE_AA)

    cv2.imshow("dst", dst)
    cv2.waitKey()
    cv2.destroyAllWindows()

keypoint_matching()
good_matching()
find_homography()

// C++

#include "opencv2/opencv.hpp"
#include <iostream>

using namespace cv;
using namespace std;

void keypoint_matching();
void good_matching();
void find_homography();

int main(void)
{
	keypoint_matching();
	good_matching();
	find_homography();

	return 0;
}

void keypoint_matching()
{
	Mat src1 = imread("box.png", IMREAD_GRAYSCALE);
	Mat src2 = imread("box_in_scene.png", IMREAD_GRAYSCALE);

	if (src1.empty() || src2.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Ptr<Feature2D> feature = ORB::create();

	vector<KeyPoint> keypoints1, keypoints2;
	Mat desc1, desc2;
	feature->detectAndCompute(src1, Mat(), keypoints1, desc1);
	feature->detectAndCompute(src2, Mat(), keypoints2, desc2);
	cout << "desc1.size(): " << desc1.size() << endl;
	cout << "desc2.size(): " << desc2.size() << endl;

	Ptr<DescriptorMatcher> matcher = BFMatcher::create(NORM_HAMMING);

	vector<DMatch> matches;
	matcher->match(desc1, desc2, matches);

	Mat dst;
	drawMatches(src1, keypoints1, src2, keypoints2, matches, dst);

	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
}

void good_matching()
{
	Mat src1 = imread("box.png", IMREAD_GRAYSCALE);
	Mat src2 = imread("box_in_scene.png", IMREAD_GRAYSCALE);

	if (src1.empty() || src2.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Ptr<Feature2D> feature = ORB::create();

	vector<KeyPoint> keypoints1, keypoints2;
	Mat desc1, desc2;
	feature->detectAndCompute(src1, Mat(), keypoints1, desc1);
	feature->detectAndCompute(src2, Mat(), keypoints2, desc2);

	Ptr<DescriptorMatcher> matcher = BFMatcher::create(NORM_HAMMING);

	vector<DMatch> matches;
	matcher->match(desc1, desc2, matches);

	std::sort(matches.begin(), matches.end());
	vector<DMatch> good_matches(matches.begin(), matches.begin() + 50);

	Mat dst;
	drawMatches(src1, keypoints1, src2, keypoints2, good_matches, dst,
		Scalar::all(-1), Scalar::all(-1), vector<char>(),
		DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
}

void find_homography()
{
	Mat src1 = imread("box.png", IMREAD_GRAYSCALE);
	Mat src2 = imread("box_in_scene.png", IMREAD_GRAYSCALE);

	if (src1.empty() || src2.empty()) {
		cerr << "Image load failed!" << endl;
		return;
	}

	Ptr<Feature2D> feature = ORB::create();

	vector<KeyPoint> keypoints1, keypoints2;
	Mat desc1, desc2;
	feature->detectAndCompute(src1, Mat(), keypoints1, desc1);
	feature->detectAndCompute(src2, Mat(), keypoints2, desc2);

	Ptr<DescriptorMatcher> matcher = BFMatcher::create(NORM_HAMMING);

	vector<DMatch> matches;
	matcher->match(desc1, desc2, matches);

	std::sort(matches.begin(), matches.end());
	vector<DMatch> good_matches(matches.begin(), matches.begin() + 50);

	Mat dst;
	drawMatches(src1, keypoints1, src2, keypoints2, good_matches, dst,
		Scalar::all(-1), Scalar::all(-1), vector<char>(),
		DrawMatchesFlags::NOT_DRAW_SINGLE_POINTS);

	vector<Point2f> pts1, pts2;
	for (size_t i = 0; i < good_matches.size(); i++) {
		pts1.push_back(keypoints1[good_matches[i].queryIdx].pt);
		pts2.push_back(keypoints2[good_matches[i].trainIdx].pt);
	}

	Mat H = findHomography(pts1, pts2, RANSAC);

	vector<Point2f> corners1, corners2;
	corners1.push_back(Point2f(0, 0));
	corners1.push_back(Point2f(src1.cols - 1.f, 0));
	corners1.push_back(Point2f(src1.cols - 1.f, src1.rows - 1.f));
	corners1.push_back(Point2f(0, src1.rows - 1.f));
	perspectiveTransform(corners1, corners2, H);

	vector<Point> corners_dst;
	for (Point2f pt : corners2) {
		corners_dst.push_back(Point(cvRound(pt.x + src1.cols), cvRound(pt.y)));
	}

	polylines(dst, corners_dst, true, Scalar(0, 255, 0), 2, LINE_AA);

	imshow("dst", dst);

	waitKey();
	destroyAllWindows();
}

C++ Code 출처 : OpenCV 4로 배우는 컴퓨터 비전과 머신 러닝 - 황선규 저


'OpenCV' 카테고리의 다른 글

ch14 stitching  (0) 2024.05.22
ch14 keypoints  (0) 2024.05.22
ch14 corners  (0) 2024.05.22
ch13 template  (0) 2024.05.21
ch13 QRCode  (0) 2024.05.21