openCV中的KeyPoints、DMatch、以及drawMatches函数(sift算法会用到的)

本文详细介绍了关键点检测与匹配的基本概念,并深入探讨了关键点类(KeyPoint)的属性及构造方法,同时讲解了匹配结构DMatch及其使用方式。此外,还提供了drawMatches函数的具体用法,帮助读者更好地理解如何在图像中展示特征点匹配。
部署运行你感兴趣的模型镜像

https://blog.youkuaiyun.com/lihuacui/article/details/56667342

1. keypoint类

/*!
 The Keypoint Class

 The class instance stores a keypoint, i.e. a point feature found by one of many available keypoint detectors, such as
 Harris corner detector, cv::FAST, cv::StarDetector, cv::SURF, cv::SIFT, cv::LDetector etc.
*/

class  KeyPoint
{
public:
    //! the default constructor默认构造函数
    KeyPoint() : pt(0,0), size(0), angle(-1), 
                 response(0), octave(0), class_id(-1) {}
    //! the full constructor
    KeyPoint(Point2f _pt, float _size, float _angle=-1,
             float _response=0, int _octave=0, int _class_id=-1)
          :pt(_pt), size(_size), angle(_angle),
           response(_response), octave(_octave), class_id(_class_id) {}
    //! another form of the full constructor
    KeyPoint(float x, float y, float _size, float _angle=-1,
             float _response=0, int _octave=0, int _class_id=-1)
          :pt(x, y), size(_size), angle(_angle),
           response(_response), octave(_octave), class_id(_class_id) {}

    size_t hash() const;

    //! converts vector of keypoints to vector of points
    static void convert(const vector<KeyPoint>& keypoints,
                        CV_OUT vector<Point2f>& points2f,
                        const vector<int>& keypointIndexes=vector<int>());
    //! converts vector of points to the vector of keypoints, where each keypoint is assigned the same size and the same orientation
    static void convert(const vector<Point2f>& points2f,
                        CV_OUT vector<KeyPoint>& keypoints,
                        float size=1, float response=1, int octave=0, int class_id=-1);

    //! computes overlap for pair of keypoints;
    //! overlap is a ratio between area of keypoint regions intersection and
    //! area of keypoint regions union (now keypoint region is circle)
    static float overlap(const KeyPoint& kp1, const KeyPoint& kp2);

    Point2f pt; //!<关键点坐标coordinates of the keypoints>
    float size; //!<关键点邻域直径大小diameter of the meaningful keypoint neighborhood
    float angle; //!<特征点方向computed orientation of the keypoint (-1 if not applicable);
                 //!< it's in [0,360) degrees and measured relative to
                 //!< image coordinate system, ie in clockwise.
    float response; //!< the response by which the most strong keypoints have been selected. Can be used for the further sorting or subsampling
    int octave; //!<关键点所在的图像金字塔的组octave (pyramid layer) from which the keypoint has been extracted
    int class_id; //!<用于聚类的ID object class (if the keypoints need to be clustered by an object they belong to)
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27
  • 28
  • 29
  • 30
  • 31
  • 32
  • 33
  • 34
  • 35
  • 36
  • 37
  • 38
  • 39
  • 40
  • 41
  • 42
  • 43
  • 44
  • 45
  • 46
  • 47
  • 48
  • 49

2.Dmatch结构

/*************************************/
*             DMatch                 *
/*************************************/
/* Struct for matching: query descriptor index, train descriptor index, train image index and distance between descriptors.
 */
struct  DMatch
{
//有三个构造函数
    DMatch() : queryIdx(-1), trainIdx(-1), imgIdx(-1), distance(FLT_MAX) {}
    DMatch( int _queryIdx, int _trainIdx, float _distance ) :
            queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(-1), distance(_distance) {}
    DMatch( int _queryIdx, int _trainIdx, int _imgIdx, float _distance ) :
            queryIdx(_queryIdx), trainIdx(_trainIdx), imgIdx(_imgIdx), distance(_distance) {}

    CV_PROP_RW int queryIdx; //此匹配对应的查询图像的特征描述子索引 query descriptor index
    CV_PROP_RW int trainIdx; //此匹配对应的训练(模板)图像的特征描述子索引 train descriptor index
    CV_PROP_RW int imgIdx;   //训练图像的索引(若有多个) train image index

    CV_PROP_RW float distance;//两个特征向量之间的欧氏距离,越小表明匹配度越高

