免费咨询合同模板,咸阳seo培训,如何做二维码链接网站,wordpress主题大小点击蓝字?关注【测试先锋】#xff0c;不再迷路#xff01;一起成为互联网测试精英#xff0c;前瞻测试技术#xff5e;导语全参考清晰度测算的时候#xff0c;输入两个视频帧序列#xff0c;但是视频帧序列没有对齐#xff0c;怎么知道丢了哪帧#xff1f;又怎么知道… 点击蓝字?关注【测试先锋】不再迷路一起成为互联网测试精英前瞻测试技术导语全参考清晰度测算的时候输入两个视频帧序列但是视频帧序列没有对齐怎么知道丢了哪帧又怎么知道补回哪一帧今天介绍一种直播视频帧的对齐方案如果您有更好的方法欢迎在公众号下方留言联系作者探讨交流(文章留言近期开放)再次感谢您的关注和阅读。1/ 问题背景全参考测算视频质量广泛存在在视频业务场景。开始算法计算时是需要仔细的对齐这一系列的帧再能做计算的因为全参考的计算原理是根据两张相同场景的图片数据做比较测算。仔细想想“帧对齐”其实这是一个挺麻烦的事儿为什么这么说因为第一、帧非常多(手机端直播业务一般在 18-25fpspc 直播业务一般 60fps)想让人工挑出到底哪帧丢了这是非常不现实的。第二、由于人眼的一个重要特性——视觉惰性表现在人眼会存在一个视觉暂留肉眼基本看不出来连续两帧的区别。人眼可以保留 0.1-0.4秒的影像。所以每一个视频都是一个非常快的“走马灯”人们是很难通过图像特征来区别每一帧。所以“帧对齐”这个问题拆解为两个问题如何识别每一个帧找到未对齐的帧 这两个问题。根据上述分析我们可以拿到具体的折损测试方案 输入源为两个视频分别是“原视频”和“待比较视频”(折损视频)首先将两个视频进行拆帧处理将视频处理为一系列的图片帧文件然后进行帧对齐处理(将帧的分辨率处理成一致的分辨率将丢帧补齐将卡帧删掉并记录帧号)输出两列对齐后的视频帧序列再合成对齐帧后的视频序列再进行VMAFPSNR等全参考得分的分数计算。了解了上述的测试方案我们来看下每一个部分都是怎么解决的。2/ 如何识别每一帧 识别帧的两个思路物理识别与代码识别。物理识别是指放大每一帧之间的区别或者专门打上帧的标签来识别不同的图片。代码识别目前笔者没有找到比较有效的方法来区别两帧因为在截取为 jpg 时这个信息已经丢失了。所以这里还是倾向于“物理识别”方案。这里根据两位测试前辈(在这特别感谢 erielaustin)曾经尝试过的经验有两种方法方法一给每一帧标记物理序号至某一个固定位置方法二给每一帧上方标记一个黑白条形码至某一个固定位置再来读黑白条形码然后再通过代码/工具识别这个更容易识别的物理特征。总之上述两种方法都是为了放大帧和帧之间的区别。因为篇幅关系现在我介绍一下方法一的方案具体怎么做也给出一些代码/命令感兴趣的小伙伴可以动手试一试方案 1先画后切- step1使用ffmpeg - drawtext 命令给整个视频画帧号ffmpeg -i input.mp4 -vf drawtextfontcolorblack:box1:boxcolorwhite:fontsize40:fontfilemsyh.ttf:line_spacing7:text%{n}:x0:y0 -vframes 600 -y -qscale 0 out.mp4 这样你就得到了一个画好了帧号的视频然后再执行切帧操作这里关键参数是text{n}这个写法是表示标注的是帧号。更多写法可以参考 ffmpeg 说明书。 - step 2切帧命令 ffmpeg image2 或 opencv 切帧ffmpeg image2 命令ffmpeg -i out-1.flv -r 1 -q:v -f image2 ./result/image-%3d.jpeg不知道为什么使用 ffmpeg 我总觉得切出来的损耗很高(可能是使用的无损参数有点问题)所以我用 opencv 实现了一把这种方案看起来损耗至少看起来没那么大(opencv实现代码如下) def cutFrame(srcFilePath,dstFolderPath): srcFileName srcFilePath.split(/)[-1].split(.)[0] print(srcFileName) dstFolderPath dstFolderPath srcFileName / times0 #提取视频的频率每帧提取一个 frameFrequency1 if not os.path.exists(dstFolderPath): #如果文件目录不存在则创建目录 os.makedirs(dstFolderPath) camera cv2.VideoCapture(srcFilePath) count 0 while True: times1 res, image camera.read() if not res: print(error ! not res , not image) break countMax 400 if times%frameFrequency0 and count countMax: count1 print(count) cv2.imwrite(dstFolderPath srcFileName - str(times-1).jpg, image) print(dstFolderPath srcFileName - str(times).jpg) print(图片提取结束) camera.release()经过上面两步你将得到 - 一个标记了帧号的视频文件- 每一帧都有帧号的图片文件集但在后面的识别图片帧号会遇到一个新的坑你不知道需要具体需要预测的图片的坐标是多少(因为你在输入预测图片时需要知道图片的具体 xy而不是整张图片输入)也就是说 个位数帧和十位数帧和百位数帧具体的 xy 都是不一样的分别是(14,22);(28,22);(42,22) 因为你在预测的时候不知道具体帧号所以这个预测位置你不好判断是多长。如果你一刀切使用最长的(4222)个位数帧的空余位置因为你的模型/ocr 工具 没有学习过所以会预测出奇怪的字符串。为了解决这个裁切数字准确的问题我们有了第二个方案更好的方案 2先切后画- step 1切帧命令 ffmpeg image2 或 opencv 切帧同上文方案 1- step 2切好的帧画上帧号具体命令和方案 1 不一样(text 参数)ffmpeg -i test.jpg -vf drawtextfontcolorblack:box1:boxcolorwhite:fontsize40:fontfilemsyh.ttf:line_spacing7:text00001:x0:y0 -vframes 600 -y -qscale 0 output.jpg这里的 text 参数 text 00001可以通过读step1 的名字拿到(切视频的时候的视频帧是命名是可以控制的比如 frame-01.jpg你可以拿到01然后再通过格式化%03d 的方式对齐帧号为“00001”再填到命令中去这样所有的帧号就都是 4 位数甚至更多从而做到了对齐。)经过上面两步你将得到- 一个标注了帧号的且对齐了位数的图片集看到这样的图片标注集合别提多舒服了~可是下一个问题来了如果使用方案 2那“带标记的视频源”如何拿到呢这是折损的初始输入部分。这个问题简单你可以通过 opencv 来合成无声视频片段这个也是几乎视觉无损的def frameToAvi(srcFolderPath,dstFolderPath): for root, dir, files in os.walk(srcFolderPath): count 0 for f in files: #print(f) if not f.endwith(jpg): continue else: count 1 fourcc cv2.VideoWriter_fourcc(*XVID) videoWriter cv2.VideoWriter(dstFolderPath/srcFolderPath.split(/)[-1].avi, fourcc, 18, (1088,1920)) ## 一定要对上 宽高不然写不进去 3506463247-106.avi for i in range(0,count): img12 cv2.imread(root / 1- str(i) .jpg) print(root / 1- str(i) .jpg is reading) cv2.imshow(img,img12) cv2.waitKey(1) videoWriter.write(img12) print(root / 1- str(i) .jpg is succeed) videoWriter.release() print(over)上面的代码拼图片链接使用 os.path.join() 会更好另外值得一提的是videoWriter cv2.VideoWriter(dstFolderPath/srcFolderPath.split(/)[-1].avi, fourcc, 18, (1088,1920)) ## 一定要对上 fps 宽高不然写不进去 3506463247-106.avicv2.videoWriter 方法要写生成视频的宽高这里的宽高数据要从你切的图里面获得(opencv可以得到你也可以打开右键图片简介读取)批量视频就写死各种不同的视频就读一张图。fps 根据你的需求来调整一切参数尽量模拟原未标号的视频。到这里方案 2 就全部结束了。3/使用 OCR 识别模型/调用 OCR 工具识别帧号未对齐的帧 经过part2 的一系列骚操作你下一步需要做的就是使用 ocr 工具来识别帧号工具如何制作和使用已经在我的前期公众号推送中说明了《“自己动手丰衣足食”——训练一个属于自己的OCR文字识别库(mac环境)》我把我遇到的坑和解决方案都记录下来了当然如果你嫌麻烦你也可以使用在线的ocr 转换服务。4/ 丢帧的 2 种处理方法测试过程中发现不同流的丢帧处理方法不太一样一共有 2 种类型一种是传输过程中直接丢弃另一种是延续上一帧也就是说 - 传输过程中直接丢弃的方案收集到的帧号是 01235 ... 丢了第 4 帧。- 传输过程中延续上一帧的方案收集到的帧号是012335... 丢掉的第 4 帧用上一帧来弥补。值得一提的是丢帧率和网络情况也是强相关的如果对丢帧率的专项测试需要将自己的网络情况仔细整理并划分类别(或者专业的网络损失实验室)来做这项专项测试。对帧率等指标感兴趣的朋友可以参考我的这篇往期文章《码率、分辨率、帧率那点事儿》对于全参考系算法的一些坑我们下篇再讲2020 年十一双节欢庆预祝各位读者朋友节日快乐月圆人团圆~?注以上图片部分来自互联网如有侵权请后台联系公众号会第一时间删除谢谢