不太懂linux下的情况,大概了解windows下的情况,估计是类似的。
调用OpenCV的cv::VideoCapture打开摄像头,内部调用的是Direct Show接口(等效于Linux下的v4l2吧),先查找当前电脑已经连接的摄像头设备,然后以cv::VideoCapture构造函数中传入的整数作为下标,访问对应的摄像头,然后直接选取默认的摄像头输出的分辨率,码率和编码格式等,输出摄像头数据。
其实不少摄像头都能够输出多种分辨率,多种码率和多种编码格式的视频数据,OpenCV为了用户的使用方便把这些 *** 作都简化了。
如果想对摄像头调用进行定制化,可能需要直接调用v4l2进行 *** 作。或者调用FFmpeg进行。
另外,题主提到60fps的是MJPEG格式的视频,为了获取原始的YUV或者BGR的数据,还需要进行解码和颜色空间转换,FFmpeg是能够做到这些的,干脆直接用FFmpeg算了。
使用WebRTC进行互动直播时,我们希望采集的画面可以添加美颜特效,现有两套解决方案:
方案一的思路是替换WebRTC的原生采集,使用GPUImageVideoCamera替换WebRTC中的视频采集,得到经过GPUImage添加美颜处理后的图像,发送给WebRTC的OnFrame方法。
方案二的思路是拿到WebRTC采集的原始视频帧数据,然后传给GPUImage库进行处理,最后把经过处理的视频帧传回WebRTC。
通过查阅WebRTC源码发现,WebRTC原生采集和后续处理的图像格式是NV12(YUV的一种),而GPUImage处理后的Pixel格式为BGRA,因此无论使用方案一还是方案二都需要进行像素格式转换。下面来介绍方案一的实现方法(方案二和方案一并无本质区别,可参考方案一的实现思路)。
在实现该方案前,我们先介绍几个必须掌握的知识:
iOS视频采集支持三种数据格式输出:420v,420f,BGRA。
420f 和 420v 都是YUV格式的。 YUV是一种颜色编码方法,分为三个分量,Y表示亮度(Luma),也称为灰度。U和V表示色度(chroma)描述色彩与饱和度。YUV的存储格式分为两大类:planar和packed。planar(平面)先连续存储所有像素点的Y,然后存储所有像素点的U,随后是所有像素点的V。packed是将每个像素点的Y,U,V交叉存储的。 我们最终需要的,用于WebRTC编解码的像素格式是kCVPixelFormatType_420YpCbCr8BiPlanarFullRange的,即双平面的YUV420,Y和UV分开存储,这对后面我们的格式转换非常重要。
420f和420v的区别在于Color Space。f指Full Range,v指Video Range。
Full Range的Y分量取值范围是[0,255]
Video Range的Y分量取值范围是[16,235]
从采集编码到解码渲染,整个过程中,颜色空间的设置都必须保持一致,如果采集用了Full Range 而播放端用Video Range,那么就有可能看到曝光过度的效果。
BRGA是RGB三个通道加上alpha通道,颜色空间对应的就是它在内存中的顺序。比如kCVPixelFormatType_32BGRA,内存中的顺序是 B G R A B G R A。
大端模式(Big-endian),是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中,这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这和我们的阅读习惯一致。
小端模式(Little-endian),是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中,这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低。
iOS采用的是小端存储。
LibYUV是Google开源的实现各种YUV与RGB之间相互转换、旋转、缩放的库。
上面提到WebRTC使用的图像格式为NV12,而通过GPUImage采集到的图像格式为BGRA,因此,就需要做BGRA→NV12的转换。
iOS中采用的是小端模式, libyuv中的格式都是大端模式。小端为BGRA,那么大端就是ARGB,所以我们使用libyuv::ARGBToNV12。
下面介绍方案一的具体实现:
修改 avfoundationvideocapturermm 中的 - (BOOL)setupCaptureSession 方法,启动GPUImage采集,在回调中拿到BGRA格式的CMSampleBuffer。并修改 - (void)start 和 - (void)stop ,确保采集的启停功能正常。
这里便得到了添加美颜等特效的BGRA源视频帧数据。
先获取BGRA格式的pixelBuffer首地址,并创建转换后NV12格式的内存地址dstBuff,使用libyuv::ARGBToNV12进行转换,最终我们得到了存储NV12数据的内存地址dstBuff。
pixelBufferAttributes 这个参数是optional的,但是却非常重要。它指定创建时是否使用IOSurface框架,有无这个参数最后创建的Pixelbuffer略有不同,经测试,如不写这个参数,在iOS13中将无法创建正常可用的pixelBufferRef。
上面提到,NV12是双平面的YUV420格式,即在dstBuff中Y和UV分开存储,因此我们需要分别逐行拷贝Y和UV。
注意: 在 *** 作CVPixelBuffer之前,一定要记得先进行加锁,防止读写 *** 作同时进行。
以UV拷贝为例:
这里便得到了NV12格式CVPixelBuffer。
最终交付给WebRTC处理的是CMSampleBuffer,因此我们需要做CVPixelBuffer→CMSampleBuffer的转换:
这里就得到了可用于WebRTC的经过GPUImage处理的CMSampleBuffer,然后将CMSampleBuffer传给WebRTC的OnFrame方法即可。
到这里就完成了为WebRTC的视频添加美颜等特效。其中的坑还是要自己踩过才印象深刻。其中要着重注意iOS13的崩溃问题。
import cv2
import requests
import base64
import json
import re
import openpyxl,random
import os
import win32api,win32con
import glob
if ospathlexists('数据库xlsx'):
#osremove('数据库xlsx')
#print('已经存在数据表')
wb=openpyxlload_workbook('数据库xlsx')
ws=wbactive
ws['A1']value='名称'
ws['B1']value='付款金额'
ws['C1']value='转账-交易单号'
else:
wb=openpyxlWorkbook()
ws=wbactive
ws['A1']value='名称'
ws['B1']value='付款金额'
ws['C1']value='转账-交易单号'
#wbsave('/数据库xlsx')
litq=[]
lith=[]
litn=[]
stu_num=[]
stu_num2=[]
jinge=''
dh=''
# 获取图像
def get_file_content(file):
with open(file, 'rb') as f:
return fread()
# 获取access_token
def gettoken():
# client_id 为官网获取的AK, client_secret 为官网获取的SK
host = '>
在这篇文章中,我们将介绍如何使用通过 MultiTracker 类实现的 OpenCV 的多对象跟踪 API。我们将共享C++ 和 Python 代码。
大多数计算机视觉和机器学习的初学者都学习对象检测。如果您是初学者,您可能会想为什么我们需要对象跟踪。我们不能只检测每一帧中的对象吗?
让我们来探究一下跟踪是有用的几个原因。
首先,当在视频帧中检测到多个对象(例如人)时,跟踪有助于跨帧建立对象的身份。
其次,在某些情况下,对象检测可能会失败,但仍可能跟踪对象,因为跟踪考虑了对象在前一帧中的位置和外观。
第三,一些跟踪算法非常快,因为它们做的是局部搜索,而不是全局搜索。因此,我们可以通过每n帧进行目标检测,并在中间帧中跟踪目标,从而为我们的系统获得很高的帧率。
那么,为什么不在第一次检测后无限期地跟踪对象呢?跟踪算法有时可能会丢失它正在跟踪的对象。例如,当对象的运动太大时,跟踪算法可能跟不上。许多现实世界的应用程序同时使用检测和跟踪。
在本教程中,我们只关注跟踪部分。我们想要跟踪的对象将通过拖动它们周围的包围框来指定。
OpenCV 中的 MultiTracker 类提供了多目标跟踪的实现。它是一个简单的实现,因为它独立处理跟踪对象,而不对跟踪对象进行任何优化。
让我们逐步查看代码,了解如何使用 OpenCV 的多目标跟踪 API。
21 第 1 步:创建单一对象跟踪器
多目标跟踪器只是单目标跟踪器的集合。我们首先定义一个函数,该函数接受一个跟踪器类型作为输入,并创建一个跟踪器对象。OpenCV有8种不同的跟踪器类型:BOOSTING, MIL, KCF,TLD, MEDIANFLOW, GOTURN, MOSSE, CSRT。
如果您想使用 GOTURN 跟踪器,请务必阅读这篇文章并下载 caffe 模型。
在下面的代码中,给定跟踪器类的名称,我们返回跟踪器对象。这将在稍后用于多目标跟踪器。
Python
C++
22 第 2 步:读取视频的第一帧
多目标跟踪器需要两个输入
给定这些信息,跟踪器在所有后续帧中跟踪这些指定对象的位置。 在下面的代码中,我们首先使用 VideoCapture 类加载视频并读取第一帧。这将在稍后用于初始化 MultiTracker。
Python
C++
23 第 3 步:在第一帧中定位对象
接下来,我们需要在第一帧中定位我们想要跟踪的对象。该位置只是一个边界框。 OpenCV 提供了一个名为 selectROI 的函数,该函数会d出一个 GUI 来选择边界框(也称为感兴趣区域 (ROI))。 在 C++ 版本中,selectROI 允许您获取多个边界框,但在 Python 版本中,它只返回一个边界框。所以,在 Python 版本中,我们需要一个循环来获取多个边界框。 对于每个对象,我们还选择一种随机颜色来显示边界框。 代码如下所示。
Python
C++
getRandomColors 函数相当简单
24 第 3 步:初始化 MultiTracker
到目前为止,我们已经读取了第一帧并获得了对象周围的边界框。这就是我们初始化多目标跟踪器所需的所有信息。
我们首先创建一个 MultiTracker 对象,并向其中添加与边界框一样多的单个对象跟踪器。在此示例中,我们使用 CSRT 单对象跟踪器,但您可以通过将下面的 trackerType 变量更改为本文开头提到的 8 个跟踪器之一来尝试其他跟踪器类型。 CSRT 跟踪器不是最快的,但在我们尝试的许多情况下它产生了最好的结果。
您还可以使用包裹在同一个 MultiTracker 中的不同跟踪器,但当然,这没什么意义。
MultiTracker 类只是这些单个对象跟踪器的包装器。正如我们从上一篇文章中知道的那样,单个对象跟踪器是使用第一帧初始化的,并且边界框指示我们想要跟踪的对象的位置。 MultiTracker 将此信息传递给它在内部包装的单个对象跟踪器。
Python
C++
25 第 4 步:更新 MultiTracker 并显示结果
最后,我们的 MultiTracker 已准备就绪,我们可以在新帧中跟踪多个对象。我们使用 MultiTracker 类的 update 方法来定位新框架中的对象。每个跟踪对象的每个边界框都使用不同的颜色绘制。
Python
C++
C++
Python
用视频采集卡直播游戏不会占用系统资源造成游戏掉帧,比直接用显卡直播出的视频效果较好。
一、视频采集卡:
视频采集卡(VideoCapturecard)也叫视频卡,用以将模拟摄像机、录像机、LD视盘机、电视机输出的视频信号等输出的视频数据或者视频和音频的混合数据输入电脑,并转换成电脑可辨别的数字数据,存储在电脑中,成为可编辑处理的视频数据文件。按照其用途可以分为广播级视频采集卡,专业级视频采集卡,民用级视频采集卡。
视频采集卡(VideoCapturecard),又称视频捕捉卡,是将模拟摄像机、录像机、LD视盘机、电视机输出的视频信号等输出的视频数据或者视频音频的混合数据输入电脑,并转换成电脑可辨别的数字数据,存储在电脑中,成为可编辑处理的视频数据文件。它是我们进行视频处理必不可少的硬件设备。
二、原理:
1、视频采集卡又称视频捕捉卡,用它可以获取数字化视频信息,并将其存储和播放出来。很多视频采集卡能在捕捉视频信息的同时获得伴音,使音频部分和视频部分在数字化时同步保存、同步播放。
2、视频采集卡,“VideoCaptureCard”,其功能是将视频信号采集到电脑中,以数据文件的形式保存在硬盘上。它是我们进行视频处理必不可少的硬件设备,通过它对数字化的视频信号进行后期编辑处理、比如剪切画面、添加滤镱、字幕和音效、设置转场效果以及加入各种视频特效等等,最后将编辑完成的视频信号转换成标准的VCD、DVD以及网上流媒体等格式,方便传播。
3、视频(Video)是多幅静止图像(图像帧)与连续的音频信息在时间轴上同步运动的混合媒体,多帧图像随时间变化而产生运动感,因此视频也被称为运动图像。按照视频的存储与处理方式不同,可分为模拟视频和数字视频两种
4、视频采集就是将视频源的模拟信号通过处理转变成数字信号(即0和1),并将这些数字信息存储在电脑硬盘上的过程。这种模拟/数字转变是通过视频采集卡上的采集芯片进行的。
三、用途:
在电脑上通过视频采集卡可以接收来自视频输入端的模拟视频信号,对该信号进行采集、量化成数字信号,然后压缩编码成数字视频。大多数视频卡都具备硬件压缩的功能,在采集视频信号时首先在卡上对视频信号进行压缩,然后再通过PCI接口把压缩的视频数据传送到主机上。
一般的PC视频采集卡采用帧内压缩的算法把数字化的视频存储成AVI文件,高档一些的视频采集卡还能直接把采集到的数字视频数据实时压缩成MPEG-1格式的文件。
在高清视频采集录制方面,VGA图像采集卡是数字信息化行业快速发展,很多领域对VGA信号采集的要求提高出现的一种高端产品。不论是在工业行业上机器视觉系统应用,还是在教学上,都应用十分广泛,它综合许多计算机软硬件技术,更涉及到图像处理、人工智能等多个领域。
而视频图像采集卡是机器视觉系统的重要组成部分,其主要功能是对相机所输出的视频数据进行实时的采集,并提供与PC的高速接口。
以上就是关于OpenCV能以MJPEG的格式读取摄像头数据吗全部的内容,包括:OpenCV能以MJPEG的格式读取摄像头数据吗、iOS WebRTC 杂谈之 视频采集添加美颜特效、通过摄像头拍照后识别文字,并将有用的信息存放到excel等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)