史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门

史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门,第1张

概述<pstyle=\"margin-top:1em;margin-bottom:0px;border:0px;font-size:18px;line-height:inherit;font-family:helvetica,Arial,\'HiraginoSansGB\',\'MicrosoftYaHei\',simsun;vertical-align:baseline;color:

<p >一、Python OpenCV 入门

<p >欢迎阅读系列教程,内容涵盖 OpenCV,它是一个图像和视频处理库,包含 C ++,C,Python 和 Java 的绑定。 OpenCV 用于各种图像和视频分析,如面部识别和检测,车牌阅读,照片编辑,高级机器人视觉,光学字符识别等等。

<p >你将需要两个主要的库,第三个可选:python-OpenCV,Numpy 和 Matplotlib。

<p >windows 用户:

<p >python-OpenCV:有其他的方法,但这是最简单的。 下载相应的 wheel(.whl)文件,然后使用pip进行安装。 观看视频来寻求帮助。

<pre ><pre ><code >pip <span >install numpy
pip <span >install matplotlib
<p >不熟悉使用pip? 请参阅pip安装教程来获得帮助。

<p >linux/Mac 用户

<pre ><code >pip3 <span >install numpy
<p >或者

<pre ><code >apt-<span >get install python3-numpy
<p >你可能需要apt-get来安装python3-pip。

<pre >install matplotlib
<p >get install python3-matplotlib
apt-<span >get install python-OpenCV
<p >Matplotlib 是用于展示来自视频或图像的帧的可选选项。 我们将在这里展示几个使用它的例子。 Numpy 被用于“数值和 Python”的所有东西。 我们主要利用 Numpy 的数组功能。 最后,我们使用python-OpenCV,它是 Python 特定的 OpenCV 绑定。

<p >OpenCV 有一些 *** 作,如果没有完整安装 OpenCV (大小约 3GB),你将无法完成,但是实际上你可以用 python-OpenCV 最简安装。 我们将在本系列的后续部分中使用 OpenCV 的完整安装,如果你愿意的话,你可以随意获得它,但这三个模块将使我们忙碌一段时间!

<p >通过运行 Python 并执行下列命令来确保你安装成功:

<pre ><code ><span >import cv2
<span >import matplotlib
<span >import numpy
<p >如果你没有错误,那么你已经准备好了。好了嘛?让我们下潜吧!

<p >首先,在图像和视频分析方面,我们应该了解一些基本的假设和范式。对现在每个摄像机的记录方式来说,记录实际上是一帧一帧地显示,每秒 30-60 次。但是,它们的核心是静态帧,就像图像一样。因此,图像识别和视频分析大部分使用相同的方法。有些东西,如方向跟踪,将需要连续的图像(帧),但像面部检测或物体识别等东西,在图像和视频中代码几乎完全相同。

<p >接下来,大量的图像和视频分析归结为尽可能简化来源。这几乎总是起始于转换为灰度,但也可以是彩色滤镜,渐变或这些的组合。从这里,我们可以对来源执行各种分析和转化。一般来说,这里发生的事情是转换完成,然后是分析,然后是任何覆盖,我们希望应用在原始来源上,这就是你可以经常看到,对象或面部识别的“成品”在全色图像或视频上显示。然而,数据实际上很少以这种原始形式处理。有一些我们可以在基本层面上做些什么的例子。所有这些都使用基本的网络摄像头来完成,没有什么特别的:

<p >背景提取

<p >颜色过滤

<p >边缘检测

<p >用于对象识别的特征匹配

<p >一般对象识别

<p >在边缘检测的情况下,黑色对应于(0,0)的像素值,而白色线条是(255,255)。视频中的每个图片和帧都会像这样分解为像素,并且像边缘检测一样,我们可以推断,边缘是基于白色与黑色像素对比的地方。然后,如果我们想看到标记边缘的原始图像,我们记录下白色像素的所有坐标位置,然后在原始图像或视频上标记这些位置。

<p >到本教程结束时,你将能够完成上述所有 *** 作,并且能够训练你的机器识别你想要的任何对象。就像我刚开始说的,第一步通常是转换为灰度。在此之前,我们需要加载图像。因此,我们来做吧!在整个教程中,我极力鼓励你使用你自己的数据来玩。如果你有摄像头,一定要使用它,否则找到你认为很有趣的图像。如果你有麻烦,这是一个手表的图像:

