最近选修了一门计算机视觉,老师上课就只讲理论,课后自学相关知识,所以写这篇博客用来记录OpenCV的学习并帮助回顾。
OpenCV是每一个计算机视觉从业者都要学的一个库,它是用来处理图像的,是由C++编写的。博主并不会C++,所以这次就先用python入门。
博主并不是计算机专业,所以本文若有些业余的话希望大家多多包涵。
第一步:安装相关库
直接在Anaconda prompt中pip install或者conda install即可
在安装库之前需要下载Anaconda。有关python的基础只是在此不多赘述
pip install opencv-python
此次只是opencv的入门学习,所以使用的是juypter,之后若是有计划做相关项目的话会用pycharm
除了opencv库之外还要下载一个opencv-contrib-python的拓展包。默认版本的opencv对应默认版本的contrib,如果下载的是其他版本的opencv,那么请查询对应拓展包的版本。本文使用最新的版本
也是直接pip install 即可
pip install opencv-contrib-python
本文采用的是默认的base环境,jupter也采用的base环境,如果使用pycharm不一定是默认环境,可能是自定义或者用anaconda创造的默认环境,pip install的包可能找不到,
pip下载的默认路径是:
C:\Users\(自己的用户名)\AppData\Roaming\Python\Python35\site-packages,
把这个路径下下载的包移到对应环境的site-package下就行
juypter运行opencv
首先import一下,print一下这个包看看运行有没有问题,没问题继续
import cv2
print(cv2)
返回
<module 'cv2' from 'D:\\anaconda\\lib\\site-packages\\cv2\\__init__.py'>
看一下运行路径,把测试用的材料都放到路径下,这样我们之后输入路径就不需要输入前缀
import os
print(os.path.abspath('.'))#看运行路径
利用cv2.imread(图形路径)方法读取图形img
import cv2 #opencv读取BGR文件
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline#此行代码就只有juypter可以识别,可以直接返回图片不需要show了
img = cv2.imread('hawk.jpg') #读取文件
img
从返回值可以看出来读取的文件img是ndarray类的一个三维矩阵,每个维度对应着图片的RGB,每个矩阵的元素值对应该栅格(像元,格点,不同专业叫法不一样,其实差不多)的值即颜色的深度,注意,opencv读取文件的格式是BGR类型的
opencv图像处理
用imread(图像路径)方法读取文件,用imshow(title,img对象)方法展示图片
cv2.waitKey()方法用于接受命令,类似c++的暂停,当参数是0时,按任意键执行下行代码,当参数是其他数字,例如100时,为展示100毫秒之后执行下一行代码,没有这行代码图片会一闪而过
cv2.destroyAllWindows()用于关闭窗口
import cv2 #opencv读取BGR文件
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img = cv2.imread('bird.jpg') #读取文件
cv2.imshow('image',img)
cv2.waitKey(0) #0表示按任意键结束,#1000表示等待100毫秒,一般情况下用0
# cv2.waitKey(100)
cv2.destroyAllWindows()
cv2.imread(path,cv2.IMREAD_GRAYSCALE)中cv2.IMREAD_GRAYSCALE指读取灰度图,这时img只有一个波段。
import cv2 #opencv读取BGR文件
import matplotlib.pyplot as plt
import numpy as np
%matplotlib inline
img = cv2.imread('bird.jpg')
print(img.shape)#三维数组,返回(*,*,3)3指为GBR三个波段的图片
img = cv2.imread('bird.jpg',cv2.IMREAD_GRAYSCALE)
cv2.imshow('img',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像保存:cv2.imwrite(path,img)
cv2.imwrite('gray_bird.jpg',img)
cv2.destroyAllWindows()
视频处理
cv2.VideoCapture(path)读取视频vc
vc.isopen()若能打开,返回true,不能返回false
vc.read()读一帧,返回两个值,一个是布尔类型的值,如果这一帧能够打开就是True,反之Flase,第二个返回值是这个帧所对应的图像,就是上文的img,是ndarray类型的
import cv2
#先读取文件的第一帧,看看能否打开
vc = cv2.VideoCapture('video1.mp4')
#vc.read()读取文件的第一帧,看看能否打开
if vc.isOpened():#返回True或Flase,代表能否打开
open, frame = vc.read()
else:
open = False
#写一个循环,如果能打开,就播放读取的那一帧,直到读取到的那一帧没有画面位置
while open:
ret,frame = vc.read()
if frame is None:
break #直到没有帧的时候跳出循环
if ret == True:#如果打开这个帧没毛病
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY) #本身frame是BGR格式的图片,cv2.cvtColor(input_image, flag)现转换成灰度图
cv2.imshow('result',gray)
if cv2.waitKey(20) & 0xFF == 27: #这段代码表示每个帧的持续时间
break
vc.release()
cv2.destroyAllWindows()
OK,今天先学到这里