特征点提取算法对比

一. ORB特征点

python实现:
 

import time
import cv2
import numpy as np
from models.matching import Matching
from models.utils import (AverageTimer, VideoStreamer,
                          make_matching_plot_fast, frame2tensor)
import torch


video = cv2.VideoCapture(0)
fps = video.get(cv2.CAP_PROP_FPS)
print("相机的FPS:{}".format(fps))
size = (int(video.get(cv2.CAP_PROP_FRAME_WIDTH)), int(video.get(cv2.CAP_PROP_FRAME_HEIGHT)))
print("相机:{}x{}".format(size[0], size[1]))
r = 5

class OrbExtractor(object):
    def __init__(self, timer):
        self.timer = timer

    def work(self, img):
        gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
        orb = cv2.ORB_create()
        keys, desps = orb.detectAndCompute(gray, None)
        self.timer.end()

        orb_frame = self.draw(img, keys, r, self.timer.start_value, self.timer.end_value)

        return orb_frame

    def draw(self, orb_frame, keypoints, r, start, end):
        for keypoint in keypoints:
            pt1 = tuple([int(value - r) for value in keypoint.pt])
            pt2 = tuple([int(value + r) for value in keypoint.pt])
            cv2.rectangle(orb_frame, pt1, pt2, color=(0, 255, 0))
            pt = tuple(map(int, keypoint.pt))
            cv2.circle(orb_frame, pt, 2, color=(0, 255, 0), thickness=-1)

        cv2.putText(orb_frame, "features:{}".format(len(keypoints)),
                    (0, size[1] - 50), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255, 255, 255))
        cv2.putText(orb_frame, "fps:{}".format(int(1 / (end - start))),
                    (0, size[1] - 5), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255, 255, 255))
        cv2.imshow("orb", orb_frame)

        return orb_frame

class SuperPointsExtractor(object):
    def __init__(self, timer):
        self.timer = timer
        self.device = 'cuda' if torch.cuda.is_available() else 'cpu'
        config = {
            'superpoint': {
                'nms_radius': 4,
                'keypoint_threshold': 0.005,
                'max_keypoints': -1
            },
            'superglue': {
                'weights': 'indoor',
                'sinkhorn_iterations': 20,
                'match_threshold': 0.2,
            }
        }
        self._model = Matching(config).eval().to(self.device)
        self.keys = ['keypoints', 'scores', 'descriptors']

    def work(self, frame):
        gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
        frame_tensor = frame2tensor(gray, self.device)
        last_data = self._model.superpoint({'image': frame_tensor})
        last_data = {k + '0': last_data[k] for k in self.keys}
        last_data['image0'] = frame_tensor
        self.timer.end()
        old_frame = self.draw(frame, last_data, r, self.timer.start_value, self.timer.end_value)

        cv2.imshow("superpoint", old_frame)

        return old_frame

    def draw(self, old_frame, keypoints, r, start, end):
        keypoints_list = keypoints['keypoints0'][0].tolist()
        for keypoint in keypoints_list:
            pt1 = tuple([int(value - r) for value in keypoint])
            pt2 = tuple([int(value + r) for value in keypoint])
            cv2.rectangle(old_frame, pt1, pt2, color=(0, 255, 0))
            pt = tuple(map(int, keypoint))
            cv2.circle(old_frame, pt, 2, color=(0, 255, 0), thickness=-1)

        cv2.putText(old_frame, "features:{}".format(len(keypoints_list)),
                    (0, size[1] - 50), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255, 255, 255))
        cv2.putText(old_frame, "fps:{}".format(int(1 / (end - start))),
                    (0, size[1] - 5), fontFace=cv2.FONT_HERSHEY_SIMPLEX, fontScale=1, color=(255, 255, 255))

        return old_frame

class Timer(object):
    def __init__(self):
        self.start_value = 0
        self.end_value = 0

    def start(self):
        self.start_value = time.time()
        return self.start

    def end(self):
        self.end_value = time.time()
        return self.end





def run():
    timer = Timer()
    orb = OrbExtractor(timer)
    super = SuperPointsExtractor(timer)

    cv2.namedWindow("orb", cv2.WINDOW_NORMAL)
    cv2.namedWindow("superpoint", cv2.WINDOW_NORMAL)

    while True:
        timer.start()
        ret, frame = video.read()

        #   orb特征提取
        orb_frame = frame.copy()
        orb_frame = orb.work(orb_frame)

        superpoint_frame = frame.copy()
        super.work(superpoint_frame)

        cv2.waitKey(3)



if __name__ == "__main__":
    run()

原理参考:

[1]. (四十二)特征点检测-ORB - 知乎

[2]. 定位关键点ORB_create()函数解析_Bug刺客的博客-CSDN博客_orb_create

[3]. ORB 特征提取算法(实践篇一) - Alex777 - 博客园

[4].(1条消息) 【OpenCV】cv2.putText()函数用法_零碎@流年絮语的博客-CSDN博客_cv2.puttext

[5]. (1条消息) python+OpenCV图像处理(一)读取、复制、显示、保存_Jumping boy的博客-CSDN博客_img.copy()

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
特征提取算法是机器学习、计算机视觉和模式识别等领域中非常重要的技术。在实际应用中,特征提取算法的效果和准确性直接决定了后续任务的表现。本文将比较特征提取算法在Matlab和其他工具中实现的差异。 Matlab是一种流行的数学软件,提供了许多特征提取算法的实现。Matlab的图像处理和计算机视觉工具箱包含了一系列非常有效的特征提取算法,例如SIFT、SURF、HOG等。这些算法基本都是通过Matlab中可用的函数进行实现,并且具有较快的运行速度和较高的准确性。 然而,Matlab的主要限制在于它是闭源软件,用户对算法优化和修改有限,很难自由地扩展功能。此外,Matlab的专用性功能较强,无法轻松地与其他开源工具或Python库集成。这导致了一些问题,例如Matlab在大规模图像处理和跨平台协作方面存在一定的局限性。 相比之下,Python包括了许多强大的开源库,如OpenCV、scikit-learn、pytorch等,提供了丰富的特征提取算法。这些库实现了许多Matlab中存在的算法,并且具有更高的可扩展性和灵活性,例如可以轻松地在不同的操作系统和硬件上部署。此外,Python具有更好的社区支援,用户可以参与开源项目、提交和修改代码,优化和改进算法实现。 总体来说,Matlab的特征提取算法比较全面且运行速度较快,但它的闭源性质影响了它的可扩展性。Python特征提取算法实现具有更高的可扩展性和弹性,并且具有更好的社区支援。在实际应用中,用户可以根据项目需要,选择最适合自己的工具来实现特征提取算法

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值