12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970 |
- import cv2
- import numpy as np
- from loguru import logger
- from superpoint_superglue_deployment import Matcher
- def get_args():
- import argparse
- parser = argparse.ArgumentParser("test matching two images")
- parser.add_argument("--query_path", "-q", type=str, required=True, help="path to query image")
- parser.add_argument("--ref_path", "-r", type=str, required=True, help="path to reference image")
- parser.add_argument("--use_gpu", action="store_true")
- return parser.parse_args()
- def main():
- args = get_args()
- query_image = cv2.imread(args.query_path)
- ref_image = cv2.imread(args.ref_path)
- query_gray = cv2.imread(args.query_path, 0)
- ref_gray = cv2.imread(args.ref_path, 0)
- superglue_matcher = Matcher(
- {
- "superpoint": {
- "input_shape": (-1, -1),
- "keypoint_threshold": 0.005,
- },
- "superglue": {
- "match_threshold": 0.2,
- },
- "use_gpu": args.use_gpu,
- }
- )
- query_kpts, ref_kpts, _, _, matches = superglue_matcher.match(query_gray, ref_gray)
- logger.info(f"number of matches by superpoint+superglue: {len(matches)}")
- _, mask = cv2.findHomography(
- np.array([query_kpts[m.queryIdx].pt for m in matches], dtype=np.float64).reshape(-1, 1, 2),
- np.array([ref_kpts[m.trainIdx].pt for m in matches], dtype=np.float64).reshape(-1, 1, 2),
- method=cv2.USAC_MAGSAC,
- ransacReprojThreshold=5.0,
- maxIters=10000,
- confidence=0.95,
- )
- logger.info(f"number of inliers: {mask.sum()}")
- matches = np.array(matches)[np.all(mask > 0, axis=1)]
- matches = sorted(matches, key=lambda match: match.distance)
- matched_image = cv2.drawMatches(
- query_image,
- query_kpts,
- ref_image,
- ref_kpts,
- matches[:100],
- None,
- flags=2,
- )
- cv2.imwrite("matched_image.jpg", matched_image)
- cv2.imshow("matched_image", matched_image)
- cv2.waitKey(0)
- cv2.destroyAllWindows()
- if __name__ == "__main__":
- main()
|