当前位置: 首页 > wzjs >正文

网站制作自助推广引流网站

网站制作自助,推广引流网站,中小企业管理软件排名,软件开发软件定制OpenCV 中提供了多种常用的特征提取算法,广泛应用于图像匹配、拼接、SLAM、物体识别等任务。以下是 OpenCV 中几个主流特征提取算法的 用法总结与代码示例,涵盖 C 和 Python 两个版本。常用特征提取算法列表算法特点是否需额外模块SIFT(尺度不…

OpenCV 中提供了多种常用的特征提取算法,广泛应用于图像匹配、拼接、SLAM、物体识别等任务。以下是 OpenCV 中几个主流特征提取算法的 用法总结与代码示例,涵盖 C++ 和 Python 两个版本。


常用特征提取算法列表

算法特点是否需额外模块
SIFT(尺度不变特征)稳定性强、可旋转缩放xfeatures2d 模块
SURF(加速稳健特征)快速但专利保护xfeatures2d 模块
ORB(Oriented FAST + BRIEF)免费、高速OpenCV 主模块
AKAZE适用于非线性尺度空间OpenCV 主模块
BRISK二进制描述子、适用于实时应用OpenCV 主模块

示例一:ORB 特征提取与匹配

Python 版:

import cv2# 加载图像
img1 = cv2.imread("image1.jpg", cv2.IMREAD_GRAYSCALE)
img2 = cv2.imread("image2.jpg", cv2.IMREAD_GRAYSCALE)# 创建 ORB 检测器
orb = cv2.ORB_create()# 检测关键点和计算描述子
kp1, des1 = orb.detectAndCompute(img1, None)
kp2, des2 = orb.detectAndCompute(img2, None)# 创建匹配器
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(des1, des2)# 排序并绘制前 20 个匹配点
matches = sorted(matches, key=lambda x: x.distance)
matched_img = cv2.drawMatches(img1, kp1, img2, kp2, matches[:20], None, flags=2)cv2.imshow("ORB Matches", matched_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

C++ 版:

#include <opencv2/opencv.hpp>
#include <opencv2/features2d.hpp>int main()
{cv::Mat img1 = cv::imread("image1.jpg", cv::IMREAD_GRAYSCALE);cv::Mat img2 = cv::imread("image2.jpg", cv::IMREAD_GRAYSCALE);cv::Ptr<cv::ORB> orb = cv::ORB::create();std::vector<cv::KeyPoint> kp1, kp2;cv::Mat des1, des2;orb->detectAndCompute(img1, cv::noArray(), kp1, des1);orb->detectAndCompute(img2, cv::noArray(), kp2, des2);cv::BFMatcher matcher(cv::NORM_HAMMING, true);std::vector<cv::DMatch> matches;matcher.match(des1, des2, matches);std::sort(matches.begin(), matches.end(),[](const cv::DMatch& m1, const cv::DMatch& m2) {return m1.distance < m2.distance;});cv::Mat img_matches;cv::drawMatches(img1, kp1, img2, kp2, matches, img_matches);cv::imshow("ORB Matches", img_matches);cv::waitKey(0);return 0;
}

示例二:SIFT 特征提取(需额外模块)

Python 版:

import cv2sift = cv2.SIFT_create()
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
kp, des = sift.detectAndCompute(img, None)img_kp = cv2.drawKeypoints(img, kp, None, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)
cv2.imshow("SIFT Features", img_kp)
cv2.waitKey(0)

注意:SIFT 在 OpenCV 4.x 中已开放为免费使用,需 pip install opencv-contrib-python


C++ 版:

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>int main()
{cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);cv::Ptr<cv::SIFT> sift = cv::SIFT::create();std::vector<cv::KeyPoint> keypoints;cv::Mat descriptors;sift->detectAndCompute(img, cv::noArray(), keypoints, descriptors);cv::Mat output;cv::drawKeypoints(img, keypoints, output, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);cv::imshow("SIFT", output);cv::waitKey(0);return 0;
}

示例三:AKAZE 特征提取

Python 版:

import cv2akaze = cv2.AKAZE_create()
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)
kp, des = akaze.detectAndCompute(img, None)img_kp = cv2.drawKeypoints(img, kp, None, color=(0,255,0))
cv2.imshow("AKAZE", img_kp)
cv2.waitKey(0)

C++ 版:

#include <opencv2/opencv.hpp>int main()
{cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);cv::Ptr<cv::AKAZE> akaze = cv::AKAZE::create();std::vector<cv::KeyPoint> keypoints;cv::Mat descriptors;akaze->detectAndCompute(img, cv::noArray(), keypoints, descriptors);cv::Mat output;cv::drawKeypoints(img, keypoints, output);cv::imshow("AKAZE", output);cv::waitKey(0);return 0;
}

