博客
关于我
计算机视觉(二)
阅读量:493 次
发布时间:2019-03-06

本文共 3075 字,大约阅读时间需要 10 分钟。

1、捕获摄像头的帧

  VideoCapture类可以获得摄像头的帧流。但对摄像头而言,通常不是用视频的文件名来构造VideoCapture类,而是需要传递摄像头的设备索引(device index)。

Demo:

from cv2 import *cameracapture=VideoCapture(0)#设定美妙帧数fps=25size=(int(cameracapture.get(CAP_PROP_FRAME_WIDTH)),int(cameracapture.get(CAP_PROP_FRAME_HEIGHT)))#设置摄像头读取的视频格式videowrite=VideoWriter('My video.avi',VideoWriter_fourcc('I','4','2','0'),fps,size)#摄像头读取的帧success,frame=cameracapture.read()#读取10秒视频NumFramesRemaining=10*fpswhile success and NumFramesRemaining>0:    #显示图像帧    imshow("Video",frame)    waitKey(10)    videowrite.write(frame)    success,frame=cameracapture.read()    NumFramesRemaining-=1#释放cameracapture.release()

        然而,VideoCapture类的get()方法不能反悔摄像头帧速率的准确值,它总是返回0。

  为了针对摄像头创建合适的VideoWriter类,要么对帧速率做出假设,要么使用计时器来测量。摄像头的数量和顺序由系统决定,但OpenCV没有提供任何查询摄像头数量和属性的方法。如果使用无效索引构造了VideoCapture类,就不会得到帧,VideoCapture的read()函数会返回(false, None)。为了不让read()函数从没有正确打开的VideoCapture类中获取数据,可在执行该函数之后使用VideoCapture.isOpened方法做一个判断,该方法返回一个Boolean值。

2、 在窗口显示摄像头帧

  OpenCV的namedWindow()、imshow()和DestoryWindow()函数允许指定窗口名来创建、显示和销毁(destroy)窗口。此外,任何窗口都可以通过waitKey()函数来获取键盘输入,通过setMouseCallback()函数来获取鼠标输入。以下代码可实时显示摄像头帧:

def setMouseCallback(windowName, onMouse, param=None): # real signature unknown; restored from __doc__    """ setMouseCallback(windowName, onMouse [, param]) -> None """    pass

鼠标回调函数setMouseCallback()有5个参数,param是可选参数,它是setMouseCallback()函数的第三个参数,默认情况下,该参数是0.回调时间参数可以取如下的值,它们分别对应不同的鼠标事件。

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键

销毁窗口:

def destroyAllWindows(): # real signature unknown; restored from __doc__    """ destroyAllWindows() -> None """    passdef destroyWindow(winname): # real signature unknown; restored from __doc__    """ destroyWindow(winname) -> None """    pass

waitKey()的参数为等待键盘触发的时间,单位为毫秒,其返回值为-1(表示没有键被按下)或ASCII码。另外,Python提供了一个标准函数ord(),该函数可以将字符转换为ASCII码。(注:在一些系统中,waitKey()的返回值可能比ASCII码的值更大(在Linux系统中,如果OpenCV使用GTK作为后端的GUI库,就会出现bug),在所有系统中,可以通过读取返回值的最后一个字节来保证肢体去ASCII码,代码为:

keycode = cv2.waitkey(1)

if keycode != -1:

  keycode &= 0xff )

Demo:

from cv2 import *clicked=Falsedef onMouse(event,x,y,flags,param):    global clicked    if event==EVENT_LBUTTONUP:        clicked=Truecameracapture=VideoCapture(0)namedWindow("MyWindow")setMouseCallback('MyWindow',onMouse)print 'Showing camera feed.Click window or press any key to stop.'#摄像头读取的帧success,frame=cameracapture.read()while success and waitKey(1)==-1 and not clicked:    #显示图像帧    imshow("MyWindow",frame)    success,frame=cameracapture.read()destroyWindow('MyWindow')#释放cameracapture.release()

参考:

http://www.cnblogs.com/xiaotongtt/p/6601951.html

你可能感兴趣的文章
MySQL 日期时间类型的选择
查看>>
Mysql 时间操作(当天,昨天,7天,30天,半年,全年,季度)
查看>>
MySQL 是如何加锁的?
查看>>
MySQL 是怎样运行的 - InnoDB数据页结构
查看>>
mysql 更新子表_mysql 在update中实现子查询的方式
查看>>
MySQL 有什么优点?
查看>>
mysql 权限整理记录
查看>>
mysql 权限登录问题:ERROR 1045 (28000): Access denied for user ‘root‘@‘localhost‘ (using password: YES)
查看>>
MYSQL 查看最大连接数和修改最大连接数
查看>>
MySQL 查看有哪些表
查看>>
mysql 查看锁_阿里/美团/字节面试官必问的Mysql锁机制,你真的明白吗
查看>>
MySql 查询以逗号分隔的字符串的方法(正则)
查看>>
MySQL 查询优化:提速查询效率的13大秘籍(避免使用SELECT 、分页查询的优化、合理使用连接、子查询的优化)(上)
查看>>
mysql 查询数据库所有表的字段信息
查看>>
【Java基础】什么是面向对象?
查看>>
mysql 查询,正数降序排序,负数升序排序
查看>>
MySQL 树形结构 根据指定节点 获取其下属的所有子节点(包含路径上的枝干节点和叶子节点)...
查看>>
mysql 死锁 Deadlock found when trying to get lock; try restarting transaction
查看>>
mysql 死锁(先delete 后insert)日志分析
查看>>
MySQL 死锁了,怎么办?
查看>>