C++面试八股文(opencv step2)
1. SIFT、SURF 和 ORB 的区别
- SIFT (Scale-Invariant Feature Transform)提取尺度和旋转不变的关键点,匹配精度高,适合复杂场景缺点:计算量大,早期受专利限制
- SURF (Speeded-Up Robust Features)SIFT 的加速版本,计算速度快,性能略低于 SIFT缺点:仍受专利限制
- ORB (Oriented FAST and Rotated BRIEF)免费开源,速度快,适合实时应用缺点:特征点稳定性比 SIFT/SURF 稍差,抗尺度能力弱
2. 如何使用 ORB 进行特征检测
- ORB 是快速特征检测算法,结合了 FAST 关键点检测 + BRIEF 描述符。
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 读取图像为灰度图
Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
// 创建 ORB 特征检测器
Ptr<ORB> orb = ORB::create();
std::vector<KeyPoint> keypoints; // 存储关键点
Mat descriptors; // 存储描述符
// 检测关键点并计算描述符
orb->detectAndCompute(img, noArray(), keypoints, descriptors);
// 绘制关键点
Mat output;
drawKeypoints(img, keypoints, output, Scalar(0,255,0), DrawMatchesFlags::DEFAULT);
imshow("ORB Features", output);
waitKey(0);
return 0;
}
3. 模板匹配 (Template Matching)
- 概念:在大图中找到与小模板图像最相似的位置,常用于物体定位。
- 实现方法:
Mat img = imread("scene.jpg");
Mat templ = imread("template.jpg");
Mat result;
// 使用归一化相关系数方法进行模板匹配
matchTemplate(img, templ, result, TM_CCOEFF_NORMED);
// 找到匹配最好的位置
double minVal, maxVal;
Point minLoc, maxLoc;
minMaxLoc(result, &minVal, &maxVal, &minLoc, &maxLoc);
// 在匹配位置画矩形
rectangle(img, maxLoc, Point(maxLoc.x + templ.cols, maxLoc.y + templ.rows), Scalar(0,0,255), 2);
imshow("Template Matched", img);
waitKey(0);
4. 图像金字塔 (Image Pyramid)
- 概念:金字塔是图像的多分辨率表示,用于多尺度处理。高斯金字塔:每一层都是上一层低通滤波 + 下采样拉普拉斯金字塔:由高斯金字塔计算得到,用于图像融合
- C++ 高斯金字塔示例:
Mat img = imread("example.jpg");
Mat pyrDownImg, pyrUpImg;
// 下采样:减半图像尺寸
pyrDown(img, pyrDownImg);
// 上采样:放大回原尺寸
pyrUp(pyrDownImg, pyrUpImg);
imshow("Original", img);
imshow("PyrDown", pyrDownImg);
imshow("PyrUp", pyrUpImg);
waitKey(0);
5. cv::findContours() 的作用 & 绘制轮廓
- 作用:提取二值图像中的轮廓点,常用于形状分析或目标检测
- 示例:
Mat img = imread("example.jpg", IMREAD_GRAYSCALE);
Mat bin
剩余60%内容,订阅专栏后可继续查看/也可单篇购买
C++八股文全集 文章被收录于专栏
本专栏系统梳理C++技术面试核心考点,涵盖语言基础、面向对象、内存管理、STL容器、模板编程及经典算法。从引用指针、虚函数表、智能指针等底层原理,到继承多态、运算符重载等OOP特性从const、static、inline等关键字辨析,到动态规划、KMP算法、并查集等手写实现。每个知识点以面试答题形式呈现,注重原理阐述而非冗长代码,帮助你快速构建完整知识体系,从容应对面试官提问,顺利拿下offer。