<pre >import numpy <span >as np
from matplotlib <span >import pyplot <span >as plt
img = cv2.imread(<span >'watch.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow(<span >'image',img)
cv2.waitKey(<span >0)
cv2.destroyAllwindows()
<p >首先,我们正在导入一些东西,我已经安装了这三个模块。接下来,我们将img定义为cv2.read(image file,parms)。默认值是IMREAD_color,这是没有任何 Alpha 通道的颜色。如果你不熟悉,Alpha 是不透明度(与透明度相反)。如果你需要保留 Alpha 通道,也可以使用IMREAD_UNCHANGED。很多时候,你会读取颜色版本,然后将其转换为灰度。如果你没有网络摄像机,这将是你在本教程中使用的主要方法,即加载图像。

<p >你可以不使用IMREAD_color ...等,而是使用简单的数字。你应该熟悉这两种选择,以便了解某个人在做什么。对于第二个参数,可以使用-1,0或1。颜色为1,灰度为0,不变为-1。因此,对于灰度,可以执行cv2.imread('watch.jpg',0)。

<p >一旦加载完成,我们使用cv2.imshow(Title,image)来显示图像。从这里,我们使用cv2.waitKey(0)来等待,直到有任何按键被按下。一旦完成,我们使用cv2.destroyAllwindows()来关闭所有的东西。

<p >正如前面提到的,你也可以用 Matplotlib 显示图像,下面是一些如何实现的代码:

<pre margin:0px;padding:0px;border:0px;Font-style:inherit;Font-variant:inherit;Font-weight:inherit;line-height:inherit;Font-family:inherit;vertical-align:baseline;color:rgb(33,97);">'gray',interpolation = <span >'bicubic')
plt.xticks([]),plt.yticks([]) # to hIDe tick values on X <span >and Y axis
plt.plot([<span >200,<span >300,112);">400],[<span >100,112);">300],<span >'c',linewidth=<span >5)
plt.show()
<p >请注意,你可以绘制线条,就像任何其他 Matplotlib 图表一样,使用像素位置作为坐标的。 不过,如果你想绘制你的图片,Matplotlib 不是必需的。 OpenCV 为此提供了很好的方法。 当你完成修改后,你可以保存,如下所示:

<pre >cv2<span >.imwrite(<span >'watchgray.png',img)
<p >将图片导入 OpenCV 似乎很容易,加载视频源如何? 在下一个教程中,我们将展示如何加载摄像头或视频源。

<p >二、加载视频源

<p >在这个 Python OpenCV 教程中,我们将介绍一些使用视频和摄像头的基本 *** 作。 除了起始行,处理来自视频的帧与处理图像是一样的。 我们来举例说明一下:

<pre >import numpy as np
<span >import cv2
cap = cv2.VIDeoCapture(<span >0)

<span >while(True):
ret,frame = cap.<span >read()
gray = cv2.cvtcolor(frame,cv2.color_BGR2GRAY)

cv2.imshow(<span >'frame',gray)
<span >if cv2.waitKey(<span >1) & <span >0xFF == ord(<span >'q'):
<span >break
cap.<span >release()
cv2.destroyAllwindows()
<p >首先,我们导入numpy和cv2,没有什么特别的。 接下来,我们可以cap = cv2.VIDeoCapture(0)。 这将从你计算机上的第一个网络摄像头返回视频。 如果你正在观看视频教程,你将看到我正在使用1,因为我的第一个摄像头正在录制我,第二个摄像头用于实际的教程源。

<pre >while(True):
<span >ret,frame = <span >cap.<span >read()
<p >这段代码启动了一个无限循环(稍后将被break语句打破),其中ret和frame被定义为cap.read()。 基本上,ret是一个代表是否有返回的布尔值,frame是每个返回的帧。 如果没有帧,你不会得到错误,你会得到None。

<pre ><code > gray = cv2.cvtcolor(frame,cv2.color_BGR2GRAY)
<p >在这里,我们定义一个新的变量gray,作为转换为灰度的帧。 注意这个BGR2GRAY。 需要注意的是,OpenCV 将颜色读取为 BGR(蓝绿色红色),但大多数计算机应用程序读取为 RGB(红绿蓝)。 记住这一点。

