1.1 读/写图像文件
Opencv中的imread函数()和imwrite函数()能支持各种静态图像文件格式。不同的系统支持的文件格式不一样,但都支持BMP格式,通常还支持PNG,JPEG,TIFF格式
读取一种格式的文件,然后将其保存为另一种形式
eg:
import cv2
image = cv2.imread('mypic.png')
cv2.imwrite('mypic.jpg',image)
注:在默认情况下,即使图像文件为灰度格式,imread()函数也会返回BGR格式的图像
BGR图像与RGB图像所标识的色彩空间相同,但字节顺序相反,BGR图像数据模式中,B在高位,RGB 中则相反
1.2图像与原始字节之间的转换
一个OpenCv图像是.array类型的二维或者三维数组。8位的灰度推向是一个含有字节值的二维数组,一个24位的BGR图像是一个三维数组
现在若有 一幅推向的每个通道位8 位,则可将其显式转化为标准的一维python bytearray格式:
byteArray = bytearray(image)
反之,bytearray含有恰当顺序的字节,可以通过显式转换和重构,得到numpy.array形式的图像:
grayImage = numpy.array(grayByteArray).reshape(height,wodth)
bgrImage = numpy.array(bgrByteArray).reshape(height,width,3)
下面介绍一个更i详细的例子,即将含有随机字节的bytearray转换为灰度图像和BGR图像
import cv2
import numpy
import os
randomByteArray = bytearray(os.urandom(120000))
flatNumpyArray = numpy.array(randomByteArray)
grayImage = flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png',grayImage)
bgrImage =flatNumpyArray.reshape(100,400,3)
cv2.imwrite("RandomColor.png",bgrImage)
1.3 使用numpy.array访问图像数据
最基础的例子:将BGR图像在(0,0)处的像素转换为白像素
import cv2
import numpy as np
img = cv.imread('mypic.png')
img[0,0] = [255,255,255]
将坐标(150,120)的当前值(127)变为255:
import cv2
import numpy as np
img = cv2.imread('lala.jpg')
print(img.item(150,120,0))
img.itemset((150,120,0),255)
print(img.item(150,120,0))
通过numpy数组的索引访问原始的像素,会发现很多有趣的事;其中一件就是为设定感兴趣区域(Region Of Interest,ROI)一但设定了该区域,就可以执行很多操作,例如:将该区域与变量绑定,然后设定第二个区域,并将第一个区域的值分配该第二个区域(将图像的一部分拷贝到该图像的另一个位置):
import cv2
import numpy as np
img = cv2.imread('mylala.png')
print(img.shape) #返回宽度和高度以及通道数
print(img.size) # 该属性是指图像像素的大小
print(img.dtype) # 该属性会得到瑞祥的数据类型(通常为一个无符号的白能量和该类型占的位数,比如uint8类型)
my_roi = img[0:50,0:50]
img[50:100,50:100] =my_roi
cv2.imshow('pic',img)
1.4视频文件的读写
import cv2
videoCapture = cv2.VideoCapture("test_video.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("test_output.avi",cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)
success,frame =videoCapture.read()
while success:
videoWriter.write(frame)
success,frame = videoCapture.read()
要注意的是:必须为VideoWriter类的构造函数之哦对那个视频文件名,则会个文件名对应的文件如哦存在,则会被覆盖,也必须指定视频编解码器,编解码器的可用性根据系统不同而不同(这里就多说了)
1.5捕获摄像头的帧
import cv2
cameraCapture = cv2.VideoCapture(1) # 0是这带电脑自带的摄像头,1指USB摄像头
fps = 100
size = (int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
videoWriter = cv2.VideoWriter(
'test2.avi',cv2.VideoWriter_fourcc('I','4','2','0'),
fps,size)
success,frame = cameraCapture.read()
numFramesRemaining = 20*fps-1
while success and numFramesRemaining >0:
videoWriter.write(frame)
success,frame = cameraCapture.read()
numFramesRemaining -=1
cameraCapture.release()
FPS是测量用于保存、显示动态视频的信息数量。通俗来讲就是指每秒变化的画面数。
1.6在窗口显示帧
import cv2
import numpy
img =cv2.imread("lala.png")
cv2.imshow('sister',img)
cv2.waitKey()
cv2.destroyAlloWindows()
1.7在窗口显示摄像头帧:
import cv2
clicked = False
def onMouse(event,x,y,flags,param):
global clicked
if event ==cv2.EVENT_LBUTTONUP:
clicked = True
cameraCapture = cv2.VideoCapture(1)
cv2.namedWindow('mywindows')
cv2.setMouseCallback('mywindows',onMouse)
print('showinf camera feed. Click window or press any key to stop.')
success,frame = cameraCapture.read()
while success and cv2.waitKey(1) == -1 and not clicked:
cv2.imshow('mywindows',frame)
success,frame = cameraCapture.read()
cv2.destroyWindow('mywindows')
cameraCapture.release()
OpenCv的窗口函数和waitKey()函数相互依赖,OpenCv的窗口只有在调用waitKey()函数只有在OpenCv窗口成为活动窗口是,才能捕获输入信息
鼠标会带哦函数setMouseCallback()有5个参数,如前面的实例代码所示,param为可选的参数,他是setMouseCallback()函数的第三个参数,默认情况下,该参数为0回调事件参数可以取如下的值,它们分别对应不同的鼠标事 CV.2_EVENT_RBUTTONDOWN 2 右键点击
CV.2_EVENT_MBUTTONDOWN 3 中键点击
CV,.2_EVENT_LBUTTONUP 4 左键放开
CV.2_EVENT_RBUTTONUP 5 右键放开
CV.2_EVENT_MBUTTONUP 6 中键放开
CV.2_EVENT_LBUTTONDBLCLK 7 左键双击#define CV_EVENT_RBUTTONDBLCLK 8 右键双击
CV.2_EVENT_MBUTTONDBLCLK 9 中键双击
flags:
CV.2_EVENT_FLAG_LBUTTON 1 左键拖曳
CV.2_EVENT_FLAG_RBUTTON 2 右键拖曳
CV.2_EVENT_FLAG_MBUTTON 4 中键拖曳
CV.2_EVENT_FLAG_CTRLKEY 8 (8~15)按Ctrl不放事件
CV.2_EVENT_FLAG_SHIFTKEY 16 (16~31)按Shift不放事件
CV.2_EVENT_FLAG_ALTKEY 32 (32~39)按Alt不放