关于OpenCV的内容
1.OpenCV中cv::Mat的深拷贝和浅拷贝问题
  深拷贝:分配新内存的同时拷贝数据,当被赋值的容器被修改时,原始容器数据不会改变。
  浅拷贝:仅拷贝数据,当被赋值容器修改时,原始容器数据也会做同样改变。

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

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

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

  1. 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.图像的插值方法有哪些?
  最近邻法
  双线性内插法
  三次内插法

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

  1. Canny边缘检测的流程
      图像降噪——计算图像梯度,得到可能边缘——非极大值抑制——双阈值筛选
  2. 图像锐化 – sharpen
      平滑:把图像变模糊;
      锐化:把图像变清晰;
      图像锐化主要用于增强图像的灰度跳变部分,这和图像平滑对灰度跳变的抑制正好相反。
  3. 图像对比度
      对比度:指一幅图像中灰度反差的大小;
      对比度 = 最大亮度 / 最小亮度
  4. 图像滤波
      定义:把滤波想象成一个包含加权系数的窗口,当使用这个滤波器平滑处理图像时,就把这个窗口放到图像上,透过该窗口查看。
      滤波的作用:去除图像中的噪声
      低通滤波器:去除图像中的高频部分——模糊化
      高通滤波器:去除图像中的低频部分——锐化
      线性滤波器:方框滤波、均值滤波、高斯滤波
      非线性滤波:中值滤波、双边滤波
  5. 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.常用图像增强算法
  ①直方