opencv computer vison

来源:互联网 发布:淘宝宝贝突然下架 编辑:程序博客网 时间:2024/06/04 00:51

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 cv2import numpyimport 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 cv2cameraCapture=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则写入文件,继续读出下一帧,帧数-1while 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 cv2clicked=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)#新开窗边,命名为MyWindowcv2.namedWindow('MyWindow')#操作鼠标事件cv2.setMouseCallback('MyWindow',onMouse)print 'showing camera feed,Click window or press any key to stop'#读取抓取的camerasuccess,frame=cameraCapture.read()#帧数id 及 未clicked 及 未按键while success and cv2.waitKey(1)==-1 and not clicked:    cv2.imshow('MyWindow',frame) #将帧显示在MyWindow上    success,frame=cameraCapture.read() #读取下一帧cameracv2.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

原创粉丝点击