精华内容
参与话题
问答
  • 计算机视觉开源项目

    2018-12-18 10:37:54
    转载:https://blog.csdn.net/linear_luo/article/details/52334822   按类别分类 特征提取 SURF特征: http://www.vision.ee.ethz.ch/software/index.de.html(当然这只是其中之一) ...

    转载:https://blog.csdn.net/linear_luo/article/details/52334822

     

    按类别分类

     

    按专题分类

    展开全文
  • 开源计算机视觉项目是在深度学习领域中获得一席之地的绝佳路径 开始学习这18个非常受欢迎的经典开源计算机视觉项目 引言 计算机视觉的应用现在无处不在。 老实说,我已经不记得上次一整天没有遇到或者没有...

    英语原文:18 All-Time Classic Open Source Computer Vision Projects for Beginners

    翻译:雷锋字幕组(小哲


    概述

    • 开源计算机视觉项目是在深度学习领域中获得一席之地的绝佳路径

    • 开始学习这18个非常受欢迎的经典开源计算机视觉项目

    引言

    计算机视觉的应用现在无处不在。 老实说,我已经不记得上次一整天没有遇到或者没有与至少一样计算机视觉使用样例进行交互时什么时候了(手机上的人脸识别)

    但是有一件事情就是 一 想要学习计算机视觉的人倾向与陷入理论的概念, 这是所能采取的最糟糕的路。 为了真正的学习掌握计算机视觉, 我们需要将理论与实践相结合。

    并且这就是开源计算机视觉项目存在的地方。 不需要花一分钱就可以练习计算机视觉技术——你可以坐在现在的位置上完成这些工作。

    推荐!最适合初学者的18个经典开源计算机视觉项目

    所以在这篇文章中, 我结合并创建了一个基于计算机视觉各种应用的开源计算机视觉项目列表。有很多事情要做,这是一个相当全面的清单,所以让我们深入研究!

    如果你是一个完全的计算机视觉和深度学习的新手并且更想要通过视频学习, 请参考下边:

    18个开源的计算机视觉项目分为下边的这些类:

    • 图像分类

    • 人脸识别

    • 使用GAN的自然风格转换

    • 场景文字检测

    • 使用DETR的目标检测

    • 语义分割

    • 自动驾驶的道路交通线检测

    • 图像标注

    • 人类姿势估计

    • 通过面部表情的情感识别

    图像分类的开源计算机视觉项目

    图像分类是计算机视觉领域的基础任务, 目标是通过给每张图片分配一个标签来区分图像。对人类来说理解区分我们看到的图像很容易。 单是对于机器来说时非常不同的。 对于机器来说区分大象和汽车都是一件繁重的任务。

    下边是几个最突出的图像分类开源项目:

    1. Cifar10

      CIFAR-10是一个在训练机器学习和计算机视觉算法常用的数据集,它是机器学习最受欢迎的数据集。 包含了60000张图像, 分为10类, 每张图像的的尺寸为32x32。 类别有飞机、汽车、鸟、猫、鹿、狗、青蛙、马、船和卡车。

    2. ImageNet

      ImageNet数据集是一个为计算机视觉研究的巨大图像数据集, 这个数据集中有多于140万张图像被手供标注, 并且这些标注说明了图像中含有那些物体。并且有多余1万张图像标注了物品的边界框。 ImageNet包含了多余20000类的物品。

    作为初学者,你可以使用keras或者pytorch从头开始学习神经网络, 为了能够得到更好的效果提升学习的层次, 我建议使用迁移学习预训练模型,例如CGG-16, Resnet-50,GoogleNet等等。

    推荐!最适合初学者的18个经典开源计算机视觉项目      

    建议通读下边的文章更好的理解图像分类:

    人脸识别的开源计算机视觉代码

    人脸识别是计算机视觉最广泛的应用。人脸识别被应用在安全, 监控或者解锁手机。 这是一个在预先存在的数据集中在图像或者视频中确认你的人脸。 我们可以使用深度学习的方法来学习这些人脸的特征并且识别他们。

    这是一个多个步骤的过程,这个过程由以下的步骤构成:

    • 人脸检测: 这用来定位一个或者多个在图像或者视频中的人脸

    • 人脸对齐: 对齐是用来规范化人脸在集合上与数据集一致

    • 特征提取: 后来,提取特征并且用在识别任务中。

    • 特征识别: 与数据库中的特征相匹配

    下面的开放源数据集将为您提供良好的人脸识别机会:

    1. MegaFace

      MegaFace是一个大规模的公共人脸识别训练数据集,它是商业人脸识别问题最重要的基准之一。它包括4753320个人脸,672057个身份

    2. Labeled faces in wild home

      Labeled faces in wild home(LFW)是一个人脸照片数据库,旨在研究无约束人脸识别问题。它有13233张5749人的图片,是从网上发现和收集的。另外,1680名照片中的人在数据集中有两张或两张以上不同的照片。

    此外, 为了更好的利用这些项目, 你可以使用像FaceNet这样的预训练模型。

    Facenet是一种深度学习模型,它为人脸识别、验证和聚类任务提供了统一的嵌入。网络将每个人脸都映射在一个欧几里德网络中,每个图像之间的距离是相似的。

    推荐!最适合初学者的18个经典开源计算机视觉项目

    资源

    也可以使用keras或者pytorch的预训练模型来构建自己的人脸识别系统。

    还有一些更先进的人脸识别模型可供使用。Deepface是由Facebook的研究人员开发的基于CNN的Deep网络。这是在人脸识别任务中使用深度学习的一个重要里程碑。

    为了更好地了解近30年来人脸识别技术的发展,我建议您阅读一篇有趣的论文,题目是:

    Deep Face Recognition: A Survey

    开源的计算机视觉项目 一 使用GAN进行自然风格转换

    自然风格转换是一种使用一张图像的风格重建另一张图像的内容的计算机视觉技术。这是生成对抗网络(GAN)的应用, 这儿,我们输入了两张图像, 一张内容图像,另一张时风格参考图像, 然后将二者混合在一起以至于输出图像看起来像使用风格参考图像绘制出来的油画。

    这是通过优化输出图像与内容图像匹配的内容统计和样式参考图像的样式统计来实现的。

    推荐!最适合初学者的18个经典开源计算机视觉项目

    资源

    下边是一些用来练习非常令人惊叹的数据集:

    1. COCO数据集

      COCO是一个大规模的对象检测、分割和标注的数据集。数据集中的图像是从日常场景中捕获的日常对象。此外,它提供了多对象标记、分割掩码标注、图像标注和关键点检测,共有81个类别,使其成为一个非常通用和多用途的数据集。

    2. ImageNet

      上边已经提到过 一 ImageNet非常灵活多用。

    如果你还不知道如何应用风格转换模型,这儿是一个tensorflow的教程可以帮助你, 而且, 如果你像更加升入了解这个技术我建议你阅读接下来的论文。

    用于场景文本检测的开源计算机视觉项目

    在任何给定的场景中检测给定的场景是另外的一个非常有趣的问题。 场景文字就是出现在户外拍摄的图像中出现的字符。 例如, 道路上的车牌号, 道路上的公告牌等等。

    场景图像中的文字在形状, 字体, 颜色和位置上都是变化的。由于光照和聚焦的不均匀性,使得场景文本识别的复杂度进一步增加。

     推荐!最适合初学者的18个经典开源计算机视觉项目     

    下边这些流行的数据集将会丰富你分析场景文字检测的技能:

    1. SVHN

      街景门牌号码(SVHN)数据集是其中最受欢迎的开源数据集之一。它已用于Google创建的神经网络中,以读取门牌号并将其与地理位置匹配。这是一个很好的基准数据集,可用于练习, 学习和训练可准确识别街道编号的模型。此数据集包含从Google街景视图中获取的超过60万张带标签的真实房门图像。

    2. SceneText数据集

      场景文本数据集包含在不同环境中捕获的3000张图像,包括在不同光照条件下的室外和室内场景。图像是通过使用高分辨率数码相机或低分辨率移动电话相机捕获的。此外,所有图像均已调整为640×480。

    此外,场景文本检测是一个两步过程,包括图像中的文本检测和文本识别。对于文本检测,我发现了最先进的深度学习方法EAST(高效准确场景文本检测器)。它可以找到水平和旋转边界框。您可以将其与任何文本识别方法结合使用。

    这是有关场景文本检测的其他一些有趣的论文:

    使用DETR进行目标检测的开源计算机视觉项目

    目标检测是通过边界框以及图像上的适当标签预测图像中存在的每个感兴趣对象的任务。

    几个月前,Facebook开源了其对象检测框架DEtection TRansformer(DETR)。DETR是针对目标检测问题的高效创新解决方案。通过将对象检测视为直接设置的预测问题,它简化了训练管道。此外,它采用基于变压器的编码器-解码器架构。 推荐!最适合初学者的18个经典开源计算机视觉项目

    要了解有关DERT的更多信息,请参见论文和Colab notebook

    通过处理以下用于对象检测的开源数据集来使您的资料多样化:

    1. open Images

      Open Image是约900万张图像的数据集,其中标注了图像级标签,对象边界框,对象分割掩码,视觉关系和本地化描述。数据集分为训练集(9,011,219张图像),验证集(41,620张图像)和测试集(125,436张图像)。

    2. MSCOCO

      MS-COCO是广泛用于目标检测问题的大规模数据集。它由33万张图像组成,其中包含80个对象类别,每个图像有5个标注,并有25万关键点。

    您可以阅读以下资源以了解有关对象检测的更多信息:

    用于语义分割的开源计算机视觉项目

    当我们谈论计算机视觉技术中对场景的完全理解时,语义分割就出现了。任务是将图像中的所有像素分类为相关对象类别。

     

    以下是实践该主题的开源数据集的列表:

    1. CamVid

      该数据库是开源的第一个按语义分割的数据集之一。这通常用于(实时)语义分割研究中。数据集包含:

      367个训练对

      101个验证对

      233个测试对

    2. Cityscapes

      该数据集是原始城市景观的经过处理的子样本。数据集具有原始视频的静止图像,并且语义分割标签显示在原始图像旁边的图像中。这是用于语义分割任务的最佳数据集之一。它具有2975个训练图像文件和500个验证图像文件,每个图像文件均为256×512像素

    要进一步了解语义分段,我将推荐以下文章:

    以下是一些可用于语义分割的代码的论文:

    用于自动驾驶车辆道路车道检测的开源计算机视觉项目

    一个自主轿车是能够感知周围环境,并无需人类干预就能操作的交通工具。他们根据适合车辆不同部分的各种传感器创建并维护周围环境的地图。

    这些车辆具有监视附近车辆位置的雷达传感器。摄像机检测交通信号灯,读取路标,跟踪其他车辆以及激光雷达(光检测和测距)传感器从汽车周围反射光脉冲以测量距离,检测道路边缘并识别车道标记

    车道检测是这些车辆的重要组成部分。在公路运输中,车道是行车道的一部分,被指定用于单行车辆来控制和引导驾驶员并减少交通冲突。

    推荐!最适合初学者的18个经典开源计算机视觉项目

    在您的数据科学家的简历中添加一个令人兴奋的项目。以下是一些可用于实验的数据集-

    1. TUsimple

      该数据集是Tusimple车道检测挑战赛的一部分。它包含3626个视频片段,每个片段1秒。这些视频剪辑中的每一个都包含20帧,并带有带注释的最后一帧。它包含训练和测试数据集,其中包含3626个视频片段,训练数据集中的3626个带注释的帧和2782个用于测试的视频片段。

    如果您正在寻找一些开发项目的教程,请查看下面的文章-

    用于图像标注的开源计算机视觉项目

    您是否曾经希望过一些可以为社交媒体图像添加标注的技术,因为您和您的朋友都无法提出超酷的标注?用于图像标注的深度学习助您一臂之力。

    图像标注是为图像生成文本描述的过程。它是计算机视觉和自然语言处理(NLP)的组合任务。

    计算机视觉方法有助于理解并从输入图像中提取特征。此外,NLP以正确的单词顺序将图像转换为文本描述。

    推荐!最适合初学者的18个经典开源计算机视觉项目    

    以下是一些有用的数据集,可帮助您使用图像标注:

    1. COCO Caption

      COCO是大规模的对象检测,分割和标注数据集。它由330万张图像(标有> 200K)组成,具有150万个对象实例和80个对象类别,每个图像有5个标题。

    2. Ficker 8K 数据集

      它是一个图像标注语料库,由158,915个众包字幕组成,描述了31,783张图像。这是Flickr 8k数据集的扩展 。新的图像和标注集中于进行日常活动和事件的人们。

    如果您正在寻找项目的实施,我建议您看下面的文章:

    另外,我建议您阅读有关图像标注的著名论文。

    用于人体姿势估计的开源计算机视觉项目

    人体姿势估计是计算机视觉的有趣应用。您一定已经听说过Posenet,它是用于人体姿势估计的开源模型。简而言之,姿势估计是一种计算机视觉技术,可以推断图像/视频中存在的人或物体的姿势。

    在讨论姿势估计的工作之前,让我们首先了解“人体姿势骨架”。它是定义一个人的姿势的一组坐标。一对坐标是肢体。此外,通过识别,定位和跟踪图像或视频中人类姿势骨架的关键点来执行姿势估计。

     推荐!最适合初学者的18个经典开源计算机视觉项目

    资源

    如果要开发姿势估计模型,以下是一些数据集:

    1. MPII

      MPII Human Pose数据集是评估关节式姿势估计的最新基准。该数据集包含约25K图像,其中包含超过4 万名带注释的人体关节的人。总体而言,数据集涵盖410种人类活动,每个图像都有一个活动标签。

    2. HUMANEVA

      HumanEva-I数据集包含与3D人体姿势同步的7个校准视频序列。该数据库包含执行6个常见动作(例如,步行,慢跑,打手势等)的4个主题,这些动作被分为训练,验证和测试集。

    我发现Google的DeepPose是一篇使用深度学习模型进行姿势估计非常有趣的研究论文。此外,您可以访问有关姿势估计的多个研究论文,以更好地理解它。

    通过面部表情进行情感识别的开源计算机视觉项目

    面部表情在非语言交流以及识别人的过程中起着至关重要的作用。它们对于识别人的情绪非常重要。因此,关于面部表情的信息通常用于情绪识别的自动系统中。

    情绪识别是一项具有挑战性的任务,因为情绪可能会因环境,外观,文化和面部反应而异,从而导致数据不明确。

    面部表情识别系统是一个多阶段过程,包括面部图像处理,特征提取和分类。

    推荐!最适合初学者的18个经典开源计算机视觉项目

     资源

    以下是您可以用来练习的数据集:

    1. Real-world Affective Faces Database

      真实世界的情感面孔数据库(RAF-DB)是一个大规模的面部表情数据库,包含约3万张多种多样的面部图像。它由29672个真实世界的图像和每个图像的7维表情分布矢量组成,

    您可以阅读这些资源,以进一步了解您的内容-

    尾注

    总而言之,在本文中,我们讨论了可以作为初学者实现的10个有趣的计算机视觉项目。这不是一个详尽的清单。因此,如果您觉得我们错过了什么,请随时在下面的评论中添加!

    另外,在这里,我列出了一些有用的CV资源,以帮助您探索深度学习和计算机视觉世界:

    我们在课程和自我练习中学习的数据科学与我们在行业中工作的数据科学有很多差异。我建议您参加这些非常清晰宝贵的免费课程,以了解有关分析,机器学习和人工智能的所有信息:

    我希望你能够觉得这次的讨论对您有意义, 现在轮到你开始自己应用计算机视觉了。

    展开全文
  • 一、
    展开全文
  • imutils: A series of convenience functions to make basic image processing functions such as translation, rotation, resizing, skeletonization, displaying Matplotlib images, sorting contours, detecting ...

    前言

    目前大多数手机中的“手机扫描仪”具体是可以实现对证件,银行卡,资料等进行扫描,与普通相机最大不同是可以实现几何变形的自动矫正,同时还能够实现对文字内容增强(显示 效果更佳)。举个例子,对于公交卡进行扫描,由于拍摄人员的技术以及客观的一些原因导致拍摄出来的图片一般情况下存在这一定的几何畸变和其他一些背景的干扰。
    如下图所示,拍摄一张公交卡,背景是一张存在条纹的纸张。而我们不希望有这么大的几何变形以及背景干扰,会影响下一步的处理(如OCR识别)。

    在这里插入图片描述
    存在的问题:

    • 几何变形
    • 背景干扰

    思路:
    对于由于拍摄角度导致的变化,一般可以采用透射变换进行矫正。

    透视变换原理

    定义

    透视变换是将图片投影到一个新的视平面,也称为投影映射。

    换算公式

    [x,y,w]=[u,v,w][x',y',w']=[u,v,w][a11a12a13a21a22a23a31a32a33]\begin{bmatrix} a_{11} & a_{12}&a_{13} \\ a_{21}& a_{22}&a_{23}\\a_{31}&a_{32}&a_{33} \end{bmatrix}
    其中,[u,v,w][u,v,w]表示原始图片左边,对应得到变换后的图片坐标x,y,其中x=x/w,y=y/wx=x'/w',y=y'/w'.
    变换矩阵[a11a12a13a21a22a23a31a32a33]\begin{bmatrix} a_{11} & a_{12}&a_{13} \\ a_{21}& a_{22}&a_{23}\\a_{31}&a_{32}&a_{33} \end{bmatrix}可以拆成4个部分,[a11a12a21a22]\begin{bmatrix}a_{11}&a_{12}\\a_{21}&a_{22}\end{bmatrix}表示线性变换,比如scaling,shearing,ratotion.[a31a32][a_{31} a_{32}]用于平移,[a13a23]T[a_{13} a_{23}]^T产生透射变换。变换后的公式重写如下:
    x=x/w=(a11u+a21v+a31)/(a13u+a23v+a33)x=x'/w'=(a_{11}u+a_{21}v+a_{31})/(a_{13}u+a_{23}v+a_{33})
    y=y/w=(a12u+a22v+a32)/(a13u+a23v+a33)y=y'/w'=(a_{12}u+a_{22}v+a_{32})/(a_{13}u+a_{23}v+a_{33}),所以,已知变换对应的几个点就可以求取变换公式。反之,特定的变换公式也能得到新的变换后的图片。【还未探明w=1?】
    这样,就可以将一个畸变的四边形矫正成一个长方形。
    在这里插入图片描述 参考资料:

    https://www.cnblogs.com/jsxyhelu/p/4219564.html
    https://blog.csdn.net/wong_judy/article/details/6283019

    此时,我们已经明白我们需要完成的任务是什么–找四组对应点。如何找?我们知道,上图的四个序号点角点都是相邻两条线之间相交的点。因此可以通过:

    • 霍夫检测(直线)+求解直角点来查找拍摄图的四个角点,
    • 寻找四边形的轮廓的四个顶点来确定拍摄图的四个角点,
    • 或者手动输入四个角点。
      如何获取对应的点?
      对于扫描的文件,一般都会事先选型或者说选参数,实际上就是为在设置对应点的坐标(变换后的四边形尺寸)

    代码实现

    思路:

    • 读入图像并进行预处理
    • 寻找拍摄图的四个角点
    • 根据预设的尺寸,设置对应的四个角点,并计算透射变换的矩阵参数
    • 对透射图进行透射变换

    读入图像并进行预处理

    from imutils.perspective import four_point_transform
    import imutils
    import cv2
    import numpy as np
    from matplotlib import pyplot as plt
    import math
    
    '''
    # 图像预处理--将它转换为灰阶,轻度模糊【消除高频噪声】,然后边缘检测
    parameter:
        input_dir---图形路径
    Return:
        image--原始图片
        gray---灰度图
        edged--边缘图
    '''
    def Get_outline(input_dir):
        image=cv2.imread(input_dir)
        gray=cv2.cvtColor(image,cv2.COLOR_BGR2BGRA)
        blurred=cv2.GaussianBlur(gray,(5,5),0)
        edged=cv2.Canny(blurred,75,200)
        return image,gray,edged
    

    note:

    • cv2.imread()–读取图像,直接读出RGB格式,数据格式在0~255.
    cv2.imread(filepath,flags) #读入一张图像
    
    filepath:要读入图片的完整路径
    flags:读入图片的标志
    cv2.IMREAD_COLOR:默认参数,读入一副彩色图片,忽略alpha通道
    cv2.IMREAD_GRAYSCALE:读入灰度图片
    cv2.IMREAD_UNCHANGED:顾名思义,读入完整图片,包括alpha通道
    
    • cv2.cvtColor(p1,p2)—颜色空间转换函数,p1是需要转换的图片,p2是转换成何种格式。cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
      cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片。灰度图片并不是指常规意义上的黑白图片,只用看是不是无符号八位整型(unit8),单通道即可判断。
    cv2.cvtColor() #图像颜色空间转换
    
    img2 = cv2.cvtColor(img,cv2.COLOR_RGB2GRAY) #灰度化:彩色图像转为灰度图像
    img3 = cv2.cvtColor(img,cv2.COLOR_GRAY2RGB) #彩色化:灰度图像转为彩色图像
     cv2.COLOR_X2Y,其中X,Y = RGB, BGR, GRAY, HSV, YCrCb, XYZ, Lab, Luv, HLS
    
    

    在这里插入图片描述

    • GaussianBlur()–高斯滤波:对图像邻域内像素进行平滑,邻域内不同位置像素被赋予不同的权值,同时能够更多的保留图像的总体灰度分布特征。如果通过离散化窗口卷积,则主要利用高斯核,高斯核的大小为奇数(高斯卷积会在其覆盖区域的中心输出结果),常用的高斯模板如下几种形式:
      在这里插入图片描述
      高斯模板通过高斯函数计算出来,公式如下:
      在这里插入图片描述
    def GaussianBlur(src, ksize, sigmaX, dst=None, sigmaY=None, borderType=None): # real signature unknown; restored from __doc__
        """
        .   @brief Blurs an image using a Gaussian filter.
        .   
        .   The function convolves the source image with the specified Gaussian kernel【高斯核函数】. In-place filtering is
        .   supported.
        .   
        .   @param src input image; the image can have any number of channels, which are processed
        .   independently, but the depth should be CV_8U, CV_16U, CV_16S, CV_32F or CV_64F.
        .   @param dst output image of the same size and type as src.
        .   @param ksize Gaussian kernel size. ksize.width and ksize.height can differ but they both must be
        .   positive and odd. Or, they can be zero's and then they are computed from sigma【希腊字母】.
        .   @param sigmaX Gaussian kernel standard deviation【偏差】 in X direction.
        .   @param sigmaY Gaussian kernel standard deviation in Y direction; if sigmaY is zero, it is set to be
        .   equal to sigmaX, if both sigmas are zeros, they are computed from ksize.width and ksize.height,
        .   respectively (see #getGaussianKernel for details); to fully control the result regardless of
        .   possible future modifications of all this semantics【语意】, it is recommended to specify all of ksize,
        .   sigmaX, and sigmaY.
        .   @param borderType pixel【像素】 extrapolation【外插】 method, see #BorderTypes. #BORDER_WRAP is not supported.
        .  
        """
    
    
    • Canny()—边缘检测算法:使用Canny边缘检测器,图象边缘检测必须满足两个条件,1)能有效地抑制噪声;2)必须尽量精确确定边缘的位置。故之前使用了高斯滤波器。
    def Canny(image, threshold1, threshold2, edges=None, apertureSize=None, L2gradient=None): # real signature unknown; restored from __doc__
        """
        .   @brief Finds edges in an image using the Canny algorithm【多级边缘检测算法:找寻图像中灰色强度变化最强的位置】 @cite Canny86 .
        .   
        .   The function finds edges in the input image and marks them in the output map edges【边缘】 using the
        .   Canny algorithm. The smallest value between threshold1 and threshold2 is used for edge linking. The
        .   largest value is used to find initial segments of strong edges. 
        .   
        .   @param image 8-bit input image.
        .   @param edges output edge map; single channels 8-bit image, which has the same size as image .
        .   @param threshold1 first threshold for the hysteresis procedure【滞后处理】.
        .   @param threshold2 second threshold for the hysteresis procedure.
        .   @param apertureSize【孔径大小】 aperture size for the Sobel operator.
       
    

    寻找拍摄图的四个角点

    '''
    获取公交卡的轮廓
    parameter:
    edged--边缘图
    return:
    docCnt--符合公交卡的轮廓图
    '''
    def Get_cnt(edged):
        # 从边缘图中获取轮廓,然后初始化公交卡对应的轮廓
        cnts=cv2.findContours(edged.copy(),cv2.RETR_EXTERNAL,cv2.CHAIN_APPROX_SIMPLE)
        # 版本问题,不能使用:cnts=cnts[0] if imutils.is_cv2() else cnts[1]
        cnts=cnts[1] if imutils.is_cv3() else cnts[0]
        docCnt=None
    
        if len(cnts)>0:
            cnts=sorted(cnts,key=cv2.contourArea,reverse=True)  # 轮廓按大小降序排序
            for c in cnts:
                # 获取近似的轮廓
                peri=cv2.arcLength(c,True)
                approx=cv2.approxPolyDP(c,0.02*peri,True)
                # 如果我们的近似轮廓有四个顶点,那么就认为找到了公交卡
                if len(approx)==4:
                    docCnt=approx
                    break
    
        return docCnt
    

    Note

    • findContours()–寻找图像中物体的轮廓
    def findContours(image, mode, method, contours=None, hierarchy=None, offset=None): # real signature unknown; restored from __doc__
        """
        findContours(image, mode, method[, contours[, hierarchy[, offset]]]) -> contours, hierarchy
        .   @brief Finds contours[轮廓线] in a binary image.
        .   
        .   The function retrieves【恢复】 contours from the binary image using the algorithm @cite Suzuki85 . The contours
        .   are a useful tool for shape analysis and object detection and recognition. See squares.cpp in the
        .   OpenCV sample directory【指南】.
        .   
        .   @param image Source, an 8-bit single-channel image. Non-zero pixels are treated as 1's. Zero
        .   pixels remain 0's, so the image is treated as binary . You can use #compare, #inRange, #threshold ,
        .   #adaptiveThreshold, #Canny, and others to create a binary image out of a grayscale【灰度图】 or color one.
        .   If mode equals to #RETR_CCOMP or #RETR_FLOODFILL, the input can also be a 32-bit integer image of labels (CV_32SC1).
        .   @param contours Detected contours. Each contour is stored as a vector of points (e.g.
        .   std::vector<std::vector<cv::Point> >).
        .   @param hierarchy【层次】 Optional output vector (e.g. std::vector<cv::Vec4i>), containing information about the image topology【拓扑结构】. It has
        .   as many elements as the number of contours. For each i-th contour contours[i], the elements
        .   hierarchy[i][0] , hierarchy[i][1] , hierarchy[i][2] , and hierarchy[i][3] are set to 0-based indices【标注】
        .   in contours of the next and previous contours at the same hierarchical level, the first child
        .   contour and the parent contour, respectively. If for the contour i there are no next, previous,
        .   parent, or nested contours, the corresponding elements of hierarchy[i] will be negative[负数].
        .   @param mode Contour retrieval mode, see #RetrievalModes【轮廓检索模式】
        .   @param method Contour approximation method, see #ContourApproximationModes
        .   @param offset Optional offset by which every contour point is shifted. This is useful if the
        .   contours are extracted from the image ROI and then they should be analyzed in the whole image
        .   context.
        """
        pass
    
    • arcLength(curve, closed)—函数用于计算封闭轮廓的周长或曲线的长度。
    def arcLength(curve, closed): # real signature unknown; restored from __doc__
        """
        arcLength(curve, closed) -> retval
        .   @brief Calculates a contour perimeter【边界】 or a curve length.
      
        .   @param curve Input vector of 2D points, stored in std::vector or Mat.
        .   @param closed Flag indicating【显示】 whether the curve is closed or not.
        """
    
    • approxPolyDP()函数—拟合多边形
    def approxPolyDP(curve, epsilon, closed, approxCurve=None): # real signature unknown; restored from __doc__
        """
        approxPolyDP(curve, epsilon, closed[, approxCurve]) -> approxCurve
        .   @brief Approximates a polygonal【多边形】 curve(s) with the specified precision.
        .   
        .   The function cv::approxPolyDP approximates a curve or a polygon with another curve/polygon with less
        .   vertices【顶点】 so that the distance between them is less or equal to the specified precision. It uses the
        .   Douglas-Peucker algorithm 
        .   @param curve Input vector of a 2D point stored in std::vector or Mat
        .   @param approxCurve Result of the approximation. The type should match the type of the input curve.
        .   @param epsilon Parameter specifying the approximation accuracy. This is the maximum distance
        .   between the original curve and its approximation.
        .   @param closed If true, the approximated curve is closed (its first and last vertices are
        .   connected). Otherwise, it is not closed.
        """
    

    根据预设的尺寸,设置对应的四个角点,并计算透视变换的矩阵参数

    公交卡的比例是16:9,这里假设长高(320,180)注意:由于并不是正方形,所以这里要先确定长和高的对应假设,拍摄导致变形不会大到使长和高的尺寸发生变化。顶点的顺序是 左上、左下、右下、右上,分布计算并比较 左上到左下的距离 左上到右上的距离 确定长高

    # 计算点的距离
    def calculate_distance(point1,point2):
        d_x=point1[0]-point2[0]
        d_y=point1[1]-point2[1]
        distance=math.sqrt(d_x**2+d_y**2)
        return distance
    
    
    if __name__=='__main__':
        input_dir="gongjiaoka.png"
        image,gray,edged=Get_outline(input_dir)
        docCnt=Get_cnt(edged)
        print(docCnt.reshape(4,2))
    
        # 改变变化的模式,公交卡的比例为16:9
        pts1=np.float32(docCnt.reshape(4,2))
        # 加入一个判断,对不同长高采用不同的系数
        p=docCnt.reshape(4,2)
        if calculate_distance(p[0],p[1])<calculate_distance(p[0],p[3]):
            pts2=np.float32([[0,0],[0,180],[320,180],[320,0]])
           M=cv2.getPerspectiveTransform(pts1,pts2)
            dst=cv2.warpPerspective(image,M,(320,180))
    
        else:
            pts2=np.float32([[0,0],[0,320],[180,320],[180,0]])
            M=cv2.getPerspectiveTransform(pts1,pts2)
            dst=cv2.warpPerspective(image,M,(180,320))
    
        cv2.imwrite('0.png',dst)
    
    

    Note

    • getPerspectiveTransform()–透射变换函数:输入原始图像和变换后的图像对应四个点,便可以得到变换矩阵。
    def getPerspectiveTransform(src, dst, solveMethod=None): # real signature unknown; restored from __doc__
        """
        getPerspectiveTransform(src, dst[, solveMethod]) -> retval
        .   @brief Calculates a perspective transform from four pairs of the corresponding【相应的】 points.
        .   
        .   The function calculates the \f$3 \times 3\f$ matrix of a perspective transform so that:
        .   
        .   \f[\begin{bmatrix} t_i x'_i \\ t_i y'_i \\ t_i \end{bmatrix} = \texttt{map_matrix} \cdot \begin{bmatrix} x_i \\ y_i \\ 1 \end{bmatrix}\f]
        .   
        .   where
        .   
        .   \f[dst(i)=(x'_i,y'_i), src(i)=(x_i, y_i), i=0,1,2,3\f]
        .   
        .   @param src Coordinates【坐标值】 of quadrangle【四个角】 vertices【顶点】 in the source image.
        .   @param dst Coordinates of the corresponding quadrangle vertices in the destination【目标】 image.
        .   @param solveMethod method passed to cv::solve (#DecompTypes)
        .   
        """
    
    • warpPerspective()—对图像进行透视变换
    def warpPerspective(src, M, dsize, dst=None, flags=None, borderMode=None, borderValue=None): # real signature unknown; restored from __doc__
        """
        warpPerspective(src, M, dsize[, dst[, flags[, borderMode[, borderValue]]]]) -> dst
        .   @brief Applies a perspective transformation to an image.
        .   
        .   The function warpPerspective transforms the source image using the specified matrix:
       
        """
        pass
    
    def circle(img, center, radius, color, thickness=None, lineType=None, shift=None): # real signature unknown; restored from __doc__
        """
        circle(img, center, radius, color[, thickness[, lineType[, shift]]]) -> img
        .   @brief Draws a circle.
        .   
        .   The function cv::circle draws a simple or filled circle with a given center and radius.
        .   @param img Image where the circle is drawn.
        .   @param center Center of the circle.
        .   @param radius Radius of the circle.
        .   @param color Circle color.
        .   @param thickness Thickness of the circle outline, if positive. Negative values, like #FILLED,
        .   mean that a filled circle is to be drawn.
        .   @param lineType Type of the circle boundary. See #LineTypes
        .   @param shift Number of fractional bits in the coordinates of the center and in the radius value.
        """
        pass
    

    结果展示

        point_size=2
        point_color=(0,255,0)
        thickness=2
        for point in docCnt.reshape(4,2):
            cv2.circle(image,tuple(point),point_size,point_color,thickness)
    
    
        cv2.imshow('original',image)
        cv2.imshow('gray',gray)
        cv2.imshow('edged',edged)
        cv2.imshow('result_img',dst)
        cv2.waitKey(0)
        cv2.destroyAllWindows()
    

    效果图:
    原始图:在这里插入图片描述
    轮廓图:
    在这里插入图片描述
    描点图:
    在这里插入图片描述
    矫正的图:
    在这里插入图片描述

    展开全文
  • 注意:本文只是简单介绍一些不那么著名但非常好的开源项目,你可以在你的项目中使用这些项目。要阅读有关它们的更多信息,我建议遵循项目中提供的链接。 拥有良好的理论知识是惊人的,但在实时机器学习项目中用代码...
  • Faster rcnn损失函数部分:为什么采用L1而不用L2? smoothed L1 Loss is a robust L1 loss that is less sensitive to outliers than the L2 loss used in R-CNN and SPPnet. 上述是Fast RCNN解释为什么采用...
  • 计算机视觉项目

    2019-10-16 18:00:12
    公式图片ocr,输入图片输出对应的latex表达式
  • 微软亚洲研究院视觉计算组提出的一种新型主干网络结构,可以学到高分辨率表征,提高了目标特别是小目标检测的空间精准率。支持multi-scale sync-bn 训练。 代码: https://github.com/HRNet/HRNet-Object-Detection...
  • 深入理解OpenCV:实用计算机视觉项目解析-源代码.zip 资源是从华章出版社官网下载的 受上传文件大小限制 2个文件下载完成后解压即可
  • python计算机视觉项目实践 答案

    千次阅读 2014-05-05 09:58:12
    python 计算机视觉项目实践
  • 深入理解OpenCV:实用计算机视觉项目解析 目录 1 Android系统上的卡通化和皮肤变换2 iPhone或iPad上基于标记的增强现实3 无标记的增强现实4 使用OpenCV研究从运动中恢复结构(SfM)5 基于SVM和...
  • 计算机视觉人脸相关开源项目总结

    万次阅读 多人点赞 2017-12-24 16:38:20
    openface openface是一个基于深度神经网络的开源人脸识别系统。该系统基于谷歌的文章《FaceNet: A Unified Embedding for Face Recognition and Clustering》。openface是卡内基梅隆大学的 Brandon Amos主导的。...
  • 计算机视觉期末报告---项目

    千次阅读 2013-06-26 08:42:59
    已经给出各种电缆的横截面切片图(见附件),需要通过计算机视觉处理,检测电缆外包皮的厚度。 基本要求: 1、采用C语言编程(不允许使用MATLAB),设计图像识别程序,能够对已知图像序列进行厚度计算。需要计算...
  • 来源:Unsplash,作者:JR Korpa来源:知乎问题今天分享一下 Github 上不错的计算机视觉或者机器视觉方面的项目,包括入门的教程、非常经典的算法和实战...
  • 计算机视觉实习面试经历

    万次阅读 2018-03-13 20:55:25
    实习岗位:计算机视觉个人相关经历:一篇SCI 1区文章在投(和视觉无关);一篇卷积神经网络特征可视化文章(中文核心,本科毕设整理);一段跨度半年的机器人比赛(我负责机器人定位和目标定位);一段比较水的人脸...
  • Python计算机视觉——方法总结

    千次阅读 2018-12-05 13:23:51
    刚开始看书的时候感觉书里面使用的方法,自己多看几次就能记住了,不过,看了一些之后,发现可能有的时候看到后面,想一句句读的时候发现忘记了这个方法是干嘛的了,不管是啥方法,先记录一下吧。...
  • python计算机视觉项目实践

    千次阅读 2014-04-18 10:48:31
    这是一个贝叶斯模型的计算机视觉小项目,希望大家通过这个简单的项目知道一般的计算机视觉项目是如何操作的。
  • 机器学习与计算机视觉入门项目——视频投篮检测(一) 随着机器学习、深度学习技术的迅猛发展,计算机视觉无疑是近年来发展最快的AI领域之一。正因如此,互联网上有关计算机视觉和机器学习、深度学习的社区、博文、...
  • Carole@WP 4.caffe资源汇总(更新中)香蕉麦乐迪的博客
  • 来源: 腾讯研究院本文约3500字,建议阅读10分钟。本文介绍了大众带来当下计算机视觉技术发展的全面解读,也为即将到来的计算机视觉峰会拉开序幕。视觉是人类认知世界的重要组...

空空如也

1 2 3 4 5 ... 20
收藏数 56,131
精华内容 22,452
关键字:

计算机视觉项目