<pre ><code > <span >.imshow(<span margin-top:1em;margin-bottom:0px;border:0px;Font-size:18px;line-height:inherit;Font-family:helvetica,255);">请注意,尽管是视频流,我们仍然使用imshow。 在这里,我们展示了转换为灰色的源。 如果你想同时显示,你可以对原始帧和灰度执行imshow,将出现两个窗口。

<pre >if cv2.waitKey(<span >'q'):
<span >break
<p >这个语句每帧只运行一次。 基本上,如果我们得到一个按键,那个键是q,我们将退出while循环,然后运行:

<pre >cap<span >.release()
<span >.destroyAllwindows()
<p >这将释放网络摄像头,然后关闭所有的imshow()窗口。

<p >在某些情况下,你可能实际上需要录制,并将录制内容保存到新文件中。 以下是在 windows 上执行此 *** 作的示例:

<pre >as np
<span >1)
fourcc = cv2.VIDeoWriter_fourcc(*<span >'XVID')
<span >out = cv2.VIDeoWriter(<span >'output.avi',fourcc,112);">20.0,(<span >640,112);">480))
<span >while(True):
ret,frame = cap.read()
gray = cv2.cvtcolor(frame,cv2.color_BGR2GRAY)
<span >out.write(frame)
cv2.imshow(<span margin:0px;padding:0px;border:0px;Font-style:inherit;Font-variant:inherit;Font-weight:inherit;line-height:inherit;Font-family:inherit;vertical-align:baseline;color:rgb(149,33);">break
cap.release()
<span >out.release()
cv2.destroyAllwindows()
<p >这里主要要注意的是正在使用的编解码器,以及在while循环之前定义的输出信息。 然后,在while循环中,我们使用out.write()来输出帧。 最后,在while循环之外,在我们释放摄像头之后,我们也释放out。

<p >太好了,现在我们知道如何 *** 作图像和视频。 如果你没有网络摄像头,你可以使用图像甚至视频来跟随教程的其余部分。 如果你希望使用视频而不是网络摄像头作为源,则可以为视频指定文件路径,而不是摄像头号码。

<p >现在我们可以使用来源了,让我们来展示如何绘制东西。 此前你已经看到,你可以使用 Matplotlib 在图片顶部绘制,但是 Matplotlib 并不真正用于此目的,特别是不能用于视频源。 幸运的是,OpenCV 提供了一些很棒的工具,来帮助我们实时绘制和标记我们的源,这就是我们将在下一个教程中讨论的内容。

<p >三、在图像上绘制和写字

<p >在这个 Python OpenCV 教程中,我们将介绍如何在图像和视频上绘制各种形状。 想要以某种方式标记检测到的对象是相当普遍的,所以我们人类可以很容易地看到我们的程序是否按照我们的希望工作。 一个例子就是之前显示的图像之一:

<p >对于这个临时的例子,我将使用下面的图片:

<p >鼓励你使用自己的图片。 像往常一样,我们的起始代码可以是这样的:

<pre >import cv2
img = cv2.imread(<span margin-top:1em;margin-bottom:0px;border:0px;Font-size:18px;line-height:inherit;Font-family:helvetica,255);">下面,我们可以开始绘制,这样:

<pre ><code >cv2.line(img,112);">0,112);">0),112);">150,112);">150),112);">255,112);">255),112);">15)
cv2.imshow('image',255);">cv2.line()接受以下参数:图片,开始坐标,结束坐标,颜色(bgr),线条粗细。

<p >结果在这里:

<p >好吧,很酷,让我们绘制更多形状。 接下来是一个矩形:

<pre ><code >cv2.rectangle(img,112);">15,112);">25),112);">15)
<p >这里的参数是图像,左上角坐标,右下角坐标,颜色和线条粗细。

<p >圆怎么样?

<pre ><code >cv2.circle(img,112);">63),112);">55,112);">-1)
<p >这里的参数是图像/帧,圆心,半径,颜色和。 注意我们粗细为-1。 这意味着将填充对象,所以我们会得到一个圆。

<p >线条,矩形和圆都很酷,但是如果我们想要五边形,八边形或十八边形? 没问题!

