{A}简介
有一天,我碰到,因为它已经提供了一些静态的裁剪功能。所有我需要做的是动态的,如作为时间的函数定义裁剪区域的位置,。我决定,使其尽可能地灵活,所以人们可以编辑,保存放大器;恢复的动态裁剪设置,并设计为一个可扩展的功能。设计
",工作horsequot的解决方案是一个新IVDDynClippingStorage的接口中ClippingControl.h定义:class VDINTERFACE IVDDynClippingStorage : public vdrefcounted<IVDRefCount> {
public:
// Initialize clipping map
virtual void Init(int sourceW, int sourceH) = 0;
// Get source width
virtual int GetWidth() = 0;
// Get source height
virtual int GetHeight() = 0;
// Load clipping map from a file
virtual VDStringW Load(wchar_t *filename, HWND parent) = 0;
// Save clipping map to a file
virtual VDStringW Dump(wchar_t *filename, HWND parent) = 0;
// Display configuration interface
virtual void Configure(HWND parent) = 0;
// Set clipping bounds for position
virtual int SetClipBounds(sint64 pos, const vdrect32& r) = 0;
// Get clipping bounds for position
virtual int GetClipBounds(sint64 pos, vdrect32& r) = 0;
// Get position for clipping map index
virtual sint64 GetClipPos(int idx) = 0;
// Get clipping map size
virtual int GetTotalClipPos() = 0;
// Get the resulted crop size
virtual void GetCrop(vdrect32& r) = 0;
// Delete clipping map entry by index
virtual void DelClipBounds(int idx) = 0;
// Crop pixmap for given position
virtual bool DoCrop(VDPixmap& dst, sint64 pos, vdrect32& crop_area) = 0;
// Add/drop range to/from clipping map
virtual void ChangeTimeline(sint64 pos, sint64 nframes, bool add) = 0;
};
它定义了一套方法来管理裁剪图,来执行实际的动态种植。 VDDynClippingStorage类中ClippingControl.cpp定义是实现该接口。每FilterInstance(然而,需要有一个以上的动态裁剪过滤器在过滤器链是非常令人怀疑)可以创建类的一个实例。
下图显示了解决方案的组成部分之间的关系:{C}
有种植控制的基本功能,以及一些变化。他们不是严格相关的动态种植,但都非常方便:从现在起,您将不仅能够舒展其两侧和角落,用鼠标左键拖动裁剪区域,但也将完整的裁剪区域,用鼠标右键!试试吧,你会看到动态种植是多么有用时,你必须去帧帧调整裁剪区域安置。一个新的quot;锁定纵横ratioquot;复选框允许裁剪区域的原始视频的宽高比。这是建议经常检查它与启用动态种植。
以下的VirtualDub组件与补丁的影响:裁剪控制(ClippingControl.h / .cpp,FiltDlg.cpp,资源)过滤器类的实例(FilterInstance.h / .cpp)保存(Job.cpp)和装载(Script.cpp处理设置)
下面的项目文件被修改:SRC \ VirtualDub中\ H \ clippingcontrol.hSRC \ VirtualDub中\ H \ filterinstance.hSRC \ VirtualDub中\水库\ RESOURCE.HSRC \ VirtualDub中\水库\ virtualdub.rcSRC \ VirtualDub中\源\ clippingcontrol.cppSRC \ VirtualDub中\源\ filtdlg.cppSRC \ VirtualDub中\源\ filterinstance.cppSRC \ VirtualDub中\源\ job.cppSRC \ VirtualDub中\源\ script.cpp大厦
你应该修补的VirtualDub的源代码树,并重新构建它。
有两种方法修补源代码树。您可以:解压缩到归档的VirtualDub 1.9.9源文件覆盖它的树的根,或使用提供的dyncropping.patch文件包含差异信息与。与Win32版本的补丁的VirtualDub如下源代码树的根,它运行:C:\VirtualDub-1.9.9-src> patch -p1 -i dyncropping.patch
这可能工作以及与版本1.9.9太以外的VirtualDub中。
之后,像往常一样运行的建设进程。运行
加载视频,添加任何视频过滤器,选择quot;裁剪... quot;和检查quot;动态croppingquot;在quot复选框;过滤器输入croppingquot;控制。检查也quot;锁定纵横ratioquot;更好的效果。{S0}
步行种植控制的视频帧框架内,并相应调整裁剪区域的大小和位置,您的需求。所有的位置和大小的变化将被保存在渲染图。如果你倒带的视频的开头和再去帧一帧,你会发现裁剪区域是如何转移到按照你的调整!你可以点击"选项...",然后选择所需的设置。
完成后,单击"OKquot;关闭quot;过滤输入croppingquot,并再次quot; OKquot;关闭quot; Filtersquot;运行quot;预览过滤... quot;和手表什么是对的左边和右边的UI面板的情况。使用"另存为AVI ... quot;保存最终渲染。
处理与旧的视频软件。结论
在一般情况下,此功能可手动quot有用的议案后compensationquot;稳定在下列情况下:没有硬件运动补偿的摄像机的旧视频影片在复杂的运动情况(车,船,运行)孩子或受损的人?"Noisyquot;,黑暗,低对比度的视频自动算法通常失败或产生不好的结果
此外,它可以方便一些特殊的视频效果(数码变焦,伸缩变形等)。
这是很基本的,但它是做什么是应该做的。这里有更多的事情,我想分享的情侣。
目前只有裁剪图的顶点之间的线性插值实施。可以尝试实施基于三次样条插值,看它是否提高了渲染的结果,并减少晃动。此外,可以尝试以实现真正的运动补偿算法里面
IVDDynClippingStorage:DoCrop将缓存和分析帧。
也是一个quot;没有interpolationquot;模式可以使用包含在静态种植需要的场景集影片 - 这可以避免切割/裁剪/胶合件件。
使用线性插值法,你通常两熟调整传递实现最好的结果。
重采样选择有三种设置:原来的帧尺寸,最大裁切尺寸和定制。在任何情况下,其结果将是重采样的圆角的大小与压缩算法的一般兼容性被16整除。企图迫使非整除16或大于源值的自定义尺寸将导致错误。
有两个内置到VirtualDub中的重采样算法 - "bilinearquot;和"nearestquot。 quot; bicubicquot;在VirtualDub中的核心,但没有实现,而不是作为一个插件,因此不支持。
这似乎是有用的,有格线,选择裁剪区域中,当你用鼠标右键(也许它可以出现当您按下并按住鼠标右键,然后左一)幻灯片。它将使裁剪区域的位置更精确。我并没有实现,但作为一个为别人的想法。
IVDDynClippingStorage:ChangeTimeline方法是定义和实施VDDynClippingStorage,但它不被任何使用 - 它可以是一个未来的扩展,以防万一。
所有的裁剪图的顶点索引是基于1的。也就是说,索引接口上看到的是你在地图的。