    // less is better
    bool operator<( const DMatch &m ) const
    {
        return distance < m.distance;
    }
};
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 27

3.drawMatches函数

// Draws matches of keypints from two images on output image.
void drawMatches( const Mat& img1, const vector<KeyPoint>& keypoints1,
                  const Mat& img2, const vector<KeyPoint>& keypoints2,
                  const vector<DMatch>& matches1to2, Mat& outIm     
                  const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1),
                  const vector<char>& matchesMask=vector<char>(), int flags=DrawMatchesFlags::DEFAULT );

void drawMatches( const Mat& img1, const vector<KeyPoint>& keypoints1,
                  const Mat& img2, const vector<KeyPoint>& keypoints2,
                  const vector<vector<DMatch> >& matches1to2, Mat& outImg,
                  const Scalar& matchColor=Scalar::all(-1), const Scalar& singlePointColor=Scalar::all(-1),
                  const vector<vector<char> >& matchesMask=vector<vector<char> >(), int flags=DrawMatchesFlags::DEFAULT );

/*
/*其中参数如下:
* img1 – 源图像1
* keypoints1 –源图像1的特征点.
* img2 – 源图像2.
* keypoints2 – 源图像2的特征点
* matches1to2 – 源图像1的特征点匹配源图像2的特征点[matches[i]] .
* outImg – 输出图像具体由flags决定.
* matchColor – 匹配的颜色(特征点和连线),若matchColor==Scalar::all(-1),颜色随机.
* singlePointColor – 单个点的颜色,即未配对的特征点,若matchColor==Scalar::all(-1),颜色随机.
matchesMask – Mask决定哪些点将被画出,若为空,则画出所有匹配点.
* flags – Fdefined by DrawMatchesFlags.

*/

您可能感兴趣的与本文相关的镜像

Qwen-Image-Edit-2509

Qwen-Image-Edit-2509

图片编辑
Qwen

Qwen-Image-Edit-2509 是阿里巴巴通义千问团队于2025年9月发布的最新图像编辑AI模型,主要支持多图编辑,包括“人物+人物”、“人物+商品”等组合玩法

OpenCV 中自带的 SIFT(Scale-Invariant Feature Transform)算法接口函数可以通过 `cv2.xfeatures2d.SIFT_create()` 来调用。SIFT 是一种用于图像特征检测和描述的算法,具有尺度不变性和旋转不变性,广泛应用于图像匹配、图像检索和三维重建等领域。 在使用 SIFT 接口之前,需要确保 OpenCV 是带有额外模块(`opencv_contrib`)编译安装的,因为 SIFT 算法实现位于 `xfeatures2d` 模块中,不属于 OpenCV 的核心模块[^1]。 ### SIFT 接口函数的基本使用方法 ```python import cv2 as cv # 读取图像 image = cv.imread('example.jpg', cv.IMREAD_GRAYSCALE) # 创建 SIFT 对象 sift = cv.xfeatures2d.SIFT_create() # 检测关键点并计算描述子 keypoints, descriptors = sift.detectAndCompute(image, None) # 绘制关键点 output_image = cv.drawKeypoints(image, keypoints, None, flags=cv.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS) # 显示结果 cv.imshow('SIFT Keypoints', output_image) cv.waitKey(0) cv.destroyAllWindows() ``` ### 参数说明 - `nfeatures`:最多保留的关键点数量,默认为 0,表示不限制数量。 - `nOctaveLayers`:每组尺度空间的层数,默认为 3。 - `contrastThreshold`:对比度阈值,用于过滤低对比度的关键点。 - `edgeThreshold`:边缘响应阈值,用于去除边缘响应过强的点。 - `sigma`:初始高斯核的标准差,用于图像金字塔的构建。 ### 注意事项 - OpenCV 3.x 及以上版本中,SIFT 接口位于 `xfeatures2d` 模块中,需确保已安装 `opencv_contrib` 包。 - OpenCV 4.x 版本同样支持 SIFT,但同样依赖 `opencv_contrib` 的构建配置[^1]。 ### SIFT 算法的优势 - 对图像的尺度、旋转和光照变化具有良好的不变性。 - 提取的特征向量可以用于匹配、识别和分类等任务。 - 在多种图像处理任务中表现出色,尤其是在图像匹配和三维重建方面。 ### 其他相关接口 除了 SIFTOpenCV 还提供了 SURF、ORB、BRISK、AKAZE 等多种特征检测与描述算法接口,可根据具体应用场景选择合适的算法。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值