opencv computer vison

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值