C#运行opencv,示例代码分析

示例代码下载位置:
https://github.com/shimat/opencvsharp_samples/

错误  CS1617  /langversion  的选项“8.0”无效。
解决方法:
https://www.cnblogs.com/mq0036/p/12205276.html

1.ArucoSample
  aruco模块基于ArUco库,这是一个检测二进制marker的非常流行的库。用于姿态估计。
  参考:https://blog.csdn.net/u010260681/article/details/77089657
  参考:https://docs.opencv.org/4.5.1/d9/d6a/group__aruco.html#gab9159aa69250d8d3642593e508cb6baa

    初始化MarkerId。
    src=读取有Aruco图像的图片。
    建立检测标记过程的参数:
        CornerRefinementMethod  角细化方法=使用角的亚像素精度精炼角的位置。
        CornerRefinementWinSize  角细化窗口大小=9
    定义marker字典dictionary=Dict4X4_1000。由1000个marker组成的,每个marker的大小为4×4bits
    基本标记(marker)检测  out  var  corners,  out  var  ids,  out  var  rejectedPoints
    detectedMarkers=创建阵列和基础数据的src的完整副本。
    在detectedMarkers上画图像中检测到的标记
    查找ids数组中四个标记的索引。我们将在corners数组中使用相同的索引来查找每个标记的corners。
    确保我们找到了四个标记,否则返回。
    从左上角开始按顺时针方向存储标记的角的位置。
    创建传递给GetPerspectiveTransform的坐标。
    transform  =从四对对应点计算透视变换。(GetPerspectiveTransform)
    normalizedImage=应用透视转换transform图像(使用指定的矩阵变换)。

    显示原图像;
    显示detectedMarkers;
    显示normalizedImage;

2.BgSubtractorMOG
    基于高斯混合的背景/前景分割算法示例

    读取视频文件到capture
    建立基于高斯混合的背景/前景分割算法模型mog
    循环:
        读取视频帧frame
        计算前景掩码fg
        显示frame
        显示fg

3.BinarizerSample
    二进制阈值示例
    参考:https://docs.opencv.org/4.5.1/df/d6c/ximgproc_8hpp.html

    src  =读取Binarization灰度图片
    新建四个Mat  niblack  sauvola  bernsen  nick  
      (对应四个二进制方法:
          [178]Wayne  Niblack.  An  introduction  to  digital  image  processing.  Strandberg  Publishing  Company,  1985.
          韦恩·尼布莱克数字图像处理的介绍。斯特兰德伯格出版公司,1985年。
          [206]Jaakko  Sauvola,  Tapio  Seppanen,  Sami  Haapakoski,  and  Matti  Pietikainen.  Adaptive  document  
binarization.  In  Document  Analysis  and  Recognition,  1997.,  Proceedings  of  the  Fourth  International
  Conference  on,  volume  1,  pages  147–152.  IEEE,  1997.
          雅科·索沃拉、塔皮奥·塞帕宁、萨米·哈帕科斯基和马蒂·皮耶蒂凯宁。自适应文档二进制。在1997年的文件分析
和确认中,第四次国际会议纪要,第1卷,第147-152页。IE,1997年。
          [267]Christian  Wolf  and  J-M  Jolion.  Extraction  and  recognition  of  artificial  text  in  multimedia  
documents.  Pattern  Analysis  &  Applications,  6(4):309–326,  2004.
          克里斯蒂安  ·  沃尔夫和  J  -  m  乔利翁多媒体文档中人工文本的提取和识别。模式分析与应用,  6  (4):
309-326,  2004.
          [122]Khurram  Khurshid,  Imran  Siddiqi,  Claudie  Faure,  and  Nicole  Vincent.  Comparison  of  niblack
  inspired  binarization  methods  for  ancient  documents.  In  IS&T/SPIE  Electronic  Imaging,  pages  72470U–72470U.
  International  Society  for  Optics  and  Photonics,  2009.
          库拉姆·库尔希德、伊姆兰·西迪奇、克劳迪·福雷和妮可·文森特。比较黑黑启发的古代文献的二元化方法。
在IS&T/SPIE  电子成像中,第  72470U-72470U.  国际光学和光子学会,2009  年。)
    核大小=51
    sw=秒表类实例。
    使用  Niblack  技术对输入图像src执行阈值生成niblack图像。显示生成使用的时长。
    使用  sauvola  技术对输入图像src执行阈值生成sauvola图像。显示生成使用的时长。
    使用  bernsen  技术对输入图像src执行阈值生成bernsen图像。显示生成使用的时长。(已弃用)
    使用  nick  技术对输入图像src执行阈值生成nick图像。显示生成使用的时长。
    sw.Restart();
    CvXImgProc.NiblackThreshold(src,  wolf,  255,  ThresholdTypes.Binary,  kernelSize,  -0.14,  LocalBinarizationMethods.Wolf);
    sw.Stop();
    Console.WriteLine($"Wolf  {sw.ElapsedMilliseconds}  ms");
    使用  wolf  技术对输入图像src执行阈值生成wolf图像。显示生成使用的时长。
    (结果:
    Niblack  20  ms
    Sauvola  4  ms
    Bernsen  2780  ms
    Nick  2  ms
    Wolf  11  ms)

