面试问题总结——关于OpenCV

2023-05-16

  • 整理了一下网上和我面试中遇到的关于OpenCV相关的问题。

其中因为我的简历中有个项目用到了特征点检测相关的知识,所以整理了SIFT/SURF和FLANN。
有些知识点也不深入,对于写的不对的地方,欢迎指正。

在这里插入图片描述

关于OpenCV的内容

1.OpenCV中cv::Mat的深拷贝和浅拷贝问题

  深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。
  浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。

OpenCV的Mat时,有几种赋值方式分别为:
  深拷贝是 b = a.clone();a.copyTo(b);
  浅拷贝是 b = a;和 b(a);

  关于这个问题,我还测试了OpenCV中的ROI,就是图像截图,发现ROI也是浅拷贝。

  C++中利用opencv存储图像的结构体是Mat。

2. OpenCV中RGB2GRAY是怎么实现的

  本质上就是寻找一个三维空间到一维空间的映射,以R、G、B为轴建立空间直角坐标系,则图片上的每一个像素点都可以用一个点表示,则可以通过一个公式Gray = 0.29900×R + 0.58700×G + 0.11400×B,来完成一维空间的映射。

3.连续图像转化为数字图像需要进行哪些操作?

  取样 量化

4.数字图像中有哪些基本特征?

  颜色特征、纹理特征、形状特征、空间关系特征等。

5.图像边缘检测中常用的边缘检测算子有哪些?

  Roberts算子、Prewitt算子、Sobel算子、Canny算子、Laplacian算子等。

6.对霍夫变换的理解

  霍夫变换常用来提取图像中的直线和圆等几何形状。它通过一种投票算法检测具有特定形状的物体,就是通过计算累计结果的局部最大值得到一个符合该几何形状的集合作为结果。

  算法原理:针对每个像素点,使得Θ在-90度到180度之间,用极坐标p = xcosΘ + ysinΘ计算得到共270组(p,theta)代表着霍夫空间的270条直线。将这270组值存储到H中。如果一组点共线,则这组点中的每个值,都会使得H(p,Θ)加1,因此找到最大的H值,就是共线的点最多的直线,也可以通过设定阈值来判定。

7.对HOG特征的理解

  其主要思想是:在边缘具体位置未知的情况下,边缘方向的分布也可以很好的表示行人目标的外形轮廓,即梯度的统计信息,而梯度主要位于边缘的地方很好地描述。
  HOG特征检测算法的几个步骤:颜色空间归一化—>梯度计算—>梯度方向直方图—>重叠块直方图归一化—>HOG特征

8.图像的插值方法有哪些?

  最近邻法
  双线性内插法
  三次内插法

9. Grabcut的基本原理和应用

  Graph CutGrab Cut算法,两者都是基于图论的分割方法。
  Graph Cut在计算机视觉领域普遍应用于前背景分割、抠图等。
  基本原理:根据待分割的图像,确定图的节点与边,即图的形状已确定下来,是给图中所有边赋值相应的权值,然后找到权值和最小的边的组合,就完成了图像分割。

10. SIFT/SURF的特征提取方法,是如何保持尺度不变性的?

  SIFT(Scale-Invariant Feature Transform)算法的实质是在不同的尺度空间上查找关键点(特征点),并计算出关键点的方向。SIFT所查找到的关键点是一些十分突出,不会因光照,仿射变换和噪音等因素而变化的点,如角点、边缘点、暗区的亮点及亮区的暗点等。

  如何保持尺度不变性?
