1、基本I/O脚本
1.1 读/写图像文件
import numpy
import cv2#利用二维Numpy数组简单创建一个黑色的正方形图像
img = numpy.zeros((3,3),dtype=numpy.uint8)
img
#结果为:
'''
array([[0, 0, 0],[0, 0, 0],[0, 0, 0]], dtype=uint8)
'''
img.shape#结果为:(3, 3)####################################################################利用cv2.cvtColor函数将该图像转化为BGR格式
img1 = cv2.cvtColor(img,cv2.COLOR_GRAY2BGR)
img1
#结果为:
'''
array([[[0, 0, 0],[0, 0, 0],[0, 0, 0]],[[0, 0, 0],[0, 0, 0],[0, 0, 0]],[[0, 0, 0],[0, 0, 0],[0, 0, 0]]], dtype=uint8)
'''
img1.shape#结果为:(3, 3, 3)
①将图像从PNG格式转换为JPG格式:
②将BGR图片转化为灰度图片:
import cv2image = cv2.imread("result.png")
cv2.imwrite("show.jpg",image)grayImage = cv2.imread('result.png',cv2.IMREAD_GRAYSCALE)
cv2.imwrite('gray.png',grayImage)
运行前:
运行后:
1.2 图像与原始字节之间的转换
将含有随机字节的bytearray转换为灰度图像和BGR图像:
import cv2
import numpy
import osrandomByteArray = bytearray(os.urandom(120000))
flatNumpyArray = numpy.array(randomByteArray)grayImage = flatNumpyArray.reshape(300,400)#(y,x)
cv2.imwrite('RandomGray.png',grayImage)bgrImage = flatNumpyArray.reshape(100,400,3)#(y,x,颜色通道数目)
cv2.imwrite('RandomColor.png',bgrImage)
运行前:
运行后:
1.3 使用numpy.array访问图像数据
将BGR图像在(10,10)处的像素转换为红像素
import cv2
import numpy as npimg = cv2.imread("result.png")
img[10,10] = [0,0,255]#[B,G,R]
cv2.imshow('yy',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果为:
将坐标(150,120的当前蓝色值(127)变为255:
import cv2
import numpy as np
img = cv2.imread("result.png")
print(img.item(50,20,0))
#pixel
img.itemset((150,20,0),255)
print(img.item(50,20,0))
cv2.imshow('yy',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
结果为:
操作通道:将指定通道(B,G,R)的值置为零,下列代码将图像所有的R通道设置为0(黑色),为了是效果更加明显,这里将图片选择纯红色的彩色照片。
import cv2
import numpy as np
img = cv2.imread("red.jpg")
img[:,:,2] = 0
cv2.imshow('yy',img)
cv2.waitKey(0)
cv2.destroyAllWindows()
原始照片:
运行结果:
将该区域与变量绑定,然后设定第二个区域,并将第二个区域的值分配给第二个区域(将图像的一部分拷贝到改该图像的另一个位置)
原始图片:
运行结果:
获得图像属性:
shape::Numpy返回包含宽度、高度和通道数(如果图像是彩色的)的数组,这在调试图像类型时很有用:如果图像是单色或灰度的,将不包含通道值。
size:该属性是指图像像素的大小。
datatype:该属性会得到图像的数据类型(通常为一个无符号整数类型的变量和该类
型占的位数,比如uint8类型)。
import cv2
import numpy as np
img = cv2.imread("result.png")
print(img.shape)#结果为:(250, 250, 3)
print(img.size)#结果为:187500
print(img.dtype)#结果为:uint8
1.4 视频文件的读/写
Opencv提供了 Video Capture类和 Videowriter类来支持各种格式的视频文件。支持的格式类型会因系统的不同而变化,但应该都支持AWI格式。在到达视频文件末尾之前,Video Capture类可通过 reado函数来获取新的帧,每帧是一幅基于BGR格式的图像。
可将一幅图像传递给 Video Writer类的 write(0函数,该函数会将这幅图像加到Videowriter类所指向的文件中。
读取AVI文件(hahaha.avi)的帧,并采用YUV颜色编码将其写人另一个帧(xixixi.flv)中:
import cv2
videoCapture = cv2.VideoCapture("hahaha.avi")
fps = videoCapture.get(cv2.CAP_PROP_FPS)
size = (int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter('xixixi.flv',cv2.VideoWriter_fourcc('F','L','V','1'),fps,size)success,frame = videoCapture.read()
while success:videoWriter.write(frame)success,frame = videoCapture.read()
运行结果:
代码 | 文件扩展名 | 备注 |
---|---|---|
cv2.VideoWriter fouree (T’, ‘4’,‘2’,‘0’) | .avi | 该选项是一一个未压缩的YUV颜色编码,是4:2:0色度子采样。这种编码有很好的兼容性,但会产生较大文件。 |
cv2.VideoWriter_ fouree (‘P’,T’, ‘M’, ‘1’) | .avi | 该选项是MPEG-1编码类型。 |
cv2.VideoWriter_ fourcc (‘X’, ‘V’,T, ‘D’) | .avi | 该选项是MPEG-4编码类型,如果希望得到的视频大小为平均值,推荐使用此选项。 |
cv2.VideoWriter_ fourcc(‘T’,‘H’,‘E’ ,‘O’) | .ogv | 该选项是Ogg Vorbis |
cv2.VideoWriter_ fourcc (‘F’,‘L’, ‘V’, ‘1’) | .flv | 该选项是一个Flash视频 |
1.5 捕获摄像头的帧并保存
捕获摄像头10s的视频信息,并写入一个AVI文件中:
import cv2cameraCapture = 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("siqi.avi",cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)success,frame = cameraCapture.read()
numFramesRemaining = 10*fps-1
while success and numFramesRemaining > 0:videoWriter.write(frame)success,frame = cameraCapture.read()numFramesRemaining -= 1
cameraCapture.release()
运行结果:
1.6 在窗口显示图像
import cv2
import numpy as npimg = cv2.imread("gray.png")
cv2.imshow('siqi_show',img)
cv2.waitKey()
cv2.destroyAllWindows()
运行结果:
1.7 在窗口显示摄像头帧
OpenCV的窗口函数和waitKey()函数相互依赖。OpenCV 的窗口只有在调用waitKey()函数时才会更新,waitKey()函数只有在OpenCV窗口成为活动窗口时,才能捕获输人信息。鼠标回调雨数setMouseCallback()有五个参数。param为可选参数,它是setMouseCallback(函数的第三个参数,默认情况下,该参数是0。
实时显示摄像头帧,按任意键结束:
import cv2clicked = False
def onMouse(event,x,y,flags,param):global clickedif event == cv2.EVENT_LBUTTONUP:clicked = TruecameraCapture = cv2.VideoCapture(0)
cv2.namedWindow('siqi')
cv2.setMouseCallback('siqi',onMouse)print('press any key to stop!')
success,frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:cv2.imshow('siqi',frame)success,frame = cameraCapture.read()cv2.destroyWindow('siqi')
cameraCapture.release()
运行结果:
回调事件参数可以取如下的值,它们分别对应不同的鼠标事件。
回调事件参数 | 事件描述 |
---|---|
cv2.EVENT MOUSEMOVE | 该事件对应鼠标移动 |
cv2. EVENT LBUTTONDOWN | 该事件对应鼠标左键按下 |
cv2. EVENT RBUTTONDOWN | 该事件对应鼠标右键按下 |
cv2.EVENT MBUTTONDOWN | 该事件对应鼠标中间键按下 |
cv2.EVENT LBUTTONUP | 该事件对应鼠标左键松开 |
cv2.EVENT_ RBUTTONUP | 该事件对应鼠标右键松开 |
cv2.EVENT MBUTTONUP | 该事件对应鼠标中间键松开 |
cv2.EVENT LBUTTONDBLCLK | 该事件对应双击鼠标左键 |
cv2.EVENT RBUTTONDBLCLK | 该事件对应双击鼠标右键 |
cv2.EVENT MBUTTONDBLCLK | 该事件对应双击鼠标中间键 |
鼠标回调的标志参数可能是以下事件的按位组合:
鼠标回调的标志参数 | 对应事件描述 |
---|---|
cv2.EVENT FLAG LBUTTON | 该事件对应按下鼠标左键 |
cv2.EVENT FLAG RBUTTON | 该事件对应按下鼠标右键 |
cv2.EVENT FLAG MBUTTON | 该事件对应按下鼠标中间键 |
cv2.EVENT FLAG CTRLKEY | 该事件对应按下Ctrl键 |
cv2.EVENT FLAG SHIFTKEY | 该事件对应按下Shift 键 |
cv2.EVENT FLAG ALTKEY | 该事件对应按下Alt键 |
OpenCV不提供任何处理窗口事件的方法。例如:当单击窗口的关闭按钮时,并不能关闭应用程序。