当前位置:   article > 正文

OpenCV学习记录——图片、视频的读取处理_opencv摄像头图像采集并处理图像

opencv摄像头图像采集并处理图像

文章目录


前言

为了更好地利用树莓派进行视觉处理,我从现在开始学习opencv并进行记录分享。

一、学习目的

        学习opencv的目的是为了对摄像头捕获到的图像信息进行处理,例如:人脸识别即是由摄像头捕获到人脸特征信息,再通过特殊的通信手段,将这些信息发送到微处理器进行下一步的处理。那么,本篇文章记录的就是最基本图片、视频的读取和处理操作 。

二、代码分析(读取图片)

首先来看一段最简单的代码

  1. import cv2 #导入opencv视觉库
  2. img = cv2.imread('cat.jpg') #读取图片,并放入“img”里
  3. cv2.imshow('image', img) #创建一个名为‘image’的窗口,显示img这张图片
  4. cv2.waitKey(0) #显示一段时间
  5. cv2.destroyAllWindows() #销毁所有的窗口

        这段代码每一行的作用都已经注释在后面了,我主要记录一下opencv库各个函数的具体用法

(1) cv2.imread('图片地址')

        大部分的opencv函数都是“cv2.”后面接函数名

        例如:要读取一张图片就可以使用  cv2.imread(' 图片地址'),需要特别注意的是图片地址的格式,如果这张图片在python程序的同一个文件夹中,可以直接将图片地址写为图片名称,例如:

cv2.imread('cat.jpg')

        相反的,如果图片不在python程序的同一文件夹中,那么则需要写上完整的图片地址,并在地址前加上转义字符‘r’来避免由“\”带来的错误,例如:

cv2.imread(r'C:\Users\26835\Desktop\picture\cat.jpg')

(2) cv2.imshow('窗口名称', 图片)

        这是一个显示函数,会创建一个窗口,并显示指定的图片

(3) cv2.waitKey(0)

        这条代码可以让图片显示一段指定时间,但并不准确。

        需要注意的是,只有当括号内为非0时才会有效,例如:

cv2.waitKey(100)   #显示大约100ms

(4) cv2.destroyAllWindows() 

        销毁所有的窗口

除了以上最基本的显示操作外,还有一些基本的处理操作如下:

(5) cv2.resize(img, (480, 640))

        这条代码可以修改图片的尺寸大小,其中img为读取的图片,480为图片的宽度参数,640为图片的高度参数,参数都可以根据需要自定义,具体用法如下:

  1. img = cv2.imread('cat.jpg') #读取图片
  2. img = cv2.resize(img, (480, 640)) #修改图片大小

        修改图片大小还有另一种方法,同样采用cv2.resize()函数:cv2.resize(img, (0, 0), fx=3, fy=1)

        可以将原本的参数都改成0,用fx=、fy=来表示宽度高度倍数关系,例如:

  1. img = cv2.imread('cat.jpg')
  2. img = cv2.resize(img, (0, 0), fx=3, fy=1)

        修改图片大小的手段主要用于方便进行图片的数值计算图像融合

(6) cv2.resizeWindow('name', 480, 640)

        这条代码可以用来修改显示窗口的大小

(7) cap = img[0:100, 0:100]

        这条代码不是一个函数,而是一个常用的切片操作,有时我们不需要处理整张照片,而只需要其中的某一块位置进行处理,就可以通过切片的方式取出对应的部分,具体用法如下:

  1. img = cv2.imread('cat.jpg')
  2. cap = img[0:100, 0:100] #取出宽为0-100,高为0-100的部分
  3. cv2.imshow('image', cap) #显示选择的内容
  4. cv2.waitKey(0)
  5. cv2.destroyAllWindows()

二、代码分析(读取视频)

还是先看一下完整码代码

  1. import cv2 #导入opencv视觉库
  2. vc = cv2.VideoCapture('cat.MP4') #获取视频,若需要调用摄像头,则为vc = cv2.VideoCapture(0)
  3. if vc.isOpened(): #检查视频是否能打开
  4. open, frame = vc.read() #如果能打开,则获取视频的两个参数:open、frame
  5. else:
  6. open = False #不能打开则将open设置为False,即表示不能打开
  7. while open: #当open的值为非0时进入以下循环
  8. ret, frame = vc.read() #先获取参数,frame为是视频本身,即视频的数字化表示
  9. if frame is None: #判断,frame是否为空
  10. break #如果为空,则跳出循环,即没有读取到视频
  11. if ret == True: #如果ret为Ture,则表示可以打开视频
  12. gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #调整视频的颜色为灰色
  13. cv2.imshow('video', gray) #显示视频
  14. if cv2.waitKey(10) & 0xff == 27: #显示10ms,或者按下Esc退出窗口
  15. break
  16. vc.release() #释放窗口
  17. cv2.destroyAllWindows() #销毁所有窗口

        代码的大致作用已经注释在后面了,其中需要注意的是vc = cv2.VideoCapture('cat.MP4')中,'cat.MP4'指的是视频地址,如果不是调用视频,而是调用摄像头,则将该参数改为0,此时0代表的是摄像头编号,例如:vc = cv2.VideoCapture(0)

        接下来我们分析一下视频读取和处理的原理:

        视频有两个参数,可以命名为openframe

        其中open代表着该视频是否可以打开,open为0时即不能打开该视频,所以通常在读取视频前通过open参数判断一下,避免由于视频不能打开带来的问题。

        frame代表的是视频本身,视频是由很多张图片构成的,我们可以通过"print(frame)"来看看:

  1. ...
  2. ...
  3. [177 190 198]
  4. [177 190 198]
  5. [175 188 196]]]
  6. [[[205 222 233]
  7. [205 222 233]
  8. [205 222 233]
  9. ...
  10. ...

        这就是打印出来的frame的部分内容

        所以,通常也通过判断frame是否为空来检查视频内容是否有问题

        接下来,我们分析一下处理视频时使用的函数

(1) cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)

        这是颜色空间转换函数,这里将BGR转换成GRAY,即将彩色图像转换为灰度图,这样通常是为了在做图像处理时,减少颜色混乱带来的识别困难问题

(2) cv2.waitKey(10) & 0xff == 27

        这段代码是用来关闭显示窗口,与之前不同的是,它除了可以通过等待10ms来自动关闭,也可以通过按下“Esc”来关闭,‘27’代表的就是“Esc”。也可以设置成其他按键关闭,例如常用的0xff == ‘q’

        需要特别注意的是,使用cv2.waitKey(10)时,会改变视频的运行速度,如果设置为10ms,视频会在10ms内播放完毕,速度极快。同理,设置的时间越长,播放视频的速度越慢,通常也可以用这个办法进行视频的快放和慢放。

声明:本文内容由网友自发贡献,转载请注明出处:【wpsshop博客】
推荐阅读
相关标签
  

闽ICP备14008679号