①尺度空间极值检测:搜索所有尺度上的图像位置。通过高斯差分函数来识别潜在的对于尺度和旋转不变的关键点。(第一步获取图片的高斯金字塔,高斯金字塔指的是图片在不同尺寸下进行的高斯模糊处理后的图片,为了寻找图片的特征点,我们要找到图片在不同尺寸空间里的极值,这些极值通常存在于图片的边缘或者灰度突变的地方,所以要对高斯模糊后的图片进行高斯差分,然后到寻找极值点。)
②关键点定位:由于图片的坐标是离散,所以要精确定位的话,作者采用了曲面拟合的方法,通过插值找到真正极值点的位置,位置找到之后,我们要找到这个极值点的主方向。
③关键点方向确定:基于图像局部的梯度方向,分配给每个关键点位置一个或多个方向。所有后面的对图像数据的操作都相对于关键点的方向、尺度和位置进行变换,从而保证了对于这些变换的不变性。
④关键点描述:在每个关键点周围的邻域内,在选定的尺度上测量图像局部的梯度。这些梯度作为关键点的描述符,它允许比较大的局部形状的变形或光照变化。

  SURF是在SIFT的基础上改进的,原理基本相似,在特征点检测这儿,SIFT是先进行非极大值抑制,再去除低对比度的点,最后再通过Hessian矩阵去除边缘的点;而SURF是先用Hessian矩阵确定候选点,然后再进行非极大值抑制,该算法提高了SIFT的速度和鲁棒性,且理论上SURF是SIFT速度的3倍。(见书《OpenCV3编程入门》P417)

11.关于FLANN算法

  FLANN算法也属于关键点匹配算法,算法步骤整体来说分为两步:一是建立索引,而是搜索。
  建立索引:其实就是要两部分参数,一是数据也就是mat矩阵,二是一些具体参数,这个参数要根据建立的索引类型来设置。而有哪些索引类型呢?共有:线性索引、KD-Tree索引、K均值索引、复合索引、LSH方法索引、自动索引六种。
  进行搜索:有两种搜索方式 :搜索k邻近 (具体点的个数由用户设定,设n个就一定返回n个)、搜索半径最近 (即可能不存在符合条件的点,则返回空的)。
  SIFT/SURF是基于浮点数的匹配,ORB是二值匹配,速度更快。对于FLANN匹配算法,当使用ORB匹配算法的时候,需要重新构造HASH。

12. Canny边缘检测的流程

  图像降噪——计算图像梯度,得到可能边缘——非极大值抑制——双阈值筛选

13. 图像锐化 – sharpen

  平滑:把图像变模糊;
  锐化:把图像变清晰;
  图像锐化主要用于增强图像的灰度跳变部分,这和图像平滑对灰度跳变的抑制正好相反。

14. 图像对比度

  对比度:指一幅图像中灰度反差的大小;
  对比度 = 最大亮度 / 最小亮度

15. 图像滤波

  定义:把滤波想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像上,透过该窗口查看。
  滤波的作用:去除图像中的噪声
  低通滤波器:去除图像中的高频部分——模糊化
  高通滤波器:去除图像中的低频部分——锐化
  线性滤波器:方框滤波、均值滤波、高斯滤波
  非线性滤波:中值滤波、双边滤波

16. OpenCV中图像加法(cv2.add())与图像融合(cv2.addWeighted())有何区别?

  图像加法:目标图像 = 图像1 + 图像2
  图像融合:目标图像 = 图像1 × 系数1 + 图像2 × 系数2 + 亮度调节量

17.如何检测图片中的汽车,并识别车型,如果有遮挡怎么办?

  首先这是一个细粒度的分类(Fine-Grained Classification)问题,和普通的分类不一样,要分类的类别往往只是有细微的差异。
  思路:
①人工框定局部图像,然后识别。比如我去框定,汽车的车灯,汽车的前脸,汽车轮毂等,然后用 cnn或 deep cnn其他的分类器做这些的分类,对于分类器来说输入是汽车的车灯+汽车的前脸+汽车轮毂,而不是整张图片,分类器再从车灯前脸等提取高级特征,从而得到一个分类模型。
②不做局部变换,做图片整体识别。但是做分级或是分层。首先,训练第一个分类器,它只针对汽车和非汽车进行分类,标记了car 和 other。这一步要求尽可能的广,涵盖生活中常见的图片,力求98%以上的准确率,每个分类用了2w张图片,实际上能达到99.5%的准确率。接着,对于汽车做品牌分类器,只对汽车所属的品牌进行分类,不对细分的子品牌分类。这一步每一类人工标记5000张图片,输入是第一步的输出,准确率能达到96%以上。
最后,对每个品牌的汽车进行车型分类,这一层识别率在94%左右。这样会得到一个0.98×0.96×0.94~0.88的识别率。

