白话文讲计算机视觉-第一讲-OPENCV图片及视频读写

大家好,我是小木,没想到吧,我又回来了,啊哈哈哈。之前几天我肠胃感冒,所以我的博客就一直没有更新。但我小木是打不死的小强,这次继续回来讲解啦!

本次课程我主讲的内容是计算机视觉。为什么小木我要开这次课程呢?很简单,因为我之前读了一本书,叫做《OPENCV3 计算机视觉 PYTHON语言实现》。读了这本书,不知道是翻译没翻译好,还是国外的作者写的不好,读起来语句不通,知识概念模糊,稍有常识的人都会知道,这是人能读的懂的么,一本全tmd是术语,能不能好好说话?

本人最讨厌的是不好好说话的人,总说一些别人听不懂的之乎者也,显得自己像一个文化人,尤其是那些上了名校的本科,自以为了不起的人。我一般很喜欢用白话把他说的听起来很困难的东西变成简单的不行的,幼儿园小朋友都可以理解的东西,直接给他搞的下不了台。虽然本人的正直得罪的不少人,但是这并不影响本人在网络中进行知识的普及。

废话不多说,开始今天的内容:

首先我先说一下啥叫OPENCVOPENCV是一个缩写,它的英文全称是Open source computer version,也就是免费的计算机视觉资源。我来一个个地解释一下,OPEN也就是open source,这个意思是开放资源,也就是免费资源。我们中国人一般有点东西都藏起来。而美国人不是这样的,他们是做出来什么,直接发到网上,毫无保留,为了就是告诉大家,我能!美国人很单纯,很实在,我们一定要学习。Computer version也就是CV,指的是计算机视觉,视觉我们最能联想到的是眼睛,那么计算机的眼睛是啥?它有眼睛?我的回答是有的,我们笔记本上面是不是都有一个摄像头?你坐在计算机的面前,它是不是能通过摄像的方式看到你呢?这个难道不是计算机的眼睛吗?所以计算机视觉也就是对计算机摄像头或者是已有的图片进行处理,让它能够辨识一些事物,比如我们上班打卡的人脸识别。

我们名字已经介绍完成了,既然灯塔国的科学家为我们提供了这么好的东西,那么我们是不是必须拿来研究一下,才能对得起他们的心血呢?那么我们就开始吧!

我们这次讲座使用的编程语言叫做PYTHON,这个语言的教程网上太多了,大家如果不太懂的话,随便找找教程看看就行了。

1)我们先来一个基础,来说一下如何运用OPENCV,读取一张图片,并在屏幕上输出。

首先,我们导入两个库,一个是cv库,另外一个是numpy库。为啥要这两个库呢,第一个库是计算机视觉的类库,里面包含很多视觉算法。第二库是矩阵库,这个库里面包括很多用来计算矩阵的算法。

其次,我们要做的是用imread类读取图片文件到内存中,假如小木我读取的文件名字是opencv1-1.png图片样式为

 

接下来,我们要做的是把读取的图片在屏幕上显示,使用imshow类。

最后,我们设定一个参数,按键盘任意键,可以关闭图像。

代码如下所示:

#导入cv与numpy库

import cv2

import numpy

#读入图片opencv1-1.png到变量img中

img=cv2.imread('D:/小木/opencv1-1.png')

#在屏幕上显示图片,图片窗口名称为dawawa,展示的图片为img

cv2.imshow('dawawa',img)

#等待键盘按键

cv2.waitKey()

#关闭窗口并退出

cv2.destroyAllWindows()

这样我们就在一个叫做dawawa的窗口下,显示了一张图片。但是我们有一点要注意,就是我们窗口名称一定要是英文,千万不要写中文,否则可能报错。

最后的结果如图所示:


如果大家对代码不是很熟悉的话,你们就直接拿过去用,把地址和窗口名一改就好了。(2)在我们讲完读入图片之后,接下来我们要讲解的是如何保存图片。

首先,创造一张图片,为了方便,我们就用按照上面的代码,导入的图片img

其次,我们讲内存中的图片,保存到硬盘中,使用imwrite()类。

最后,我们设定一个参数,按键盘任意键,可以关闭图像。
代码如下所示:

#导入cv与numpy库

import cv2

import numpy

#读入图片opencv1-1.png到变量img中

img=cv2.imread('D:/小木/opencv1-1.png')

#把img变量保存为图片dawawa.png

cv2.imwrite('D:/小木/dawawa.png',img)

#等待键盘按键

cv2.waitKey()

#关闭窗口并退出

cv2.destroyAllWindows()

我们的结果如图所示:

 

3)这样,我们的图像就保存完毕了,我们再(1)、(2)上面拓展一下,如何能够打开一个图片,再把它转换为黑白图片,并在屏幕中显示,之后再保存起来呢?很简单,我们仅仅把imread类稍微改动一下就好啦。

#导入cv与numpy库

import cv2

import numpy

#读入图片opencv1-1.png到变量img中

###########修改之处##########################

img=cv2.imread('D:/小木/opencv1-1.png',cv2.IMREAD_GRAYSCALE)

###########修改之处##########################

#在屏幕上显示图片,图片窗口名称为dawawa,展示的图片为img

cv2.imshow('dawawa',img)

#把img变量保存为图片dawawa.png

cv2.imwrite('D:/小木/dawawa1.png',img)

#等待键盘按键

cv2.waitKey()

#关闭窗口并退出

cv2.destroyAllWindows()

