解析Computer Vision和OpenCV库的工作原理


    在这篇文章中,将尝试解释Computer Vision和OpenCV库的工作原理。
    在整篇文章中,将介绍:什么是计算机视觉?计算机视觉如何工作?计算机视觉的应用、什么是OpenCV?OpenCV的简史、OpenCV快速入门
    让我们逐步开始。
    什么是计算机视觉?
    Computer Vision是一个工作场所,可让我们以数字方式检测图像并对这些图像执行操作。Computer Vision是一个人工智能工作区,在这里我们可以通过访问数字媒体中的图像特征来收集信息并提取特征。在其他来源中,其定义如下:
    维基百科:
    计算机视觉是一门跨学科的科学领域,涉及计算机如何从数字图像或视频中获得高级了解。从工程学的角度来看,它试图理解和自动化人类视觉系统可以完成的任务。
    IBM:
    计算机视觉是人工智能(AI)的领域,它使计算机和系统能够从数字图像,视频和其他视觉输入中获取有意义的信息,并根据该信息采取行动或提出建议。如果AI使计算机能够思考,则计算机视觉使他们能够看到,观察和理解。计算机视觉的主要目的是理解图像并解释它们以供我们使用。作为人类,我们可以用眼睛轻松感知任何街道上的移动物体。计算机使用许多不同的算法来理解这一点。但是,使用这些算法,计算机可能仍无法给出非常高精度的结果。
    
    计算机视觉如何工作?
    计算机使用某些算法来检测数字媒体中的图像。数字媒体中的图像由像素组成。任何图像中的像素都具有颜色和坐标。想象一下,每个像素都有自己的标识。在其ID上,它写入坐标和颜色信息。这是计算机可以检测和识别图像的方式。像素的坐标和颜色信息用数字表示。数字是根据RGB格式定义的。由于图像身份中的此信息是用数字表示的,因此计算机可以理解这一点。每个图像可以包含数千个像素。这些像素也作为矩阵保留在图像上。因此,如果我们要在视觉上进行操作,则需要通过矩阵进行操作。
    计算机视觉分为三个基本步骤:
    1.获取图像
    可以通过视频,照片或3D技术实时获取甚至大集合的图像进行分析。
    2.处理图像
    深度学习模型会自动执行此过程的大部分过程,但是通常会先向模型提供数千张标记或预先识别的图像,然后对模型进行训练。
    3.了解图像
    最后一步是解释性步骤,在此步骤中对对象进行识别或分类。
    计算机视觉的应用
    最受欢迎的计算机视觉应用程序的示例:
    癌症检测
    COVID-19诊断
    口罩检测
    车辆分类
    交通流量分析
    停车占用检测
    自动车牌识别
    客户追踪
    人数盘点
    社会距离
    球追踪球
    门线技术
    什么是OpenCV?
    OpenCV,即开源计算机视觉库。可以理解,它是一个开放源代码的计算机视觉库。如今,它在图像处理领域非常流行。你可以使用Java,C ++或Python语言在OpenCV上工作。通过使用OpenCV,人们可以处理图像和视频以识别对象,面部,甚至是人的笔迹。当它与各种库(例如Numpy)集成时,python能够处理OpenCV数组结构以进行分析。为了识别图像模式及其各种特征,我们使用向量空间并对这些特征执行数学运算。
    OpenCV的简史
    OpenCV由加里·布拉德斯基(Gary Bradsky)于1999年在英特尔创立,第一版于2000年问世。瓦迪姆·皮萨列夫斯基(Vadim Pisarevsky)与加里·布拉德斯基(Gary Bradsky)一起管理英特尔的俄罗斯软件OpenCV团队。2005年,OpenCV用于Stanley,该车赢得了2005年DARPA大挑战赛的冠军。后来,在Willow Garage的支持下,它的发展得以继续,Gary Bradsky和Vadim Pisarevsky领导了该项目。OpenCV现在支持与计算机视觉和机器学习有关的多种算法,并且正在日益扩展。OpenCV支持多种编程语言,例如C ++,Python,Java等,并且可在包括Windows,Linux,OS X,Android和iOS在内的不同平台上使用。基于CUDA和OpenCL的高速GPU操作的接口也正在积极开发中。OpenCV-Python是用于OpenCV的Python API,结合了OpenCV C ++ API的最佳质量和Python语言。
    OpenCV快速入门
    在讨论了计算机视觉和OpenCV之后,我想向你展示我们可以使用一些简单的应用程序来做些什么。这样,你既可以练习得更好,又可以进入学习过程。读取图像首先,我们将使用OpenCV进行读取图像并将其显示在屏幕上的过程。如果在使用Python的IDE中未安装OpenCV,则必须先安装它。pip install opencv-python
    安装之后,首先,你必须导入库。你可以将OpenCV库称为cv2。你需要将要读取的图像保存到对象中。你可以使用cv2.imread( )函数读取图像。此函数将获取图像的文件的路径作为参数。由于我的python工作文件与图片位于同一文件夹中,因此我直接输入图片的名称。这里要注意的一点是编写视觉效果的扩展。别忘了这个。当我们运行代码时,我们给该窗口命名,因为它将在可视窗口中打开。我们使用cv2.namedWindow( ).函数执行此操作。该函数将窗口的名称作为其第一个参数。实际上,这就足够了。
    但是由于我希望能够更改打开的窗口的大小,因此我添加了参数cv2.WINDOW_NORMAL.代码运行时,函数cv2.imshow( )用于在屏幕上显示当前图像。它有两个参数。第一个是我们将要显示的视觉效果的名称,第二个是它在其中注册的对象。在这里,我将图像保存为img。因此,我将img用作第二个参数。
    最后,我编写该函数cv2.waitKey(0)是因为希望在打开的可视屏幕上随时关闭它。此函数以毫秒为单位获取数字值。当我们在此处写入0时,表示我们可以随时关闭窗口。另外,养成添加函数cv2.destroyAllWindows().的习惯。当我们执行高级项目时,我们会忘记关闭许多在屏幕上打开的窗口。此函数可避免这种情况。你可以在下面找到所有代码。import cv2                                                        
    img = cv2.imread("klon.jpg")
    cv2.namedWindow("Image",cv2.WINDOW_NORMAL)
    cv2.imshow("Image", img)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    从网络摄像头读取视频现在,让我们检查一下如何从计算机摄像机读取视频。首先,我们导入OpenCV库。然后,我们将从计算机摄像机拍摄的图像写在一个物体上。我将此对象设置为捕获。我们使用cv2.VideoCapture(0)函数从计算机摄像头捕获视频。此处的值0用于访问连接到计算机的相机。如果你有摄像机,则可以将其设为0。如果你有更多摄像机,则可以尝试1,2 ..访问相应的摄像机。如你所知,视频由帧组成。为了查看我们在视频中捕获的图像,我们必须将它们循环打印在屏幕上。
    因此,我们进行了定义,将读取捕获的图像,然后将该图像返回给我们。ret, frame = capture.read()
    然后我们进行调整。要在镜中看到自己看到的捕获图像,我们需要将它们反转为y轴。这就是为什么我们在frame = cv2.flip(frame, 1).此处编写代码的原因,当我们在帧后输入参数为1时,它给出了y轴图像的倒数。然后,我们编写代码cv2.imshow("Webcam", frame)以显示从相机拍摄的帧。然后,我们确定捕获的图像将在屏幕上保留几毫秒。除此之外,当我们按下键盘上的q键时,我们将编写以下代码以停止接收图像。cv2.imshow("Webcam", frame)
    if cv2.waitKey(30) & 0xFF == ord("q"):
        break
    在此,0xFF == ord("q")是指按键盘上的q键。最后,在处理完视频之后,完成后,我们需要编写一些代码来发布图像。如下。capture.release()
    你可以在下面找到所有代码。import cv2
      
    capture = cv2.VideoCapture(0)                                        
    while True:
         ret, frame = capture.read()
         frame = cv2.flip(frame, 1)
         cv2.imshow("Webcam", frame)
         if cv2.waitKey(30) & 0xFF == ord("q"):
             break
    capture.release()
    cv2.destroyAllWindows()
    长宽比应用现在,我将向你展示一个长宽比应用程序。在某些情况下,我们可能不知道图像的尺寸。在这种情况下,可以通过避免手动计算来使用此类应用程序来实现此目的的自动化。我们定义了一个名为resizewithAspectRatio的函数。我们为此函数设置了4个参数。这些是:为其保留图像的变量的名称宽度高度并具有避免在调整大小时插值的功能让我们继续执行要应用的步骤。首先,我们定义一个维变量,其预定义为空。然后,将原始尺寸中图像的前两个尺寸分别作为高度和宽度的h和w保存到一个元组中。如果未指定宽度和高度,则我们希望图像返回其原始状态。如果未指定宽度,我们希望执行以下操作。r = height / float(h)
    dimension = (int(w*r),height)
    让我告诉你这是什么意思。我们计算原始图像中给定的高度与尺寸的比率。然后,我们将该比例乘以原始宽度,然后得出新尺寸。因此,在视觉上没有尺寸的变形。否则,如果没有给出高度,我们将再次应用类似的程序。结果,我们希望根据使用以下代码编写的函数输出调整大小后的视觉效果。return cv2.resize(img, dimension, interpolation= inter)
    然后,根据编写的函数读取原始图像和调整大小后的图像。img = cv2.imread("klon.jpg")
    img1 = resizewithAspectRatio(img,
                                 width = None,
                                 height = 600,
                                 inter = cv2.INTER_AREA)
    最后,我们通过编写一些我们知道的代码来完成应用程序。cv2.imshow("Original",img)
    cv2.imshow("Resized",img1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()
    你可以在下面找到所有代码。import cv2
    def resizewithAspectRatio(  img
                              , width = None
                              , height = None
                              , inter = cv2.INTER_AREA):              
        dimension: None
        (h,w) =  img.shape[:2]
        if width is None and height is None:
            return img
        if width is None:
            r = height / float(h)
            dimension = (int(w*r),height)
        else:
            r = width / float(w)
            dimension = (width, int(h*r))
        return cv2.resize(img, dimension, interpolation= inter)
    img = cv2.imread("klon.jpg")
    img1 = resizewithAspectRatio(  img
                                 , width = None
                                 , height = 600
                                 , inter = cv2.INTER_AREA)
    cv2.imshow("Original",img)
    cv2.imshow("Resized",img1)
    cv2.waitKey(0)
    cv2.destroyAllWindows()