面试问题总结——关于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 的相关文章

  • opencv createsamples没有错误,但是没有找到样本

    我在用着this http coding robin de 2013 07 22 train your own opencv haar classifier html教程 我正在根据我的正面图像创建大量样本 我正在使用 Windows 这是
  • 查找彼此接近的对象边界

    我正在研究一个计算机视觉问题 其中问题的第一步是找到物体彼此靠近的位置 例如 在下图中 我感兴趣的是找到灰色标记的区域 Input Output 我目前的方法是首先反转图像 然后通过侵蚀进行形态梯度跟随 然后删除一些不感兴趣的轮廓 脚本如下
  • 如何删除树莓派的相机预览

    我在我的 raspberryPi 上安装了 SimpleCv 并安装了用于使用相机板的驱动程序 uv4l 驱动程序 现在我想使用它 当我在 simpleCV shell Camera 0 getImage save foo jpg 上键入时
  • 如何设置K-means openCV c++的初始中心

    我正在尝试使用 OpenCv 和 Kmeans 对图像进行分割 我刚刚实现的代码如下 include opencv2 objdetect objdetect hpp include opencv2 highgui highgui hpp i
  • 如何使用 Python 将我的 GoPro Hero 4 相机直播连接到 openCV?

    我在尝试从我的新 GoPro Hero 4 相机捕获实时流并使用 openCV 对其进行一些图像处理时遇到麻烦 这是我的试用 创建的窗口上没有显示任何内容 import cv2 import argparse import time imp
  • 在 QtCreator 中将 OpenCV 2.3 与 Qt 结合使用

    随着 OpenCV 2 3 版本终于发布 我想在我的系统上编译并安装这个最新版本 由于我经常使用 Qt 和 QtCreator 我当然希望能够在我的 Qt 项目中使用它 我已经尝试了几种方法几个小时 但总是出现错误 第一次尝试 使用WITH
  • 使用Python的工业视觉相机[关闭]

    就目前情况而言 这个问题不太适合我们的问答形式 我们希望答案得到事实 参考资料或专业知识的支持 但这个问题可能会引发辩论 争论 民意调查或扩展讨论 如果您觉得这个问题可以改进并可能重新开放 访问帮助中心 help reopen questi
  • OpenCV 仅围绕大轮廓绘制矩形?

    第一次发帖 希望我以正确的方式放置代码 我正在尝试检测和计算视频中的车辆 因此 如果您查看下面的代码 我会在阈值处理和膨胀后找到图像的轮廓 然后我使用 drawContours 和矩形在检测到的轮廓周围绘制一个框 我试图在 drawCont
  • 来自连接到远程机器的相机的 Opencv 流

    我正在用 python 开发一个 wx 应用程序 用于流式传输和显示来自两个不同网络摄像头的视频 这工作正常 但现在我需要在不同的场景中执行此操作 其中两个摄像头连接在通过网络连接的 Windows 上运行的单独计算机中 我的应用程序将在机
  • 无法在 Windows 7 机器中使用 OpenCV 2.4.3、Python 2.7 打开“.mp4”视频文件

    我目前正在进行一个涉及读取 mp4 视频文件的项目 我遇到的问题是它在Windows 7机器上使用Python 2 7 32位 OpenCV 2 4 3 cv2 pyd 代码片段如下 try video cv2 VideoCapture v
  • opencv形态扩张滤波器作为最大滤波器

    就像中值滤波器的定义一样 我可以将 最大滤波器 定义为局部窗口 例如dst x y max 3x3 局部窗口像素 但我在opencv中找不到这样的过滤器 最接近的是 dilate 函数 然后我使用 dilate 函数的默认配置 但结果不正确
  • BASH 脚本编译多个 C++ 文件 - OpenCV

    请参见在C 和OpenCV中调用其他文件中的函数 https stackoverflow com questions 24442836 call functions in other files in c and opencv 对于最初的问
  • 如何在 OpenCV 中从 YUV 文件读取帧?

    如何在 OpenCV 中从 YUV 文件读取帧 我编写了一个非常简单的 python 代码来从二进制文件读取 YUV NV21 流 import cv2 import numpy as np class VideoCaptureYUV de
  • ffmpeg AVFrame 到 opencv Mat 转换

    我目前正在开发一个使用 ffmpeg 解码接收到的帧的项目 解码后 我想将 AVFrame 转换为 opencv Mat 帧 以便我可以在 imShow 函数上播放它 我拥有的是字节流 我将其读入缓冲区 解码为 AVFrame f fope
  • 如何使用 Python 裁剪图像中的矩形

    谁能给我关于如何裁剪两个矩形框并保存它的建议 我已经尝试过这段代码 但效果不佳 import cv2 import numpy as np Run the code with the image name keep pressing spa
  • OpenCV 错误:connectedComponents_sub1 中断言失败 (L.channels() == 1 && I.channels() == 1) [关闭]

    Closed 这个问题需要调试细节 help minimal reproducible example 目前不接受答案 我在 OpenCV python 中遇到以下错误 并用 google 搜索了很多 但无法解决 如果有人能为我提供一些线索
  • opencv人脸检测示例

    当我在设备上运行应用程序时 应用程序崩溃并显示以下按摩 java lang UnsatisfiedLinkError 无法加载 detector based tracker findLibrary 返回 null 我正在使用 OpenCV
  • 如何使用 opencv python 计算乐高积木上的孔数?

    我正在开发我的 python 项目 我需要计算每个乐高积木组件中有多少个孔 我将从输入 json 文件中获取有关需要计算哪个程序集的信息 如下所示 img 001 red 0 blue 2 white 1 grey 1 yellow 1 r
  • 如何将 Mat (opencv) 转换为 INDArray (DL4J)?

    我希望任何人都可以帮助我解决这个任务 我正在处理一些图像分类并尝试将 OpenCv 3 2 0 和 DL4J 结合起来 我知道DL4J也包含Opencv 但我认为它没什么用 谁能帮我 如何转换成 INDArray 我尝试阅读一些问题here
  • cv2.VideoWriter:请求一个元组作为 Size 参数,然后拒绝它

    我正在使用 OpenCV 4 0 和 Python 3 7 创建延时视频 构造 VideoWriter 对象时 文档表示 Size 参数应该是一个元组 当我给它一个元组时 它拒绝它 当我尝试用其他东西替换它时 它不会接受它 因为它说参数不是

随机推荐

  • 《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 欢迎指正