结果如图所示:

 

(4)图片的输入输出基础我已经讲完了,下面我要讲解的是如何进行视频的导入导出。首先我先讲解一下如何导入视频,并在屏幕中读取:

首先,我们导入两个库,一个是cv库,另外一个是numpy库。

其次,导入视频,应用VideoCapture类。

接着,我们获取视频每秒钟的帧数。

接下来VideoCapture类中的read()方法,读取一帧数据,我们用cv库自带的方法:cv2.CAP_PROP_FPS

接着,我们搞一个循环,首先在屏幕显示一下这帧图片,等待一段时间,一般是等待一帧的时间,计算方法是用1000/每秒帧数。然后接着读取下一帧数据。然后显示这帧,等待一帧的时间,然后读取下一帧。。。

最后,当所有的帧数都读取完毕了,我们设定一个参数,按键盘任意键,可以关闭图像。

代码如下所示:

#导入cv与numpy库

import cv2

import numpy

 

#导入视频testvideo.mp4

cameraCapture=cv2.VideoCapture('D:/小木/testvideo.mp4')

#获取视频的帧数

fps=cameraCapture.get(cv2.CAP_PROP_FPS)

#读取视频的第一帧

success,frame=cameraCapture.read()

#按照顺序,循环读取视频中的每一帧,并显示到屏幕上

while success:

    cv2.imshow('video',frame) #显示到屏幕上

    cv2.waitKey(int(1000/fps))

    success,frame=cameraCapture.read() #读取视频的第一帧

#等待键盘按键

cv2.waitKey()

#关闭窗口并退出

cv2.destroyAllWindows()

结果如图所示:

 

这样,我们的视频读取,并且播放就做完了。

(5)假如我们用OPENCV创造了一个视频,我们想把它保存到硬盘上,怎么做呢,其实很简单:

首先,我们制作视频,为了方便,我们就用(4)中读取的视频当作我们制作的视频。

然后,给视频确定一个帧数和尺寸(为了方便,就用视频自带的帧数和尺寸代替自己设定了)并且我们建立一个视频输出流,用cv库中的VideoWriter类。

其次,我们读这个视频的每一帧。

接下来,我们把每一帧写入到输出流当中进行保存。并循环读取每一帧,并写入输出流,直到所有帧都保存为止。

代码如下所示:

#导入cv与numpy库

import cv2

import numpy

 

#导入视频testvideo.mp4

cameraCapture=cv2.VideoCapture('D:/小木/testvideo.mp4')

#获取视频的帧数

fps=cameraCapture.get(cv2.CAP_PROP_FPS)

#获取视频的尺寸

size=(int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

#打开写入流

videowriter=cv2.VideoWriter('D:/小木/save1.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)

#读取视频的第一帧

success,frame=cameraCapture.read()

#按照顺序,循环读取视频中的每一帧,并输出到写入流中

while success:

    videowriter.write(frame) #写入到硬盘

    success,frame=cameraCapture.read() #读取视频的第一帧

#等待键盘按键

cv2.waitKey()

#关闭写入流

videowriter.release()

#关闭窗口并退出

cv2.destroyAllWindows()

结果如图所示:

 

这样我们的视频读入写入就讲完了。我们这(5)讲完成之后,我们对OPENCV多少有了一点点的了解了。然而计算机视觉是视觉,摄像头实验应该是最重要的了,所以我们必须要使用摄像头,但是怎么使用呢,很简单,就改改我们的(4~5)代码就好啦。

(6)读取摄像头实验:

我们用VideoCapture(0)读取摄像头,在括号里,我们写上索引号就行,比如你有2个摄像头,第一个摄像头索引就是0,第二个就是1

其它的都和上面一样,如果我们打开一个摄像头,并且在屏幕上显示摄像头的内容,然后把摄像头录制的东西保存,如果想关闭摄像头,按键盘任意按键即可。

代码这样写就行:

#导入cv与numpy库

import cv2

import numpy

 

#导入摄像头

cameraCapture=cv2.VideoCapture(0)

#设定摄像头的帧数

fps=30

#设定摄像头的尺寸

size=(int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))

#打开写入流

videowriter=cv2.VideoWriter('D:/小木/save1.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)

#读取视频的第一帧

success,frame=cameraCapture.read()

#按照顺序,循环读取视频中的每一帧,并显示到屏幕上、输出到写入流中

while success and cv2.waitKey(1)== -1: #一直读取,并且按任意键结束

    cv2.imshow('video',frame) #显示到屏幕上

    cv2.waitKey(int(1000/fps))

    videowriter.write(frame) #写入到硬盘

    success,frame=cameraCapture.read() #读取视频的第一帧

#等待键盘按键

cv2.waitKey()

#关闭写入流

videowriter.release()

#关闭摄像头

cameraCapture.release()

#关闭窗口并退出

cv2.destroyAllWindows()

结果:

 


以上内容主要有:图片的读取,保存。视频的读取、保存。以及如何调用摄像头。然而不仅仅小木我喜欢编写这样的代码,好多人都编写了。美国一个天才编写了一个Cameo的类库,这里面包含我们所有的东西,而且还有不少新的功能,非常强大,我们只需要调用就可以。这个代码我们下节课讲解。

————————————————

如果对我的课程感兴趣的话,欢迎关注小木希望学园-微信公众号: 

mutianwei521

也可以扫描二维码哦!


猜你喜欢

转载自blog.csdn.net/u013631121/article/details/80392794