4.通过Opencv采集摄像头视频数据

VideoCapture() 虚拟采集器,一般设备号从0开始

cap.read() 读取视频帧

返回值有两个,第一个为状态值,读到帧为true

第二个值为视频帧

cap.release() 释放资源

示例程序:

import cv2  #引入CV库
#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300)  #设置窗口大小

#获取视频设备
cap = cv2.VideoCapture(0)
while True:
    #从摄像头读视频帧
    ret,frame = cap.read()
    #将视频帧在窗口中显示
    cv2.imshow('video',frame)
    key = cv2.waitKey(1)  #不能为0,0为等待中断,只能读取到一帧的数据
    if(key & 0xFF == ord('q')):
        break

#释放资源
cap.release() #释放视频资源
cv2.destroyAllWindows()  #释放窗口资源

运行结果:

读取视频文件

从视频文件中读取视频帧

cap = cv2.VideoCapture("文件地址")   #从文件获取视频

只处理视频,不处理音频,所以读取到的视频没有声音

播放速度设置

key = cv2.waitKey(40) 

 将视频数据录制成多媒体文件

VideoWriter()  

write()

1秒多少帧,视频的像素(宽和高)

release()   释放资源,将磁盘中的数据输出

VideoWriter()  参数

参数1:为输出文件位置

参数2:多媒体文件格式(VideoWriter_fourcc),fourcc所用编码器,Windows系统采用DIVX编码器

 参数3:帧率

参数4:分辨率大小,应为摄像头实际分辨率

示例程序:

import cv2

#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter("C:\\Users\\Mengyang\\Desktop\\out.mp4",fourcc,25,(640,480))
#

#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300)  #设置窗口大小

#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址")   从文件获取视频

while True:
    #从摄像头读视频帧
    ret,frame = cap.read()
    #将视频帧在窗口中显示
    cv2.imshow('video',frame)
    #写数据到多媒体文件
    vw.write(frame)

    key = cv2.waitKey(1)  #不能为0,0为等待中断,只能读取到一帧的数据
    if(key & 0xFF == ord('q')):
        break

#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows()  #释放窗口资源

代码优化

问题1:显示窗口为什么变大了?

在视频帧在窗口显示时重新设置一下窗口大小。

  

问题2:使用isOpened()判断摄像头是否已打开

问题3:采集数据时要判断数据是否获取到了

优化过的程序:

import cv2

#创建VideoWriter为写多媒体文件
fourcc = cv2.VideoWriter_fourcc(*'DIVX')
vw = cv2.VideoWriter("C:\\Users\\Mengyang\\Desktop\\out.mp4",fourcc,25,(640,480))

#创建窗口
cv2.namedWindow('video',cv2.WINDOW_NORMAL)
cv2.resizeWindow('video',300,300)  #设置窗口大小

#获取视频设备
cap = cv2.VideoCapture(0)
#cap = cv2.VideoCapture("文件地址")   从文件获取视频

while cap.isOpened():    #判断摄像头是否已打开,若打开返回值则为True
    #从摄像头读视频帧
    ret,frame = cap.read()
    if ret ==True : #判断是否读取到数据
        #将视频帧在窗口中显示
        cv2.imshow('video',frame)
        cv2.resizeWindow('video',300,300)  #重新设置窗口大小
        #写数据到多媒体文件
        vw.write(frame)

        key = cv2.waitKey(1)  #不能为0,0为等待中断,只能读取到一帧的数据
        if(key & 0xFF == ord('q')):
            break
    else:
        break
#释放资源
cap.release() #释放VideoCapture
vw.release() #释放VideoWrite
cv2.destroyAllWindows()  #释放窗口资源

  • 1
    点赞
  • 33
    收藏
    觉得还不错? 一键收藏
  • 6
    评论
### 回答1: QML是一种基于C++的用户界面描述语言,用于开发跨平台的图形用户界面(GUI)。它可以与OpenCV(开放源代码的计算机视觉库)结合使用来采集USB视频。 在QML中使用OpenCV,首先需要将OpenCV库添加到项目中,并使用C++与QML进行交互。使用OpenCV的VideoCapture类,可以轻松地采集来自USB相机的视频流。在采集视频时,可以指定设备的编号(例如0、1、2等),以便从多个相机中采集。 通过将QML与OpenCV结合使用,可以实现更好、更实用的用户界面和功能,在图像和视频处理方面得到更高的自由度和灵活性。采集来自USB摄像头视频也是常见的应用场景,例如监视和安防等。 ### 回答2: QML是一种跨平台的快速界面构建语言,而OpenCV是一种开源的计算机视觉库,结合起来可以实现在QML界面上实时显示USB摄像头视频流。 首先需要在C++中通过OpenCV调用USB摄像头,并将视频流获取到QML界面上。可以通过定义QML对象和C++对象之间的调用来实现这一功能。在QML中定义一个VideoPlayer对象,通过C++中定义的VideoCapture类获取USB摄像头视频流,并将其传递给VideoPlayer对象。 代码示例: ``` // C++代码 void VideoCapture::captureVideo() { cv::VideoCapture cap(0); if (!cap.isOpened()) { qDebug() << "Cannot open the USB camera!"; return; } while (run) { cv::Mat frame; cap.read(frame); if (frame.empty()) { break; } QImage img(frame.data, frame.cols, frame.rows, QImage::Format_RGB888); emit captured(img); } } // QML代码 VideoPlayer { id: videoPlayer anchors.fill: parent onCaptured: { videoPlayer.source = image; videoPlayer.show(); } } ``` 在此示例中,VideoCapture类定义了一个captureVideo()方法来从USB相机中获取视频帧,并将其转换为QImage格式,并发射captured()信号。VideoPlayer对象则定义了一个onCaptured()槽函数来接收captured()信号,并将所捕获的帧传递给VideoPlayer对象显示。 总的来说,这种结合QML和OpenCV的方法可以方便地实现在QML界面上显示USB摄像头视频流的目的,使得开发人员可以利用现有的开源库来提供功能,同时使得用户体验更加流畅和自然。 ### 回答3: QML和OpenCV是两个非常强大的工具,可用于处理图像和视频数据。当需要从USB摄像头采集视频时,这两个工具可以很好地协同工作。 QML是一种用于创建用户界面的语言。它提供了一种简单的方式来设计并创建各种应用程序界面。在处理视频数据时,QML可以使用Qt Multimedia组件来访问视频数据流。 而OpenCV是一个广泛使用的计算机视觉库,它具有各种功能,包括图像和视频处理功能。OpenCV提供了许多API来获取,处理和显示图像和视频数据。 要使用QML和OpenCV采集USB视频,需要以下步骤: 1. 首先,使用QML来创建应用程序用户界面。 2. 使用OpenCV中提供的API来连接USB摄像头并开始采集视频数据。 3. 获取流数据并将其传递给QML界面以显示视频。 4. 使用OpenCV的功能来对视频数据进行分析和处理,例如面部识别或运动跟踪。 5. 在QML界面中添加控件以控制摄像头视频流,例如开始/停止录制视频、调整摄像头设置等。 在这个过程中,需要熟悉OpenCV和QML的API和功能,以便最大限度地利用它们的优势。因此,建议有一定的编程经验和计算机视觉知识的人员进行该过程。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值