<pre ><code >pts = np.array([[10,5],[20,30],[70,20],[50,10]],np.int32)
<span ># OpenCV documentation had this code,which reshapes the array to a 1 x 2. I dID not
<span ># find this necessary,but you may:
<span >#pts = pts.reshape((-1,1,2))
cv2.polylines(img,[pts],True,(0,255),3)
<p >首先,我们将坐标数组称为pts(点的简称)。 然后,我们使用cv2.polylines来画线。 参数如下:绘制的对象,坐标,我们应该连接终止的和起始点,颜色和粗细。

<p >你可能想要做的最后一件事是在图像上写字。 这可以这样做:

<pre ><code >Font = cv2.Font_HERShey_SIMPLEX
cv2.putText(img,'OpenCV Tuts!',112);">130),Font,112);">1,112);">155),112);">2,cv2.liNE_AA)
<p >目前为止的完整代码:

<pre ><code >import numpy as np
import cv2
img = cv2.imread('watch.jpg',cv2.IMREAD_color)
cv2.line(img,112);">300),112);">50)
cv2.rectangle(img,112);">500,112);">250),112);">1000,112);">500),112);">15)
cv2.circle(img,112);">447,112);">63,112);">-1)
pts = np.array([[<span >50],112);">700,112);">200],112);">100]],np.int32)
pts = pts.reshape((<span >-1,112);">2))
cv2.polylines(img,112);">3)
Font = cv2.Font_HERShey_SIMPLEX
cv2.putText(img,112);">10,112);">6,112);">13,cv2.liNE_AA)
cv2.imshow('image',255);">结果:

<p >在下一个教程中,我们将介绍我们可以执行的基本图像 *** 作。

<p >四、图像 *** 作

<p >在 OpenCV 教程中,我们将介绍一些我们可以做的简单图像 *** 作。 每个视频分解成帧。 然后每一帧,就像一个图像,分解成存储在行和列中的,帧/图片中的像素。 每个像素都有一个坐标位置,每个像素都由颜色值组成。 让我们列举访问不同的位的一些例子。

<p >我们将像往常一样读取图像(如果可以,请使用自己的图像,但这里是我在这里使用的图像):

<pre >as np
img = cv2.imread(<span >现在我们可以实际引用特定像素,像这样:

<pre ><code ><span >px = img[<span >55]
<p >下面我们可以实际修改像素:

<pre ><code >img[<span >55] = [<span >255]
<p >之后重新引用:

<pre ><code >px = <span >img[<span >55]
<span ><span >print<span >(px)
<p >现在应该不同了,下面我们可以引用 ROI,图像区域:

<pre >100:<span >150]
<span ><span >我们也可以修改 ROI,像这样:

<pre ><code >img<span >[100:150,100:150] = <span >[255,255]
<p >我们可以引用我们的图像的特定特征:

<pre ><code ><span ><span >(img.shape)
<span ><span >(img.size)
<span ><span >(img.dtype)
<p >我们可以像这样执行 *** 作:

<pre ><code >watch_face = <span >37:<span >111,112);">107:<span >194]
<span >0:<span >74,112);">87] = watch_face
cv2.imshow(<span >这会处理我的图像,但是可能不能用于你的图像,取决于尺寸。这是我的输出:

<p >这些是一些简单的 *** 作。 在下一个教程中,我们将介绍一些我们可以执行的更高级的图像 *** 作。

<p >五、图像算术和逻辑运算

<p >欢迎来到另一个 Python OpenCV 教程,在本教程中,我们将介绍一些简单算术运算,我们可以在图像上执行的,并解释它们的作用。 为此,我们将需要两个相同大小的图像来开始,然后是一个较小的图像和一个较大的图像。 首先,我将使用:

<p >和

<p >首先,让我们看看简单的加法会做什么:

<pre ><code >import cv2
import numpy as np
<span ># 500 x 250
img1 = cv2.imread(<span >'3D-Matplotlib.png')
img2 = cv2.imread(<span >'mainsvmimage.png')
<span >add<span > = img1+img2
cv2.imshow(<span >'add',<span >add<span >)
cv2.waitKey(<span >结果:

<div >

<p >

总结

以上是内存溢出为你收集整理的史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门全部内容,希望文章能够帮你解决史上最全的OpenCV入门教程!这篇够你学习半个月了!万字长文入门所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/langs/1208980.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-06-04
下一篇 2022-06-04

发表评论

登录后才能评论

评论列表(0条)

保存