OpenCV主要是用来进行图像处理、视觉识别的开源函数库。它的一个目标是提供友好的机器视觉接口函数,从而使得复杂的机器视觉产品可以加速面世。该库包含了横跨工业产品检测、医学图像处理、安防、用户界面、摄像头标定、三维成像、机器视觉等领域的超过500个接口函数。
Opncv的头文件:
import cv2
图片的读取,用imread函数读取。
img=cv2.imread('monkey.jpg',0)#0的意思就是读取原图片的灰度图,如果改成1表示读取原图片的彩图
图片的显示
cv2.imshow('image',img)#该语句是显示刚刚读入的img图片
cv2.waitKey(0)
cv2.destroyAllWindows()
然后所想要读取的图片就出来了,然后敲任意键就退出了……可能有人要问了,这是为什么呢,还有cv2.waitKey(0)和cv2.destroyAllWindows()又是啥意思呢……别急继续。
waitKey()函数
1、waitKey()–这个函数是在一个给定的时间内(单位ms)等待用户按键触发;如果用户没有按下 键,则接续等待(循环)
如果设置waitKey(0),则表示程序会无限制的等待用户的按键事件。也就是说直到你敲一下键盘才会执行下一句语句。所以说这个语句就是为了让你看到你读取的照片。
2、如果设置waitKey(1),则表示程序会在此语句停留1ms在执行下一句语句。例如上面的那一段代码,若改成waitKey(1),在表示在cv2.waitKey(0)停留1ms才会执行cv2.destroyAllWindows(),你试试啥效果。
3、destroyAllWindows()函数就是释放掉你的图片。
4、那么你可能要问了,随意按一个键岂不是显得很随意,我就要给他确定某一个键来退出呢?加个if语句就可以了。
cv2.imshow('image',img)
key=cv2.waitKey(0)
if key==27:#27表示的是Esc键
cv2.destroyAllWindows()
处理视频
基本上和图片的处理一样
首先将内置摄像头传到cap中,可以认为cap表示的是摄像头
cap=cv2.VideoCapture(0)
读取摄像头拍到的东西
ret,picture=cap.read()#需要两个返回值,第二个返回值表示的是摄像头捕捉到的画面
cv2.imshow('picture',picture)
cv2.waitKey(0)
cap.release()#释放画面
cv2.destroyAllWindows()
然后的你的电脑上就会出现了一张帅(美)照。
这样的话只能拍到瞬时的画面,那么要是想拍到实时的动态图呢?当然是加循环。将上面的语句改为
cap=cv2.VideoCapture(0)
while True:
ret,picture=cap.read()#需要两个返回值,第二个返回值表示的是摄像头捕捉到的画面
cv2.imshow('picture',picture)
if cv2.waitKey(1)==ord('q'):#如果按q键,在执行下一句
break
cap.release()#释放画面
cv2.destroyAllWindows()
就可以看到实时画面了。
读取视频文件
cap=cv2.VideoCapture('xxx.avi')#读取视频,xxx为视频的文件名,也可以读取mp4文件。
while True:
ret,movie=cap.read()
gray_frame=cv2.cvtColor(movie,cv2.COLOR_BGR2GRAY)#将图片转化为灰度图
cv2.imshow('movie',movie)#图片格式
if cv2.waitKey(1)==ord('q'):#如果按q键,在执行下一句,此外,waitkey括号中的数字决定了播放视频的速度,如果是1ms的话,播放速度是n倍速
break
cap.release()#释放画面
cv2.destroyAllWindows()
opencv画图
RGB占的比例不同所呈现的颜色不同,每个颜色中三个所占比例不同就会呈现不同颜色。都为0时为黑色,都为满时,为白色。
比如接下来创建一个512×512的黑色背景,那么每个小格子里三种颜色占的比例不同就会造成每个格子的颜色不同,想要呈现黑色,那么RGB应该都为0。即用numpy创建一个512×512的0矩阵。
import numpy as np
img=np.zeros((512,512,3),np.uint8)#创建一个512*512而且都为0的矩阵
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
接下来画一条线条
img=np.zeros((512,512,3),np.uint8)
img=cv2.line(img,(0,0),(511,511),(0,255,0),5)#(0,0)表示开始位置,(511,511)表示结束位置,(0,255,0)表示BGR,这个数字表示的为绿色,5表示线条宽度。
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
同理我们也可以画出矩形
img=np.zeros((512,512,3),np.uint8)
img=cv2.rectangle(img,(50,50),(150,150),(121,121,0),10)
cv2.imshow('image',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
也可以进行填充
img=cv2.rectangle(img,(50,50),(150,150),(121,121,0),-1)#将宽度参数改成-1
圆:cv2.circle()
椭圆:cv2.ellipse()
多边形:cv2.polylines()
画图形主要是为了后面的视觉识别、检测做准备。