4.BRISKSample
    使用BRISK算法检索关键点。
    参考:https://docs.opencv.org/4.5.1/de/dbf/classcv_1_1BRISK.html

    gray=读取lenna灰度图
    dst=读取lenna彩色图
    建立BRISK算法类brisk
    keypoints  =检测图像gray中的要点。
    画出要点

5.CaffeSample
    学习如何使用opencv_dnn模块进行图像分类,使用来自Caffe模型动物园的  GoogLeNet  训练网络。
    https://docs.opencv.org/4.5.1/d5/de7/tutorial_dnn_googlenet.html

    protoTxt  =  @"Data\Text\bvlc_googlenet.prototxt";(模型结构)
    caffeModel  =  "bvlc_googlenet.caffemodel";(模型参数?)
    synsetWords  =  @"Data\Text\synset_words.txt";(类名称)
    classNames=synsetWords分解的数组
    下载Caffe模型到caffeModel(DownloadBytes("http://dl.caffe.berkeleyvision.org/bvlc_googlenet.caffemodel");)
    用protoTxt,caffeModel构建DNN网络(读取存储在caffeModel格式中的网络模型。)
    img  =读取space_shuttle.jpg
    显示DNN网络各层名称
    inputBlob  =从图像创建四维点
    通过DNN网络预测图片分类
        DNN网络输入为inputBlob
        prob=运行前传计算输出层的名称为prob。缺省情况下,整个网络运行正向传输。返回指定层的第一个输出blob
    显示最可能的类ID和类名称
    显示概率
    显示按任意键退出。

6.ClaheSample
    对比度受限的自适应直方图均衡化基类示例  (Contrast  Limited  Adaptive  Histogram  Equalization)

    src  =读取TsukubaLeft灰度图
    dst1=对比度限制的阈值=20,均衡化灰度图像src的直方图
    dst2=对比度限制的阈值=40,均衡化灰度图像src的直方图
    dst3=设置直方图均衡化网格的大小为4×4。输入图像将被分割成大小相同的矩形贴图
    显示src,  dst1,  dst2,  dst3

7.ConnectedComponentsSample
    连接组件示例

    src=读取彩色图片shapes.png
    gray=src转灰度图像
    binary=gray阈值化结果
    labelView=与src图像具有相同大小、深度和通道的Mat
    rectView=binary转BGR图像
    cc=计算标记为布尔图像的图像binary的连接组件。
    (具有4路或8路连接的图像-返回N,标签总数[0,N-1],其中0表示背景标签。ltype指定输出标签图像类型,这是基于标签总数或源图像中像素总数的重要考虑因素。)
    如  cc  标签总数小于等于1,退出
    通过cc将标记绘制到labelView图像上
    在rectView上绘制除背景外的红色连接框
    用指定的blob对象过滤图像src,输出为filtered。
    显示src,binary,labelView,rectView,filtered。

