#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 |