chart 2:Handing Files,Camera,GUI
1.Basic I/O scripts
文件的读写:
path="image_file='/Users/mac/Downloads/aa.jpg'"
image=cv2.imread(path) #原图读出
#opencv 3将cv2.CV_LOAD_IMAGE_GRAYSCALE包放入到cv2的IMREAD_GRAYSCALE中,下面是灰度读出,灰度存储
image=cv2.imread(path,cv2.IMREAD_GRAYSCALE)
cv2.imwrite("aacopy.jpg",image)
#若BRG读取
image=cv2.imread(path,cv2.IMREAD_COLOR)
图像和字节的转换:
opencv图像是2D和3D的numpy.array类型,8位的灰度图是2D,24位的BRG图像是3D的。image[0,0]第一个表x轴即行,第二个数是表示y轴即列,image[0,0,0]第三个索引表的是颜色通道。image[0,0]表示是最左边的像素点。如果是8位的灰度图在左上角的白色的像素点的颜色是255,如果是BGR图像Blue的颜色是[255,0,0]
*注意:bytearray和bytes不一样的地方在于,bytearray是可变的。
转换成8位字节数组
byteArray = bytearray(image)
grayImage = numpy.array(grayByteArray).reshape(height, width) #灰度图,将转换好的字符串数组grayByteArray转换成array数组,灰度图为2维的,故只经给出高,宽即可
bgrImage=np.array(bytearray).reshape(300.600,3)
#RGB图则为3维的,则除了要给出高度,宽度外还要给出颜色通道
OpenCV中图像的通道可以是1、2、3和4,
1通道的是灰度图。
3通道的是彩色图像,比如RGB图像。
4通道的图像是RGBA,是RGB加上一个A通道,也叫alpha通道,表示透明度。PNG图像是一种典型的4通道图像。
2通道的图像是RGB555和RGB565。2通道图在程序处理中会用到,如傅里叶变换,可能会用到,一个通道为实数,一个通道为虚数,主要是编程方便。
例:#让我们把含有随机字节的ByteArray转换成灰度图像和BGR图像
import cv2
import numpy
import os
#产生一个120,000随机字节的数组
randomByteArray=bytearray(os.urandom(120000))
flatNumpyArray=numpy.array(randomByteArray) #将ByteArray转换成numpy.array
#再转成400*300灰度图的array,因为flatNumpyArray图像有自己的高宽,故用reshape重定义写入图片的高宽
grayImage=flatNumpyArray.reshape(300,400)
cv2.imwrite('RandomGray.png',grayImage)
#再转成400*100 RGB图象,RGB 3D的,故要加上颜色通道参数
bgrImage=flatNumpyArray.reshape(100,400,3)
cv2.imwrite('RandomColor.png',bgrImage)
视频文件的读写:
import cv2
#视频是由一帧帧的图像组成
path="/Users/mac/Documents/beautiful-china.avi'"
videoCapture=cv2.VideoCapture(path)
#get是获取视频的相关属性。例如:视频的帧率,帧数frame,总帧数,尺寸,格式等
fps=videoCapture.get(cv2.CAP_PROP_FPS)
#获取视频一帧的宽,高。宽和高都是整数。
size=(int(videoCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)),
int(videoCapture.get(cv2.CAP_PROP_FRAME_WIDTH)))
#以各种格式写入视频,VideoWriter_fourcc是指写入的格式
videoWriter=cv2.VideoWriter('MyOutputVid.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)
success,frame=videoCapture.read()
while success: #循环直到没有帧则结束
videoWriter.writer(frame) #将读到的帧写入到MyOutputVid.avi中
success,frame=videoCapture.read() #继续读取下一帧
#注:但get方法得到返回值是0
注:谁的帧率小就拖了另一个后腿,视频输出的帧率由小帧率所决定。
cv2.cv.CV_FOURCC(‘I’,’4’,’2’,’0’)=uncompressed YUV 文件比较大
CV_FOURCC(‘P’, ‘I’, ‘M’, ‘1’) = MPEG-1 codec
CV_FOURCC(‘M’, ‘J’, ‘P’, ‘G’) = motion-jpeg codec
CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = Flash video codec
经过试验,选取MPEG-4录像10秒,大小为963kb;选用H263,录像11秒钟,大小为1.25M(仅仅是验证性试验)。
camera 抓取
例:Let’s consider an example that captures 10 seconds of video from a camera and writes it to an AVI
import cv2
cameraCapture=cv2.VideoCapture(0) #抓取视频
fps=30 #视频帧率
#获取视频的宽,高
size=(int(cameraCapture.get(cv2.CAP_PROP_FRAME_WIDTH)),
int(cameraCapture.get(cv2.CAP_PROP_FRAME_HEIGHT)))
#以VideoWriter_fourcc参数内的格式写入到文件中
videoWriter=cv2.VideoWriter_fourcc('MyOutputVid.avi',cv2.VideoWriter_fourcc('I','4','2','0'),fps,size)
#读取视频
sucess,frame=cameraCapture.read()
#视频持续帧数
numFramesRemaining=10*fps-1
#sucess为视频读取到帧的Id,及播放持续的数据>0则写入文件,继续读出下一帧,帧数-1
while sucess and numFramesRemaining>0:
videoWriter.write(frame)
sucess,frame=cameraCapture.read()
numFramesRemaining-=1
注: get() method of a VideoCapture class does not return an accurate value for the camera’s frame rate; it always returns 0
camera frames 在窗口显示camera frames
OpenCV allows named windows to be created, redrawn, and destroyed using the namedWindow(), imshow(), and destroyWindow() functions.and mouse input via the setMouseCallback() function
例:将camera抓取的帧显示在MyWindow中
import cv2
clicked=False
#鼠标键设置,event事件,x,y坐标,param参数
def onMouse(event,x,y,falgs,param):
global clicked
if event==cv2.EVENT_LBUTTONUP: #left button up
clicked=True #已经点击
#抓取视频
cameraCapture=cv2.VideoCapture(0)
#新开窗边,命名为MyWindow
cv2.namedWindow('MyWindow')
#操作鼠标事件
cv2.setMouseCallback('MyWindow',onMouse)
print 'showing camera feed,Click window or press any key to stop'
#读取抓取的camera
success,frame=cameraCapture.read()
#帧数id 及 未clicked 及 未按键
while success and cv2.waitKey(1)==-1 and not clicked:
cv2.imshow('MyWindow',frame) #将帧显示在MyWindow上
success,frame=cameraCapture.read() #读取下一帧camera
cv2.destroyAllWindows('MyWindow') #关闭Window
注:下面是参数详解
waitKey()是毫秒的等待时间,它的参数有下面几种:
-1是指什么键都不按
or an ASCII keycode 例如27是ESC键,ord(‘a’) returns 97
callback’s event argument:
CV_EVENT_MOUSEMOVE: Mouse movement
CV_EVENT_LBUTTONDOWN: Left button down
CV_EVENT_RBUTTONDOWN: Right button down
CV_EVENT_LBUTTONDBLCLK: Left button double-click
mouse callback’s flags argument:
CV_EVENT_FLAG_LBUTTON: The left button pressed
CV_EVENT_FLAG_RBUTTON: The right button pressed