8.DFT,  inverse  DFT  傅里叶转换,逆傅里叶转换
    参考  http://stackoverflow.com/questions/19761526/how-to-do-inverse-dft-in-opencv

    img=读取lenna灰度图
    m=img行数对应的最佳DFT大小。
    n=img列数对应的最佳DFT大小。(在边界上添加零值)
    在图像周围形成边框  (InputArray=src,OutputArray=padded,top=0,bottom=m-img.Rows,left=0,right=n-img.Cols,  BorderTypes.Constant,  Scalar.All(0))
    complex=padded转换为32F,并并入相同大小的全0平面
    对complex执行正向离散傅里叶变换生成dft。
    dftPlanes=dft分解(planes[0]  =  Re(DFT(I),  planes[1]  =  Im(DFT(I)))
    计算二维向量的大小。(向量的x坐标的浮点数组dftPlanes[0],向量的y坐标浮点数组dftPlanes[1];它必须有相同的大小,输出与x相同大小和类型的数组magnitude。)
    magnitude切换到对数刻度
    如果频谱的行数或列数为奇数,则裁剪频谱为spectrum
    重新排列傅里叶图像的象限,使原点位于图像spectrum中心
    spectrum,将带有浮点值的矩阵转换为CV_8U
    显示img,spectrum

    计算dft的逆傅里叶转换为inverseTransform
    inverseTransform将带有浮点值的矩阵转换为CV_8U
    显示inverseTransform

9.DnnSuperresSample
    参考https://github.com/Saafke/FSRCNN_Tensorflow
    TensorFlow实现加速超分辨率卷积神经网络的研究
    包括预先训练的模型x2,x3和x4。对T91图像数据集进行了训练,并在General  100数据集上进行了细化。
    受过训练的模型保存在.pb文件中。

    构造DnnSuperResImpl类dnn,立即设置所需的模型(算法:"fsrcnn":(edsr,espcn,fsrcnn,lapsrn之一),规模:4)
    dnn读取训练模型FSRCNN_x4.pb  (读取FSRCNN_x2.pb  放大2倍,x4放大4倍)
    src=读取彩色Mandrill
    通过神经网络上采样到dst
    显示src,dst

10.DrawBestMatchRectangle
    绘制最佳匹配矩形
    参考:https://stackoverflow.com/questions/51606215/how-to-draw-bounding-box-on-best-matches/51607041#51607041
    类实现ORB(*oriented  BRIEF*)关键点检测器和描述符提取器。
    在@cite  RRKB11中描述。该算法使用快速金字塔来检测稳定的关键点,使用快速或Harris响应来选择最强的特征,使用一阶矩来确定它们的方向,并使用BRIEF(其中随机点对(或k元组)的坐标根据测量的方向旋转)来计算描述符。

    img1=读取彩色Match1
    img2=读取彩色Match2  //两张有相同内容的图片。
    orb为ORB类,保留的最多特征数为1000。
    检测img1关键点并计算描述符,输出keyPoints1,  descriptors1
    检测img2关键点并计算描述符,输出keyPoints2,  descriptors2
    新建特征匹配BFMatcher类bf
    用bf为descriptors1和descriptors2每个查询描述符找到一个最佳匹配(如果掩码为空)matches。
    goodMatches  =  matches的x方向最好的10个值。
    srcPts=keyPoints1中对应goodMatches的关键点
    dstPts=keyPoints2中对应goodMatches的关键点
    计算将srcPoints映射到dstPoints的最佳拟合透视变换homography。
    img2BoundsTransformed=对多通道输入homography矩阵的每个元素进行透视变换
    在view上画img2图像img2BoundsTransformed位置外框

11.FaceDetection
    人脸检测
    参考:http://docs.opencv.org/doc/tutorials/objdetect/cascade_classifier/cascade_classifier.html

    haarCascade  =  加载级联分类器  20x20正面面部探测器数据
    lbpCascade  =加载阳性样本数量3000、负样本数量1500。
    利用  DetectFace  函数识别人脸
    显示识别结果。

    DetectFace(级联分类器)函数:
    src  =读取彩色Yalta图片
    gray  =  src转灰度
    faces  =检测输入图像中不同大小的物体,最小30×30。检测到的对象作为矩形列表返回。
    在检测到脸部的位置画圆
    返回绘制结果

12.FaceDetectionDNN
      要运行这个示例,首先下载这里可用的face模型:
      https://github.com/spmallick/learnopencv/tree/master/FaceDetectionComparison/models
      文件加到bin\\Data\\models\\文件夹

      设置caffe模型文件位置、图像文件位置
      frame  =读取图像文件
      构建DNN网络faceNet
      blob  =从图像frame创建四维点
      faceNet设置输入为blob
      detection  =运行前传计算输出层的名称为detection_out。缺省情况下,整个网络运行正向传输。返回指定层的第一个输出blob
      画外框
      保存检测图片

13.FASTSample

    imgSrc=读取彩色Lenna图像
    imgGray=imgSrc转灰度图
    keypoints  =使用FAST算法检测得到的角点,中心像素和该像素周围圆圈像素之间的强度差的阈值=50。
    在每个keypoints  画红点
    显示结果图像。

14.FlannSample

    显示"=====  FlannTest  ====="
    features=10000×2  Mat  创建数据集:包含要索引的特征(点)的类型CV_  32F的矩阵。
    queryPoint  =  new  Point2f(7777,  7777)
    queries=[7777,  7777]
    显示(7777,  7777)
    显示"-----"
    为给定数据集构造最近邻搜索索引。
    显示最近邻居的数目顺序
    显示找到的最近邻居的索引
    显示找到的最近的邻居的距离
    显示找到的最近的邻居的坐标

15.FREAKSample
    利用FREAK算法检索关键点。

    gray  =读取Lenna灰度图像
    dst  =读取Lenna彩色
    orb=为ORB类,保留的最多特征数为1000。
    keypoints=通过orb检测的gray图像的特征点
    freak=FREAK算法类
    计算图像gray中关键点keypoints的描述符freakDescriptors。不能计算描述符的关键点被移除。
    在dst上画出关键点
    显示dst

16.HandPose
    
      数据有误,运行报错

17.HistSample
    直方图示例
    参考:http://book.mynavi.jp/support/pc/opencv2/c3/opencv_img.html

    src  =读取Lenna灰度图像
    render  =260×200  Mat  直方图视图
    每个维度的直方图大小hdims  =  {256}
    hist  =计算src图像的联合密集直方图。
    minVal,  maxVal=hist直方图的最小值、最大值
    画直方图
    显示图像
    显示直方图

18.HOGSample
      HOG  (Histogram-of-Oriented-Gradients)
      方向梯度直方图  描述符和目标检测器示例  特征检测
      参考:OpenCV  HOG  SVM行人检测

    img=读取彩色Asahiyama图像
    hog  =HOG描述符
    设置hog线性SVM分类器系数
    b=检查检测器尺寸
    显示b
    watch=秒表类实例。
    found  =使用默认参数运行检测器。为了获得更高的命中率(和更多的假告警),降低hitThreshold和groupThreshold(将groupThreshold设置为0,以完全关闭分组)。
    显示用时
    显示发现的区域
    在img画HOG检测器返回的矩形
    全屏显示img

19.HoughLinesSample
    霍夫变换示例

    imgGray  =读取Goryokaku灰度图像
    imgStd  =读取Goryokaku彩色图像
    imgProb  =  imgStd
    imgGray  =imgGray检测到的角点
    使用标准霍夫变换在二值图像中寻找线。(图像,可以被函数修改;ρ:累加器的像素距离分辨率;θ:累加器的角度分辨率(以弧度为单位);阈值;)
            segStd  =返回直线的输出向量。每条线都由一个二元向量(,)表示。为到坐标原点(0,0)(图像左上角)的距离,为以弧度为单位的直线旋转角
    limit=10,或segStd长度如长度<10
    在imgStd上画变换线
    segProb  =运行概率Hough变换
    在imgProb上画变换线
    显示imgStd、imgProb

20.InpaintSample
    修复图像示例
    参考:http://opencv.jp/sample/special_transforms.html#inpaint
  
    热键:
    ESC  -退出程序    
    r  -恢复原始图像    
    i或回车-运行修复算法(运行之前,在图像上画些东西)    
    s  -保存原始图像,蒙版图像,原始  蒙版图像和inpainted图像到桌面。

    img0=读取Fruits图像
    img=img0
    inpaintMask=黑色img0大小图像
    inpainted=与img0图像具有相同大小、深度和通道的空图像
    wImage  =显示img图像的窗口
    wImage鼠标回调函数:
          在inpaintMask和img上,用鼠标画线
    监听键盘操作:
            ESC:退出
            r:inpaintMask涂黑,img0拷贝到img,显示img
            i  或  \r:
                用Alexandru  Telea算法修复图像,显示修复结果
                用Navier-Strokes算法修复图像,显示修复结果
            s:保存img0、inpaintMask、img、inpainted到桌面

21.KAZESample
    检索关键点使用KAZE和AKAZE算法示例

    gray  =读取灰度Lenna图像
    kaze  =KAZE算法实例
    akaze  =AKAZE算法实例
    kazeKeyPoints,  kazeDescriptors=用KAZE算法检测关键点,计算描述符
    kazeTime  =KAZE算法用时
    akazeKeyPoints,  akazeDescriptors=用AKAZE算法检测关键点,计算描述符
    akazeTime  =AKAZE算法用时
    dstKaze  =在gray上绘制kazeKeyPoints的图像
    dstAKaze  =在gray上绘制akazeKeyPoints的图像
    显示dstKaze、dstAKaze

22.KAZESample2
      检索关键点使用KAZE算法示例2
      参考:https://github.com/shimat/opencvsharp/issues/176

    img1  =读取box.png图像
    img2  =读取box_in_scene.png图像
    matcher  =特征匹配BFMatcher类实例
    kaze  =KAZE算法实例
    keypoints1,  descriptors1=用KAZE算法检测img1图像的关键点,计算的描述符
    keypoints2,  descriptors2=用KAZE算法检测img2图像的关键点,计算的描述符
    matches  =用matcher匹配的descriptors1和descriptors2的特征
    mask  =matches.Length×1  Mat  用Scalar(255)填充
    nonZero  =计算mask数组元素的数目
    投票给独特性函数  VoteForUniqueness(matches,  mask);
    nonZero  =计算mask数组元素的数目
    nonZero  =为大小和方向投票函数  VoteForSizeAndOrientation(keypoints2,  keypoints1,  matches,  mask,  1.5f,  20);
    遍历掩码只取出非零项,因为它们是匹配的
        obj.Add(keypoints1)
        scene.Add(keypoints2)
        goodMatchesList.Add(matches)
    如果非零项数nonZero>4:
        homography  =计算将objPts映射到  scenePts的最佳视角转换。输出掩码mask
        nonZero  =计算mask数组元素的数目
        如果homography  不为空:
              sceneCorners=对homography矩阵的每个元素进行透视变换
              img3  =img1右侧叠加img2
              从img1、img2两个图像中提取关键点的匹配绘制到img3。
              在img3中的img2上绘制匹配img1的图像外框
              保存img3
              显示img3

    投票给独特性函数  VoteForUniqueness:
        新建byte[]  maskData长度为匹配特征长度
        提供用于从非托管内存访问托管对象的方法。阻止回收托管的对象
        m=Mat(int  rows,  int  cols,  MatType  type,  IntPtr  data,  long  step  =  0);矩阵头文件的构造函数指向用户分配的数据
          (IntPtr  data:指向用户数据的指针。接受数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化
指向指定数据的matrix头文件,这意味着不复制任何数据。这个操作非常高效,可以使用OpenCV函数来处理外部数据。
          外部数据不会被自动分配,所以你应该处理它。)
        如图像1特征距离÷图像2特征距离<=设定阈值  (这也被称为NNDR最近邻距离比)
              mask[i]=255,否则=0
        释放托管对象管理
    
    为大小和方向投票函数  VoteForSizeAndOrientation:
        提供用于从非托管内存访问托管对象的方法。阻止回收托管的对象
        m=Mat(int  rows,  int  cols,  MatType  type,  IntPtr  data,  long  step  =  0);矩阵头文件的构造函数指向用户分配的数据
          (IntPtr  data:指向用户数据的指针。接受数据和步骤参数的矩阵构造函数不分配矩阵数据。相反,它们只是初始化
指向指定数据的matrix头文件,这意味着不复制任何数据。这个操作非常高效,可以使用OpenCV函数来处理外部数据。
          外部数据不会被自动分配,所以你应该处理它。)
        取掩码的每行:
            如该掩码大于0:
                s=(小图特征点大小÷大图对应特征点索引的特征点大小)的对数
                s加入到logScale
                如果s大于maxS,则maxS=s
                如果s小于minS,则minS=s
                r=特征点角度差
                如r为负值,则  360
                r加入到rotations    
        scaleBinSize(本规模大小)=(maxS与minS差)÷scaleIncrement(传入的规模增加值)的对数
        如果scaleBinSize小于2,则scaleBinSize=2
        规模范围scaleRanges  =  {  (float)minS,  (float)(minS      scaleBinSize      Math.Log10(scaleIncrement))
        scalesMat=logScale  Mat
        rotationsMat=rotations  Mat
        arrs  =  {  scalesMat,  rotationsMat  };
        hist=计算arrs图像的联合密集直方图。
        maxVal=hist最大值
        对hist每个数组元素应用一个maxVal  *  0.5的阈值。
        flagsMat=arrs图像反向投影。
        flagsMat索引=0的对应掩码数值=0,否则nonZeroCount    
        释放托管对象管理
        返回  nonZeroCount
        
23.MatOperations
      Mat操作示例  
  
    src  =读取Lenna图像
    small=src缩写到100×100
    src[10,  110,  10,  110]处贴上small
    src[370,  470,  400,  500]处贴上small转置
    src[200,  400,  200,  360]位置像素取反
    src[50,  100,  400,  450]位置像素设置为128
    显示src

    src  =读取Lenna图像
    src.RowRange(100,  200)7×7高斯滤波输出到src.RowRange(200,  300)
    src.RowRange(200,  300)7×7高斯滤波输出到src.RowRange(100,  200)
    显示src

    src  =读取Lenna图像
    100,400行随机选择交换
    ColRange(450,  500)取反复制到ColRange(0,  50)
    RowRange(450,  460)颜色设置为Scalar(0,  0,  255)
    显示src

24.MatToBitmap

    ToMat():
        bitmap  =  new  Bitmap读取图片Lenna511
        converted=bitmap转Mat
        显示converted
        等待按任意键

    ToMatGrayScale():
        bitmap  =  new  Bitmap读取灰度图片Lenna511
        converted=bitmap转Mat
        显示converted
        等待按任意键

    ToBitmap():
        img=读取彩色Lenna511图像
        Bitmap  bitmap  =img转bitmap
        用win窗体、PictureBox显示bitmap
        等待按回车键和点击关闭,关闭窗体

    ToBitmapGrayScale();
        img=读取灰度Lenna511图像
        Bitmap  bitmap  =img转bitmap
        用win窗体、PictureBox显示bitmap
        等待按回车键和点击关闭,关闭窗体

25.MatToWriteableBitmap
    System.Windows.Media.Imaging.WriteableBitmap和Mat之间转换的静态类演示

    mat  =读取彩色Lenna511图像
    wb  =mat转为WriteableBitmap格式
    image.Source  =  wb
    window=窗体实例
    image添加到window
    app=Application实例
    app运行window

26.MDS
    多维标度构成法示例(没懂。需再学学)
    参考:centering  matrix中心矩阵的代码测试
              https://blog.csdn.net/qq_36206070/article/details/110505432

    CityDistance  =美国10个城市之间的距离10×10数组
    CityNames  =10个美国城市名称

    t  =CityDistance转换为矩阵
    torgarson  =  Torgerson(t)(相加常数?没懂,值=24)
    t    =  torgarson
    t=将t的所有元素平方
    g  =10×10中心矩阵
    b  =  g  *  t  *  g.T()  *  -0.5(计算内积矩阵)
    计算b的特征值和特征向量
    特征值<0的,=0
    将特征值开方乘以特征向量
    展开特征向量
    新建图像img
    在img上绘制特征向量红点
    偏移(5,10),写城市名称
    显示img

27.MergeSplitSample
      拆分/合并示例

    src  =读取Lenna彩色图像
    拆分各个通道
    分别显示每个通道

    通道1取反
    合并各通道到merged
    显示src、merged

    rgba  =300×300图像,颜色Scalar(50,  100,  150,  200)
    bgr,  alpha与rgba相同大小
    混合通道:
    rgba[0]  ->  bgr[2],  rgba[1]  ->  bgr[1],
    rgba[2]  ->  bgr[0],  rgba[3]  ->  alpha[0]
    显示rgba、bgr、alpha

28.MorphologySample
    形态学示例

    gray  =读取Lenna灰度图像
    kernel  =3×3的  形状核
    binary=二值化gray
    dilate1=用空核膨胀binary
    dilate2=用kernel膨胀binary
    显示binary、dilate1、dilate2

29.MSERSample
    MSER(最大稳定极值区域)示例

    src  =读取Distortion彩色图像
    gray  =src转灰度图像
    mser  =MSER实例
    检测MSER,contours=点集的结果列表,bboxes=结果边框列表
    用随机颜色绘制contours的点
    显示src、gray、点集的绘制结果

30.NormalArrayOperations
    正常的数组操作示例

    对字节数组执行阈值:
        input  =  {1,  2,  3,  4,  5,  }
        output  =对每个数组元素应用一个固定级别的阈值。阈值=T=3,阈值类型的最大值=Max=5,阈值类型Binary。
        输出T、input、output

    对数值数组执行阈值:
        input  =  {  50,  100,  150,  200,  250,  }
        output  =对每个数组元素应用一个固定级别的阈值。阈值=T=150,阈值类型的最大值=Max=250,阈值类型Binary。
        输出T、input、output

    对结构数组执行阈值:
        input  =  {new  Point2f(1000,  1500),new  Point2f(2000,  2001),new  Point2f(500,  5000),  };
        output  =对每个数组元素应用一个固定级别的阈值。阈值=T=2000,阈值类型的最大值=Max=5000,阈值类型Binary。
        输出T、input、output

    -----------------
    结果:
    Threshold:  3
    input:    1,2,3,4,5
    output:  0,0,0,5,5
    Threshold:  150
    input:    50,100,150,200,250
    output:  0,0,0,250,250
    Threshold:  2000
    input:    (x:1000  y:1500),(x:2000  y:2001),(x:500  y:5000)
    output:  (x:0  y:0),(x:0  y:5000),(x:0  y:5000)

31.OpenVinoFaceDetection
      OpenVino人脸检测示例

    frame  =读取图像
    frameHeight,frameWidth  =frame高宽
    没有下载到  OpenVino使用的.bin文件,跳过
    ……

32.PerspectiveTransformSample
    视角转换示例

    srcPoints  =原点
    dstPoints=640×480四角的点
    OriginalImage  =读取box_in_scene.png彩色图像
    显示OriginalImage
    设置鼠标回调函数CallbackOpenCVAnnotate
    按任意键结束

    CallbackOpenCVAnnotate函数:
        在图像上点击4次,作为变换图像的四角。
        从四对对应的点计算透视变换。这个函数计算一个透视变换的3×3矩阵matrix。
        对OriginalImage图像应用matrix透视变换。输出到dst
        显示dst
        (点击顺序左上左下右下右上,图像不旋转)

33.PhotoMethods
    Photo模块方法的示例

    src  =  读取Fruits彩色图像
    (EdgePreservingFilter()边缘保持滤波器。滤波是图像和视频处理的基本操作。保持边缘平滑滤波器被用于许多不同的应用。
        参数:src:输入  8  位  3  通道图像。
                    dst:  输出  8  位  3  通道图像。
                    flags:  边缘保护滤波  EdgePreservingMethods.NormconvFilter  //归一化卷积滤波  或  EdgePreservingMethods.RecursFilter  //递归滤波。
                    sigma_s:取值范围为  0~200。
                    sigma_r:取值范围为  0~1。
        当sigma_s  取值不变时候,sigma_r  越大图像滤波效果越明显;
        当sigma_r  取值不变时候,窗口  sigma_s  越大图像模糊效果越明显;
        当sgma_r取值很小的时候,窗口  sigma_s  取值无论如何变化,图像双边滤波效果都不好!)
    normconv=src归一化卷积滤波sigmaS  =  60,sigmaR  =  0.4F
    recursFildered=src递归滤波sigmaS  =  60,sigmaR  =  0.4F
    detailEnhance=使用滤镜增强src特定图像的细节。sigmaS  =  10,  sigmaR  =  0.15F
    输出像铅笔一样的非逼真的线条画  pencil1  单通道图像,  pencil2  通道与输入一致sigmaS  =  60,sigmaR  =  0.07F,shadeFactor  =  0.02F
    stylized=风格化效果  sigmaS  =  60,  sigmaR  =  0.45F
    显示各图像

34.PixelAccess
    交换B、R通道示例

    慢的:Get/Set
    mat  =读取Lenna彩色图像
    取每个像素点,颜色0与颜色2数值交换
    输出耗时
  
    相当快的:GenericIndexer
    mat  =读取Lenna彩色图像
    indexer  =mat的索引器3元类型。索引器使用getter  /setter来访问mat矩阵每个元素。
    取每个像素点索引,颜色0与颜色2数值交换
    输出耗时
    
    快的:TypeSpecificMat
    mat  =读取Lenna彩色图像
    mat3=3元组mat
    indexer  =mat3的索引器。索引器使用getter  /setter来访问mat3矩阵每个元素。
    取每个像素点索引,颜色0与颜色2数值交换
    输出耗时
-------------
    结果:
    Get/Set:  559ms
    GenericIndexer:  195ms
    TypeSpecificMat:  37ms

35.Pose
    未找到pose_iter_160000.caffemodel  跳过

36.seamlessClone
    无缝的克隆示例
    图像编辑任务既要关注全局变化(颜色/强度校正、滤镜、变形),也要关注与选定内容相关的局部变化。
在这里,我们感兴趣的是以无缝和轻松的方式实现局部更改,这些更改被限制在一个手动选择的区域(ROI)中。
变化的范围从轻微的扭曲到完全被新颖的内容取代@cite  PM03。

    src=读取Girl彩色图像
    dst=读取Lenna彩色图像
    src0=src缩放到dst大小
    mask  =src0大小黑图像
    mask  在(200,200)画半径100的白圈
    blend1=src0正常克隆到dst(260,  270)位置,掩膜为mask
    blend2=src0单色转移克隆到dst(260,  270)位置,掩膜为mask
    blend3=src0混合克隆到dst(260,  270)位置,掩膜为mask
    显示各图像

37.SiftSurfSample
    SIFT  和  SURF  示例
    参考:http://www.prism.gatech.edu/~ahuaman3/docs/OpenCV_Docs/tutorials/nonfree_1/nonfree_1.html

    src1=读取match1.png彩色图像
    src2=读取match2.png彩色图像

    SIFT:
    gray1=src1转灰度图
    gray2=src2转灰度图
    sift  =SIFT实例
    keypoints1,  descriptors1=使用SIFT检测gray1关键点并生成它们的描述符
    keypoints2,  descriptors2=使用SIFT检测gray2关键点并生成它们的描述符
    bfMatcher  =  BFMatcher蛮力描述符匹配器。对于第一个集合中的每个描述符,匹配器通过逐个尝试找到第二个集合中最接近的描述符。
    flannMatcher  =FlannBasedMatcher蛮力描述符匹配器。
    bfMatches=用bfMatcher匹配descriptors1,descriptors2
    flannMatches=用flannMatcher匹配descriptors1,descriptors2
    bfView=用bfMatches匹配的gray1,gray2匹配结果
    flannView=用flannMatches匹配的gray1,gray2匹配结果
    显示bfView、flannView

    SURF:
    gray1=src1转灰度图
    gray2=src2转灰度图
    surf  =SURF实例
        只提取keypoint.hessian大于200的特征;探测器使用的高斯金字塔八度音阶数。默认设置为4;
        高斯金字塔的每个八度内的图像数量。默认设置为2;true表示扩展描述符(128个元素)
    keypoints1,  descriptors1=使用surf检测gray1关键点并生成它们的描述符
    keypoints2,  descriptors2=使用surf检测gray2关键点并生成它们的描述符
    bfMatcher  =  BFMatcher蛮力描述符匹配器。对于第一个集合中的每个描述符,匹配器通过逐个尝试找到第二个集合中最接近的描述符。
    flannMatcher  =FlannBasedMatcher蛮力描述符匹配器。
    bfMatches=用bfMatcher匹配descriptors1,descriptors2
    flannMatches=用flannMatcher匹配descriptors1,descriptors2
    bfView=用bfMatches匹配的gray1,gray2匹配结果
    flannView=用flannMatches匹配的gray1,gray2匹配结果
    显示bfView、flannView
    
    (效果都不好!)

38.SimpleBlobDetectorSample
    简单的斑点检测器示例

    src  =读取Shapes图像
    反转src的图像。Shapes的背景是黑色的,而SimpleBlobDetector似乎不能很好地与之配合。
    设置circleParams参数,并调整参数到只检测圆
    设置ovalParams参数,并调整参数到只检测椭圆
    circleDetector  =用circleParams参数建立的SimpleBlobDetector的实例
    用circleDetector检测src图像的特征点
    在detectedCircles绘制src图像的特征点
    ovalDetector  =用circleParams参数建立的SimpleBlobDetector的实例
    用ovalDetector检测src图像的特征点
    在detectedOvals绘制src图像的特征点
    显示detectedCircles、detectedOvals

39.SolveEquation
    解方程示例

    求解方程AX  =  Y
    av=  {{1,  1},{2,  3}}
    yv  =  {10,  26}
    a=mat  av,y=mat  yv
    求x
    输出x[0],x[1]

    a=  {{1,  1},{2,  3}}
    y  =  {10,  26}
    求x
    输出x[0],x[1]

40.StarDetectorSample
    使用星检测器算法检索关键点示例

    dst  =读取Lenna彩色图像
    gray  =读取Lenna灰度图像
    detector  =星检测器算法实例maxSize  =45
    keypoints=用detector检测gray得到的关键点
    如keypoints不为空,在dst上画出keypoints。
    显示dst

41.Stitching
    拼接图像示例

    source  =读取Lenna彩色图像
    随机取10个200×200的位置,画框,图像保存到mats
    显示画框结果
    stitcher  =拼接类Stitcher的实例
    拼接mats到pano
    显示pano图像
    销毁中间结果。

42.Subdiv2DSample

    创建随机点列表points
    img=600×600黑图
    在img上points点位置画红圈
    创建一个空的Subdiv2D对象subdiv
    创建一个新的空Delaunay细分参数是包含所有要添加到细分中的2D点的矩形
    在Delaunay三角剖分中插入多个点points。
    返回所有Voronoi  facet的列表。
    vonoroi  =  img
    在vonoroi上用Voronoi  facet的列表绘制多边形
    edgeList  =  subdiv返回所有连线的列表。
    delaunay  =  img
    在delaunay上用edgeList画连线
    显示vonoroi、delaunay

43.SuperResolutionSample
    超分辨率示例

    capture=视频输入,宽640,高480
    如不能扑捉视频,报错退出。
    sr=创建双边TV-L1超分辨率。摄像头为-1
    循环:
        normalFrame=capture获取的帧
        srFrame=sr获取的帧
        如  normalFrame  或srFrame  为空,退出循环
        显示normalFrame、srFrame
        等待100毫秒
-------------------
      sr.NextFrame(srFrame)执行失败。

44.SVMSample
    支持向量机示例

    f(x)=x    50  *  Sin(x  /  15.0);

    训练数据500个
    随机在(0,300)范围内生成x,y,存入points
    如果y>f(x)则y=1,否则y=2,存入responses
    训练数据画圆点,responses=1红色,responses=2黄色
    用蓝色画(x)曲线
    显示绘制结果

    训练:
    dataMat=用points创建数据集
    resMat  =用responses创建结果集
    svm  =  SVM类实例
    设置svm参数
    用svm训练

    用svm预测300x300每个像素,结果为1画红色,2画黄色
    显示预测结果

45.VideoWriterSample

      OutVideoFile  =  "out.avi"
      capture  =打开MP4文件  Bach
      dsize  =  new  Size(640,  480);
      writer=用于读视频帧并把它们写入的VideoWriter  
      输出  转换每个电影帧…
      循环:
          frame=读取视频帧
          如为空,则退出循环
          输出  第几帧,共几帧
          gray=frame转灰度
          canny=gray检测的角点
          dst=canny缩放到dsize大小
          writer写入dst
          输出空行

      capture2=打开OutVideoFile
      播放OutVideoFile
------------------------
[ERROR:0]  global  D:\a\opencv_files\opencv_files\opencv\modules\videoio\src\cap.cpp  (574)  
cv::VideoWriter::open  VIDEOIO(CV_IMAGES):  raised  unknown  C      exception!

46.VideoCaptureSample

      capture  =打开MP4文件  Bach
      每帧延时sleepTime  =1000  /  capture.Fps
      播放文件

47.WatershedSample
    分水岭算法示例

    srcImg  =读取Lenna彩色图像
    markers  =srcImg大小掩膜
    显示srcImg
    dspImg=srcImg
    seedNum  =  0
    鼠标回调函数:按下鼠标:
        seedNum    
        pt=鼠标位置
        在markers画圆(pt=圆点,半径10,颜色seedNum)
        在dspImg画圆(pt=圆点,半径10,颜色白色)
        window.Image  =  dspImg
    等待按任意键

    使用分水岭算法进行基于标记的图像分割。  InputOutputArray  markers
    dspImg=srcImg
    在dspImg上分水岭位置画2×2红方块
    显示dspImg

48.WindowGUISample

        Windows_Example();
            显示图像
            等待按任意键结束

        TrackBar_Example();
            src  =读取图像
            src  =复制到  dst
            结构元件的形状elementShape=方块
            最大迭代=10
            openCloseWindow显示dst
            在显示画面建立Trackbar控件,名称:迭代,初始位置10,max=maxIterations  *  2      1
            Trackbar拖动:
                    n  =  pos  -  maxIterations//正负10之间变化
                                        //返回用于形态学运算的指定大小和形状的结构元素。函数构造并返回可进一步传递以进行
侵蚀、扩张或扩展的结构元素形态学。
                                        //但是您也可以自己构造一个任意的二进制掩码,并将其用作结构元素。
                                        var  element  =  Cv2.GetStructuringElement(
                                                        elementShape,      //可以是MorphShapes之一的元素形状
                                                        new  Size(an  *  2      1,  an  *  2      1),//结构元素的大小。
                                                        new  Point(an,  an));//元素内的锚点位置。默认值(−1,−1)表示锚点位于中心。
                                        //请注意,只有十字形元素的形状取决于锚定位置。在其他情况下,锚定只调节形态学运算结果的偏移量。
                    MorphologyEx  执行高级形态变换src:源图像;  dst:目标图像;  形态学操作的类型;element:结构化元素;anchor:元素中锚点的位置。                  
                    n<0:执行开运算,显示文字“开/侵蚀:”elementShape
                            否则闭运算,显示文字“闭/膨胀:”elementShape

            erodeDilateWindow显示dst
            在erodeDilateWindow显示画面建立Trackbar控件,名称:迭代,初始位置10,max=maxIterations  *  2      1
            Trackbar拖动:
                    n  =  pos  -  maxIterations//正负10之间变化
                                        //返回用于形态学运算的指定大小和形状的结构元素。函数构造并返回可进一步传递以进行
侵蚀、扩张或扩展的结构元素形态学。
                                        //但是您也可以自己构造一个任意的二进制掩码,并将其用作结构元素。
                                        var  element  =  Cv2.GetStructuringElement(
                                                        elementShape,      //可以是MorphShapes之一的元素形状
                                                        new  Size(an  *  2      1,  an  *  2      1),//结构元素的大小。
                                                        new  Point(an,  an));//元素内的锚点位置。默认值(−1,−1)表示锚点位于中心。
                                        //请注意,只有十字形元素的形状取决于锚定位置。在其他情况下,锚定只调节形态学运算结果的偏移量。
                    MorphologyEx  执行高级形态变换src:源图像;  dst:目标图像;  形态学操作的类型;element:结构化元素;anchor:元素中锚点的位置。                  
                    n<0:执行侵蚀,显示文字“侵蚀:”elementShape
                            否则膨胀,显示文字“膨胀:”elementShape

        键盘输入:
                                      case  'e':
                                                elementShape  =  MorphShapes.Ellipse;
                                                break;
                                        case  'r':
                                                elementShape  =  MorphShapes.Rect;
                                                break;
                                        case  'c':
                                                elementShape  =  MorphShapes.Cross;

        MouseCallBack_Example();
            显示图像
            Debug输出鼠标操作
            等待按任意键结束

你可能感兴趣的:(计算机视觉,Win10,计算机视觉,OPENCV)