有一种计算机的技术,专门用于计算图像之间像素的相对运动。硬件使用复杂的算法来产生高度准确的流向量,这些向量对帧到帧的强度变化具有鲁棒性,并跟踪真实的物体运动。
这个可能用不在Jetson Nano上面,好难过。
难过的
好像是真的
首先需要是CUDA
https://docs.nvidia.com/video-technologies/optical-flow-sdk/read-me/index.html
获得关于我们视频技术的SDK文档
然后官网也可以下载到这个SDK
这个SDK的测试视频是真4K视频:
http://ultravideo.fi/#testsequences
可以选择各种的视频源
可以选择各种的大小
使用这个sony的电影摄影机获得
https://github.com/opencv/opencv_contrib
Opencv里面也集成了这个算法:
说这个东西,不怎么成熟
https://github.com/opencv/opencv_contrib/tree/4.x/modules/cudaoptflow
在这里
https://docs.opencv.org/4.x/dc/d9d/classcv_1_1cuda_1_1NvidiaOpticalFlow__1__0.html
CV文档在此
用枚举处理的
再看追踪
创建的函数在此
参数的说明
其实这个光流的API,我还没有找到API什么的,比较奇怪
https://about.gitlab.com/
这个SDK的源码需要使用Lab获得
写申请后,会自动把你的库关联一下
内容
好难过,就11个star
还有在线的IDE
我喝了杯奶茶。。。差不多才下载下来
里面两套不同版本的SDK
目前来说是下载到了源码,这边还有下载的SDK。
SDK内的东西
Nv是Nvidia的意思,OF是optical-flow的意思。
这是所有的API接口了
一开始就定义了一下要用的变量,我觉得这个习惯真好,大厂写的东西
俺不理解,哪家的写法,这个也要大写,这是调用的状态,还有很多。
这里是对布尔变量的支持,看看人家的真是怎么写的,真帅呢~
支持的缓冲区的格式
这里给你翻译一下
至于这个D3D,是微软的渲染引擎,数字是版本
可惜,没有源码,索然无味。
文章一开始,我就说好像是用不了这个光流追踪:
存在两种主要方法来跟踪视频中的对象。
在每一帧中检测:使用对象分类识别每一帧中感兴趣对象的边界框,并逐帧跟踪对象边界。
检测和跟踪:识别第一帧(或每第n帧)中物体的边界框,并计算后续帧中属于该物体的像素(或块)的运动进行跟踪
第一种方法准确但计算复杂,因为需要在每一帧上运行对象分类(推理)。
第二种方法需要较少的计算,但依赖于连续帧之间像素(或块)的运动/流向量的准确估计。
通常用于对象跟踪的两种类型的光流包括密集光流和稀疏光流。后者很受欢迎,因为它的计算复杂度低,并且在 Kanade-Lucas-Tomashi (KLT) 特征跟踪器等方法中很有用。
密集光流方法提供更高的精度和更大的计算复杂度。因此,对于许多实际用例来说,密集光流计算是遥不可及的。光流的其他领域包括立体深度估计、视频帧插值和视频帧外插。
下面就是一些较老的GPU,嘤嘤嘤,有钱真好。
Maxwell、Pascal 和 Volta 系列的 NVIDIA GPU 包括一个或多个视频编码器 (NVENC) 引擎,这些引擎提供了一种称为仅运动估计模式的模式。
这种模式允许用户仅在 NVENC 上运行运动估计并检索结果运动矢量 (MV)。运动估计硬件搜索相邻区域,并选择最接近的匹配块。最接近匹配的标准被调整以优化编码成本,就是运动补偿后残差消耗的比特。由于这种方法,在许多需要跟踪精度的用例中,运动矢量可能不是很准确。在强度从一帧变化到下一帧的变化的光照条件下尤其如此。
NVENC是一种视频解码器,看看我有没有必要写一下。
就是一次可以64个像素作为一个处理单元运算,如果视频里面的追踪物体一直没有很大的跳动,那效果就很好。我就想着巡线这个问题,是不是会好很多呢?
而使用光流信息训练用于视频后处理的深度学习网络代表了一个常见的用法。由 GPU 的 NVDEC(片上视频解码器)引擎解码的视频帧可以传递到光流引擎,用于在所需的帧对之间生成光流向量图,作为训练的一部分。这些地图为视频后处理网络提供辅助信息。
将 NVDEC 解码的视频帧传递给光流引擎目前需要将使用 NVDECODE API 解码的视频帧复制到视频内存中,以供光流硬件处理。这可以按如下方式完成:
1.创建具有期望的帧的宽度和高度的光流对象NvOFObj
2.创建输入,输出的缓冲区
3.将要解码的帧处理为用于光流的灰度图像
4.cuda处理完的解码帧给给光流引擎,这个光流引擎要CUarray
5.启动异步复制
6.启动光流计算
我搞几天CUDA再来bb:
关于视频插帧:
硬件使用光流向量生成每个交替帧,以将视频的有效帧速率加倍。此技术可提高视频播放的流畅度或提高低端硬件上的游戏/图形渲染速度。
让我们来看看这是如何工作的。首先,图灵硬件计算第 1 帧和第 3 帧(两个连续渲染帧)之间的光流向量。
接下来,使用 API 返回的成本验证流向量的准确性和可靠性。此步骤可确保丢弃低置信度的异常值。
然后使用剩余的高置信度流向量在第 1 帧和第 3 帧之间的时间距离的一半处扭曲第 1 帧。
最后,使用宏块插值填充图像的缺失部分以构建完整的第 2 帧。相同的过程可以以相反的时间顺序应用(计算从第 3 帧到第 1 帧的流向量,然后构建中间帧)以进一步改进插值。额外的后处理可用于构建最终的视频帧 2。
骚年,学会没有?
如果使用Linux运行,需要安装这个库作为接口:
http://freeimage.sourceforge.net/download.html
https://freeimage.sourceforge.io/fip/index.html
开发文档
在SDK里面建立一个build文件夹:
cmake -DCMAKE_BUILD_TYPE=Release ..
make
sudo make install
看来这jetson就是个笑话。。。
倒是看这个说法,可以在maxwell上面运行