快点结束吧。。

给一个2W多faces的面片做布料是非常非常痛苦的。。我希望我走的时候开的nCache没有死机。。

以后有空要多研究下face machine的skin deformer,公司使用得很多,但是无奈这个收费软件不开源。。我也没看到节点使用说明。。

maya自带的curve和surface做为影响物不理想,而face machine自己重写了deformer,解决了这个问题。

2011.5.17

目前的工作是我所喜欢的,因为是把我之前半年研究的东西,进行了实战,也进行了更多的优化。

所以也不会有什么东西可以写出来的。只能留下一些评论罢了。

华强之前做面部都是用TFM。虽然我的插件功能还没有足够健壮的,但是它的立足点以及扩展性比起TFM好得太多了。

做面部次控需要写那么多额外的节点么。非常神经质。

还有什么需要写的么。。大概还是那些吧。。

使用DirectShow中的GraphEdit给视频加入音频

GraphEdit是DirectShow的一个IDE工具,其主要用处就是构建filter graph。

使用SPX来截图(在公司里面发现的一款很好的截图软件)

这是绿色单机纯净版,非常好用。

进入正题。我们现在的目的是用GraphEdit来给一个无声音的AVI视频添加audio。

首先打开GraphEdit,点击Insert Filters。找到DirectShow Filters这项

在这么多项目里,找到File Source(其实把avi文件直接拖进去也是一样,不过也许你的avi压制格式不能被解码就打不开了)

点击那个被挡掉了字母I的 Insert Filter

在弹出的窗口中选好文件。然后用同样的方式加载一个音频wav文件。结果如下:

然后,插入一个avi mux和file writer(file writer会弹出窗口让你选择一个保存路径)

接下来左键点avi那个方框的右边突出的那个点(pin),拖动,把它连到avi mux上的突出点上

连完后,程序自动生成一个avi splitter(如果程序有音频就会又多生成一个音频filter),可以看到avi mux又会生成一个新的突出点,把音频接过去。

然后把avi mux右侧的突出点pin连到 out.avi( file writer 这个filter)的in pin上。

最后结果:

然后我们点一下中间绿色的播放键

这样我们就生成了最后结果!

程序上的实现:

大致和官方文档Building the Recompression Graph差不多

但官方最后一步RenderStream的作用仅仅是把几个filter连起来,并没有run这一步。

想要让整个graph中的datas在filter之间流动起来,就要用到

IMediaControl来run,以及用IMediaEvent来waitForCompletion。

最后记得要IMediaControl来stop。文档上说如果没有stop,文件会有些不正常。

——————————————————————————————————————————————

最后,在混合使用openCV和directShow上。记得把directShow的include和lib引用放在openCV前面,不然应该会有问题。

用openCV来做视频处理

最近做了个研究,就是如何把maya的2个playblast给拼接起来,比如说,我有2个camera生成的playblast视频,我来个横向拼接做成1个视频。

网上搜呀搜,搜到了openCV这个做视频处理的好东东,让我可以使用抽象程度非常高的类来做,完全忽略细节。

openCV的安装可以参考网上。

安装前提是要装CMAKE,用CMake对openCV做个处理。然后安装时先对总项目做个重新生成,然后在对install项目做生成,我之前没有对install做生成,就没有得到头文件。

用openCV来读取AVI的帧很简单

首先是初始化一个CvCapture(cvCaptureFromFile),然后我们就可以用cvGetCaptureProperty来得到视频的一些属性,比如长,宽,总帧数。

然后就用cvRetrieveFrame来取得帧。不过我使用cvGrabFrame先取得一个返回值(因为两个视频的帧数可能不一样)然后用cvQueryFrame来取得一个指向IplImage 结构的指针。

openCV的图片都存储在统一的IplImage里面。

所以我们可以用这个结构里面的数据来生成新的图片。

新的图片数据用:

IplImage* cvCreateImage(CvSize size, int depth, int channels)

来搞定。这里size就是CvSize(640,480)这种,深度我一般用IPL DEPTH 8U,channel就是通道数量,彩图一般3个通道RGB。

数据的复制需要用到

void cvSetImageROI(
IplImage* image,
CvRect rect);

void cvSetImageROI(IplImage* image,CvRect rect);

ROI的用法就很像PS 里面的选框工具,我们给这个新image数据选定一个范围,然后把新数据就复制到这个范围里面。

void cvCopy(const CvArr* src, CvArr* dst, const CvArr* mask=NULL);

src就是我们截图生成的数据,dst就是我们的新图片

数据复制完之后,记得resetROI,否则最后结果会只有ROI部分,其他部分被剪裁掉了。

我们就要生成新的AVI

新AVI需要一个writer来把图片写成avi的帧。

cvCreateVideoWriter,fourcc我用的是DIVX

然后循环的执行:

int cvWriteFrame( CvVideoWriter* writer, const IplImage* image );

这样视频就搞定了。

音频就要另外搞定了,openCV是视觉处理库,不是音频。

目前打算用directshow而不用windows的VFM。directShow有封装的包,应该会写起来方便点。

面部次级

来公司的第二个任务就是给一个猫加面部次级。

为了少刷一些权重,所以并没有采用骨骼作为影响物,而是采用nurbs曲线

我也尝试过用mesh和nurbs surface做影响物,不过他们的影响规则性并没有曲线好。

曲线还是有其劣势,其一就是它完全没有办法加上X轴旋转。。毕竟曲线是cv点来影响。。一条曲线的X轴转来转去米有任何CV点的位移。。

还有一个显著的缺点就是曲线两端cv点移动会影响整体,这个可以通过削弱权重和分段多曲线影响物来减少影响。

还是X轴旋转最让人头疼。。。

想要做次级X轴旋转,必须用曲面或者mesh,而mesh要做影响物,就必须足够大,否则边缘点的影响效果会反向。

足够大的话,骨点的权重就会更麻烦。

比如刷一个眼睛,我至少要刷8个骨点,还有1个面。而曲线的话,我要刷4根线,以及调整4个曲面上的一些权重,4个曲面是linear的,V向就2个点,所以调整起来很快。

虽然看起来2个方式的权重好像差别不会太大,但是最让人头疼的还是mesh没有柔软的感觉。

用骨点的话,必须要配合旋转,不然没法做到nurbs 曲线那种曲线过渡。

但是次级骨点要做旋转,这个工作量需要基本上翻倍。我需要刷一套旋转的权重,这个叠加效果还不一定好。。唉。。

————————————————————————————————————

那么。我在曲线影响物基础上,刷一套大范围mesh影响的旋转次级效果??然后叠起来咯,呵呵

这个可以研究下结合性。

第 5 页,共 31 页« 最新...34567102030...最旧 »