示例四:SURF 特征提取

小提示

SURF 属于专利算法(由 Hessian Matrix 加速构建特征),因此默认在 opencv-python不可用,需要使用 opencv-contrib 版本:

  • Python: pip install opencv-contrib-python
  • C++: 编译 OpenCV 时需启用 opencv_contrib,并启用 xfeatures2d 模块。

Python 示例

import cv2
import numpy as np# 读取图像
img = cv2.imread("image.jpg", cv2.IMREAD_GRAYSCALE)# 创建 SURF 对象(阈值越高,检测特征点越少)
surf = cv2.xfeatures2d.SURF_create(hessianThreshold=400)# 检测并计算特征点和描述子
keypoints, descriptors = surf.detectAndCompute(img, None)# 绘制关键点
img_kp = cv2.drawKeypoints(img, keypoints, None, (0,255,0), flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)cv2.imshow("SURF Features", img_kp)
cv2.waitKey(0)
cv2.destroyAllWindows()

C++ 示例

#include <opencv2/opencv.hpp>
#include <opencv2/xfeatures2d.hpp>int main()
{cv::Mat img = cv::imread("image.jpg", cv::IMREAD_GRAYSCALE);if (img.empty()) {std::cerr << "Cannot load image!" << std::endl;return -1;}// 创建 SURF 检测器cv::Ptr<cv::xfeatures2d::SURF> surf = cv::xfeatures2d::SURF::create(400); // Hessian thresholdstd::vector<cv::KeyPoint> keypoints;cv::Mat descriptors;surf->detectAndCompute(img, cv::noArray(), keypoints, descriptors);cv::Mat output;cv::drawKeypoints(img, keypoints, output, cv::Scalar::all(-1), cv::DrawMatchesFlags::DRAW_RICH_KEYPOINTS);cv::imshow("SURF", output);cv::waitKey(0);return 0;
}

特征提取算法比较总结

算法是否开源描述子类型匹配类型特点
SIFT浮点(128维)L2(欧氏距离)稳定性好,适合图像拼接
SURF❌(专利)浮点L2快速但已过时
ORB二值(256位)Hamming(汉明)快速,适合实时系统
AKAZE二值或浮点Hamming/L2稳定性与速度兼顾
BRISK二值Hamming实时性强

小结

  • 推荐优先使用 ORBAKAZE(开源 + 高速);
  • 高精度图像处理可考虑 SIFT
  • 所有算法都可配合 BFMatcherFLANN 进行匹配;
  • 选择依据:速度要求匹配精度是否支持缩放旋转

http://www.dtcms.com/wzjs/518879.html

相关文章:

  • 网络运维服务方案网站seo服务
  • 怎么查网站是哪家公司做的我想做地推怎么找渠道
  • 武昌做网站培训机构招生方案模板
  • 个人网站的设计crm
  • 企业园林设计网站模板关键词seo优化排名公司
  • vue.js合作做网站么世界足球排名前100名
  • java做的网站的后缀是什么格式深圳网站制作公司
  • 做扎染的网站深圳全网推广服务
  • 深圳网站建设公司北京搜索引擎关键词优化
  • 个人做哪方面网站seoul什么意思
  • 佛山高端网站建设公司易推客app拉新平台
  • 微信分享网站怎么隐藏域名百度知道网址
  • 怎样做网站制作团队星巴克seo网络推广
  • 做题网站中计算多项式的值怎么做江门关键词排名优化
  • 如何注册网站域名和购买虚拟主机黑帽seo优化
  • 博览局网站建设网络营销工程师培训
  • 网站的付款链接怎么做的商品推广软文写作500字
  • 虫虫wap建站源码重庆森林经典台词梁朝伟
  • 银川网站制作公司百度官方网平台
  • 天猫秘券网站怎么做百度营销app
  • 中国企业排行榜前十名湖南竞价优化哪家好
  • 支付商城网站制作东莞网站推广排名
  • 做网站页面该建多大的画布东莞网站关键词优化公司
  • 杭州网站推广优化友情链接互换网站
  • 怎么做网站教程图片宁波网站建设优化企业
  • 湘潭网站建设优化建站长沙seo网站排名优化公司
  • 网站开发遇到的难点天猫店铺申请条件及费用
  • 做食物网站应该考虑些什么意思国际足联世界排名
  • 做平台的网站网络推广公司专业网络
  • 网站网页能自己做吗上海短视频推广