用 Codex 或 Claude 帮你安装 复制这段 Prompt,粘贴到 Codex、Claude 或其他助手里,让它检查 Skill 页面并帮你完成安装。
直接命令不会经过审查 Prompt;运行前请先检查来源。
npx skills add https://github.com/MIUAV/vibe-coding-ros2 --skill feature-detection命令会保持在同一行。复制前请横向滚动并检查完整内容。
想先保存到本地?可下载 SkillsMP 当前能够提供的文件。
基于 SOC 职业分类
正在显示 SKILL.md
| name | feature-detection |
| description | OpenCV4 特征检测技能 - SIFT、SURF、ORB、AKAZE、FAST、BRISK 特征提取与匹配 |
| user-invocable | true |
| argument-hint | 特征检测 OR SIFT OR ORB OR 特征匹配 OR 图像拼接 |
特征检测与匹配完整指南
当需要以下帮助时使用此技能:
| 算法 | 旋转不变 | 尺度不变 | 速度 | 专利 |
|---|---|---|---|---|
| SIFT | ✓ | ✓ | 慢 | 是 |
| SURF | ✓ | ✓ | 中 | 是 |
| ORB | ✓ | ✗ | 快 | 否 |
| AKAZE | ✓ | ✓ | 中 | 否 |
| FAST | ✗ | ✗ | 很快 | 否 |
| BRISK | ✓ | ✓ | 快 | 否 |
import cv2
# 创建 SIFT 检测器
sift = cv2.SIFT_create()
# 检测特征点和描述符
keypoints, descriptors = sift.detectAndCompute(gray, None)
# 绘制特征点
img_with_kp = cv2.drawKeypoints(img, keypoints, None,
flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
# BFMatcher 匹配
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
# 绘制匹配结果
result = cv2.drawMatches(img1, kp1, img2, kp2, matches, None)
# 创建 ORB 检测器
orb = cv2.ORB_create(nfeatures=500)
# 检测
keypoints, descriptors = orb.detectAndCompute(gray, None)
# 绘制
img_with_kp = cv2.drawKeypoints(img, keypoints, None, (0, 255, 0))
# 使用 Hamming 距离匹配(ORB 专用)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)
# KNN 匹配
matches = bf.knnMatch(des1, des2, k=2)
good_matches = [m for m, n in matches if m.distance < 0.75 * n.distance]
# 创建 AKAZE 检测器
akaze = cv2.AKAZE_create()
# 检测
keypoints, descriptors = akaze.detectAndCompute(gray, None)
# DMatcher(支持 AKAZE)
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
def stitch_images(images):
stitcher = cv2.Stitcher_create(cv2.STITCHER_PANORAMA)
status, panorama = stitcher.stitch(images)
if status == 0:
return panorama
else:
raise ValueError(f"Stitching failed with status {status}")
#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>
#include <opencv2/features2d.hpp>
using namespace cv;
// SIFT 特征检测
Ptr<SIFT> sift = SIFT_create();
vector<KeyPoint> keypoints;
Mat descriptors;
sift->detectAndCompute(gray, noArray(), keypoints, descriptors);
// ORB 特征检测
Ptr<ORB> orb = ORB_create();
orb->detectAndCompute(gray, noArray(), keypoints, descriptors);
// BFMatcher
BFMatcher matcher(NORM_HAMMING, true);
vector<DMatch> matches;
matcher.match(descriptors1, descriptors2, matches);
// 绘制匹配
Mat result;
drawMatches(img1, kp1, img2, kp2, matches, result);
图像1 → 特征检测 → 描述符提取
↓
图像2 → 特征检测 → 描述符提取
↓
特征匹配 (BF/FLANN)
↓
匹配结果
↓
去噪过滤 (Lowe's ratio)
↓
单应性矩阵估计 (RANSAC)
↓
透视变换/融合
# 获取匹配点坐标
src_pts = np.float32([kp1[m.queryIdx].pt for m in good_matches])
dst_pts = np.float32([kp2[m.trainIdx].pt for m in good_matches])
# 计算单应性矩阵
H, mask = cv2.findHomography(src_pts, dst_pts, cv2.RANSAC, 5.0)
# 过滤内点
inliers = [matches[i] for i in range(len(matches)) if mask[i]]
算法选择:
ORB > FAST > BRISKSIFT > SURF > AKAZEAKAZE > ORB匹配优化:
特征点数量:
| 问题 | 解决方案 |
|---|---|
| 匹配点太少 | 降低匹配阈值或使用多尺度检测 |
| 匹配噪声多 | 提高 Lowe's ratio 阈值到 0.7 |
| 实时性差 | 使用 ORB/FAST,限制特征点数量 |