18.常用图像增强算法

  ①直方图均衡化:直方图均衡化是图像处理领域中利用图像直方图对对比度进行调整的方法。
这种方法通常用来增加许多图像的局部对比度,这种方法对于背景和前景都太亮或者太暗的图像非常有用,这种方法尤其是可以带来X光图像中更好的骨骼结构显示以及曝光过度或者曝光不足照片中更好的细节。

  ②对数图像增强算法:对数图像增强是图像增强的一种常见方法,其公式为: S = c log(r+1),其中c是常数(以下算法c=255/(log(256)),这样可以实现整个画面的亮度增大。

  ③指数图像增强算法:指数图像增强的表达为:S = cR^r,通过合理的选择c和r可以压缩灰度范围,算法以c=1.0/255.0, r=2实现。

  ④加Masaic算法(马赛克):原理:用中心像素来表示邻域像素

  ⑤曝光过度问题处理:对于曝光过度问题,可以通过计算当前图像的反相(255-image),然后取当前图像和反相图像的较小者为当前像素位置的值。

  ⑥高反差保留:高反差保留主要是将图像中颜色、明暗反差较大两部分的交界处保留下来,比如图像中有一个人和一块石头,那么石头的轮廓线和人的轮廓线以及面部、服装等有明显线条的地方会变被保留,而其他大面积无明显明暗变化的地方则生成棕灰色。其表达形式为:dst = r×(img - Blur(img))。

  ⑦拉普拉斯算子图像增强:使用中心为5的8邻域拉普拉斯算子与图像卷积可以达到锐化增强图像的目的。

  ⑧Gamma校正:伽马变换主要用于图像的校正,将灰度过高或者灰度过低的图片进行修正,增强对比度。伽马变换对图像的修正作用其实就是通过增强低灰度或高灰度的细节实现的。

19.数字图像处理中常用图像分割算法有哪些?

  ①多数的图像分割算法:均是基于灰度值的不连续和相似的性质。

  ②图像边缘分割:边缘是图像中灰度突变像素的集合,一般用微分进行检测。基本的边缘检测算法有:Roberts算子、Sobel算子。稍高级的算法有:Canny边缘检测器。

  ③图像阈值分割:由于阈值处理直观、实现简单且计算速度快,因此阈值处理在分割应用中处于核心地位。如Otsu(最大类间方差算法)算法。

  ④基于区域的分割:区域生长算法和区域分裂与聚合都是属于基于区域的分割算法。

  ⑤形态学分水岭算法

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

面试问题总结——关于OpenCV 的相关文章

  • 使用 Xcode 为 OS X Lion / Mountain Lion 编译 OpenCV (2.3.1+)

    谁能给我提供一些如何使用 Xcode 在 OS X Lion 上编译 OpenCV 2 3 1 的详细指南 我对此很生气 我得到了源代码 使用 cmake 创建 Xcode 模板并尝试构建它 但它失败并出现大约 200 个错误 提前致谢 多
  • Opencv中内存Mat表示

    我知道在内存中opencv将Mat对象表示为一个大数组 因此 如果我有 3 个尺寸为 200x200 的通道垫 那么在内存中它将将该垫存储在尺寸为 3x200x200 的数组中 或者更一般地说 内存中的任何 Mat 都将存储为channel
  • 在OpenCV Python中编写4通道以上图像

    这对我来说是一个持续的挑战 我正在尝试使用 openCV 将两个 3 RGB 图像组合成一个 6 通道 TIFF 图像 到目前为止我的代码如下 import cv2 import numpy as np im1 cv2 imread im1
  • 如何使用 Python 3 在 OpenCV 3 上正确加载 cv2.KeyPoint 和描述符?

    有一天 我不得不恢复一个使用 OpenCV 3 和 Python 2 7 的旧项目 在此代码中 要加载 cv2 KeyPoint 我执行以下操作 import numpy as np import cPickle import cv2 ke
  • 如何在没有 OpenCv Manager 的情况下运行 OpenCV 代码

    我正在使用 OpenCV4Android 版本 2 4 10 并在 Samsung Galayx GT I9300 上测试我的代码 我遇到的问题是 我必须从 Play 商店下载 Opencv Manager 以便我的 opencv 代码运行
  • 从一个 Mat 复制到另一个 Mat 仅接近黑色像素

    I have Mat difference其中有一些黑色像素 或者几乎是黑色像素 gt 如果发生地震 建筑物会移动等 并且Mat current它由具有自然色彩的真实图像组成 我想替换中的像素Mat current这些黑色像素Mat dif
  • 使用 Unity3D 解决 PnP

    我有一个真实 物理的棍子 上面连接有红外摄像头和一些红外 LED 它们形成了我正在使用的模式 以便使虚拟棍子以与物理棍子相同的方式移动 为此 我在 Python 中使用 OpenCV 并将由solvePnP 计算的旋转和平移向量发送到 Un
  • 用于 C++ 中图像分析的 OpenCV 二进制图像掩模

    我正在尝试分析一些图像 这些图像的外部周围有很多噪声 但内部有一个清晰的圆形中心 中心是我感兴趣的部分 但外部噪声正在影响我对图像的二进制阈值处理 为了忽略噪音 我尝试设置一个已知中心位置和半径的圆形蒙版 从而使该圆之外的所有像素都更改为黑
  • 跟踪白色背景中的白球(Python/OpenCV)

    我在 Python 3 中使用 OpenCV 来检测白场上的白 黑球 并给出它的精确 x y 半径 和颜色 我使用函数 cv2 Canny 和 cv2 findContours 来找到它 但问题是 cv2 Canny 并不总是检测到圆的完整
  • 有没有办法检测图像是否模糊? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想知道是否有一种方法可以通过分析图像数据来确定图像是否模糊 估计图像清晰度的另一种非常简单的方法是使用拉普拉斯 或 LoG 滤波器并
  • Pyinstaller“无法执行脚本 pyi_rth_pkgres”并且缺少软件包

    这是我第一次在这里发布问题 因为我的大部分问题已经被其他人回答了 我正在 python 中开发 GUI 应用程序 并尝试使用 pyinstaller 将其打包到单个文件夹和 exe 中 以便于移植 目前 我使用 Windows 10 和 a
  • 如何使用 OpenCV 从图像中获取调色板 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想提取图像的调色板 类似于此 来自 我需要它来提取特定的颜色 如黄色 绿色和棕色 并显示该颜色覆盖的区域的百分比 另外 我可以添加更
  • 将线性数组转换为二维矩阵

    我有一个浮点指针 数组 它代表一个图像 它的元素计数和索引具有宽度 高度 图像不像矩阵 其原点位于左上角 相反 它的原点位于左下角 就像在笛卡尔坐标系中一样 达到最大宽度后 它从左侧开始下一行 所以我想有效地将 这个数组转换为二维矩阵 可选
  • 在 Android 中使用 OpenCV 查找图像匹配

    我正在尝试构建一个 Android 应用程序 该应用程序可以比较设备相机拍摄的照片 以在一组图像中找到匹配项 我已经在 Android Studio 上配置了 OpenCV 但仅此而已 有人可以通过链接到资源或建议教程来提供帮助吗 Open
  • 对同色像素块的边界进行着色

    我有一张有 5 种不同颜色的图像 在这种情况下 随机生成 w h 40 27 img Image new RGB w h pixels img load available colors r 255 13 18 b 72 64 255 y
  • 使用 cv2 在 python 中创建多通道零垫

    我想用 cv2 opencv 包装器在 python 中创建一个多通道 mat 对象 我在网上找到了一些例子 其中 c Mat zeros 被 numpy zeros 替换 这看起来不错 但似乎没有多通道类型适合 看代码 import cv
  • opencv如何使用鼠标事件不规则地选择图像区域? c/c++ [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 最近在学习opencv 有没有办法使用鼠标事件选择图像区域 我已经尝试过三角形的了 如果我想选择特定区域而不是三角形怎么办 谢谢你 我对此进
  • Opencv 运动检测与跟踪

    我需要在网络摄像头的视频帧中进行强大的运动检测和跟踪 背景总是一样的 目的是识别物体的位置 如果可能的话没有阴影 但并不急于去除阴影 我已经尝试过用于背景减法和阈值化的opencv算法 但这仅取决于一个图像作为背景 如果背景的亮度 或相机自
  • 在OpenCV中将YUV转换为BGR或RGB

    我有一个电视采集卡 其输入内容为 YUV 格式 我在这里看到了与此问题类似的其他帖子 并尝试尝试所述的所有可能的方法 但它们都没有提供清晰的图像 目前最好的结果是 OpenCVcvCvtColor scr dst CV YUV2BGR 函数
  • 将向量 转换为大小为 (n x 3) 的 Mat,反之亦然

    我有 Point3d 向量 向量形式的点云 如果我使用 OpenCV 提供的转换 比如 cv Mat tmpMat cv Mat pts Here pts is vector

随机推荐

  • 《FPGA学习》->蜂鸣器播放

    x1f34e 与其担心未来 xff0c 不如现在好好努力 在这条路上 xff0c 只有奋斗才能给你安全感 你若努力 xff0c 全世界都会为你让路 蜂鸣器的发声原理由振动装置和谐振装置组成 xff0c 而蜂鸣器又分为无源他激型与有源自激型
  • 基于STM32的语音控制电机

    号外号外 单片机项目实战课程又更新了 炸弹 大家好 我是 朽木自雕i 一个闲暇时间用来敲敲代码 画画板子 焊焊电路 玩玩单片机 搞搞Linux 写写Blog记录成长的技术人er 很高兴再次见
  • ESP32单片机入门篇

    目录 一 ESP32单片机的基本概念 1 双核架构 2 Wi Fi和蓝牙功能 3 集成多种外设 4 支持多种操作系统 二 开发环境 1 Arduino IDE 2 ESP IDF 三 开发语言 四 注意事项 五 代码例程 xff08 1 x
  • 什么是死锁,产生死锁的原因及必要条件

    什么是死锁 xff1f 所谓死锁 xff0c 是指多个进程在运行过程中因争夺资源而造成的一种僵局 xff0c 当进程处于这种僵持状态时 xff0c 若无外力作用 xff0c 它们都将无法再向前推进 因此我们举个例子来描述 xff0c 如果此
  • ESP32红外控制舵机

    目录 一 ESP32红外解码 二 ESP32舵机控制 三 ESP32红外控制舵机 结语 ESP32作为一款功能强大的单片机 xff0c 常被应用于物联网 智能家居 智能硬件等领域 与其他单片机相比 xff0c ESP32具有更高的运行速度和
  • ESP32 OTA升级

    目录 一 ESP32 OTA升级原理 1 ESP32固件编译 2 固件的远程传输 二 基于ESP32HTTPUpdate库的OTA升级 1 硬件准备 2 软件实现 三 注意事项 1 升级文件大小限制 2 WiFi稳定性 3 固件版本号 结语
  • 基于ESP32的温湿度环境监测

    目录 一 传感器介绍 二 设计思路 三 电路连接 四 项目代码 五 注意事项 一 传感器介绍 SCH30 是一款温湿度一体化数字传感器 xff0c 采用CMOSens 技术 xff0c 提供出色的性能 可靠性和稳定性 它还具有超低能耗 xf
  • 小觅相机SDK安装与报错解决

    目录 安装小觅相机SDK1 下载SDK2 准备依赖3 编译代码出现问题 xff1a 报错 xff1a 原因 xff1a 解决方案 xff1a 4 编译安装ROS版本ROS的安装 5 配置 bashrc文件6 运行相机 最后顺利完成SDK安装
  • 基于51单片机和物联网的智能家居系统(ESP8266物联网模块)

    前言 该智能家居系统以 STC89C52单片机为控制核心 xff0c 结合 LCD1602 液晶显示屏 L298N电机驱动模块 光敏电阻 xff0c ESP8266WiFi模块 xff0c DS18B20温度计设计并实现了自动感光窗帘与居室
  • aarch64-linux-gnu-gcc交叉编译链工具

    aarch64 linux gnu gcc交叉编译工具链 安装编译可执行文件交叉编译 自己记录学习所用 安装 按下 CTRL 43 ALT 43 T打开控制台 xff0c 输入如下指令安装 span class token comment
  • CMakeLists.txt的创建和基本使用

    文章目录 1 简单介绍2 一个简单的例子3 将主函数及库函数一起编译4 带上外部库 学习记录所用 1 简单介绍 CMakeLists txt文件的编写比MakeFile文件的编写更加简单和容易理解 CMakeLists txt通过cmake
  • linux线程切换怎么实现

    Linux线程切换的实现涉及到操作系统的调度 和线程上下文 的切换 线程上下文包括程序计数器 xff08 PC xff09 和寄存器值 xff0c 以及线程的堆栈和堆栈指针等 操作系统通过调度器决定哪个线程将获得CPU时间片来执行 当一个线
  • PID实时无线调参

    今天实现了PID参数的实时无线整定 xff0c 记录一下历程 1 将CRC h CRC c usart2 c usart2 h等文件添加到STM32工程中 如下图 xff1a 2 其中 xff0c CRC h CRC c用于数据包的校验 x
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(一)

    最近在做一个项目 xff0c 涉及到工业相机 xff0c 需要对其进行二次开发 相机方面选择了海康威视 xff0c 网上关于海康威视工业相机SDK的开发资料很少 xff0c 官方文档里面虽然写的是支持C 43 43 开发的 xff0c 但其
  • FFmpeg源码分析:写音视频帧av_write_frame()

    FFmpeg在libavformat模块提供音视频的muxer封装与demuxer解封装 其中muxer封装文件包括avformat write header av write frame 和av write trailer 本文主要探讨a
  • 海康威视工业相机SDK二次开发(VS+Opencv+QT+海康SDK+C++)(二)

    本文接上次的博客海康威视工业相机SDK二次开发 xff08 VS 43 Opencv 43 QT 43 海康SDK 43 C 43 43 xff09 xff08 一 xff09 xff0c 上个博客中并未用到QT xff0c 本文介绍项目内
  • 单目相机标定(使用Matlab)

    内容 一 单目视觉成像原理1 理想情况下相机成像模型1 1 世界坐标系 gt 相机坐标系1 2 相机坐标系 gt 图像坐标系1 3 图像坐标系 gt 像素坐标系1 4 总结 xff1a 世界坐标系 gt 像素坐标系 二 考虑畸变情况下相机成
  • 三菱PLC与上位机进行通讯

    三菱PLC与上位机串口通信 一 三菱Fx系列PLC编程口通讯协议地址算法1 DEVICE READ xff08 读出软设备状态值 xff09 2 DEVICE WRITE xff08 向PLC 软设备写入值 xff09 3 位设备强制置位
  • 关于相机的一些参数计算(靶面、视野等)

    1 靶面尺寸和芯片尺寸 比如我使用的是上面这个相机 xff0c 一直不懂1 1 8 39 是什么意思 span class token number 1 1 span 英寸 靶面尺寸为宽 span class token number 12
  • 面试问题总结——关于OpenCV

    整理了一下网上和我面试中遇到的关于OpenCV相关的问题 其中因为我的简历中有个项目用到了特征点检测相关的知识 xff0c 所以整理了SIFT SURF和FLANN 有些知识点也不深入 xff0c 对于写的不对的地方 xff0c 欢迎指正