VC+DirectShow对视频进行图片处理之四
2007-03-15 21:48:55 来源:WEB开发网void CDSControl::DNS(BYTE* pIn,BYTE* pReduce,BYTE* pOut)
{
// pIn 新图的数据区指针,pReduce 背景指针,pOut 存储区指针
if(!pReduce) return; // 没有背景图就不处理
int differentPoint = 0;
for(int i = 0; i < m_bmpBufferLen; i ++){
// m_bmpBufferLen 为数据区长度
pOut[i] = abs(pIn[i] - pReduce[i]); // 相减,取差值的绝对值
if(pOut[i] > 32){
// 相差大于 32 就认为是不同的点,此值因摄像头而异,与噪音有关,请自行试验
differentPoint ++; // 不同点增加
pOut[i] = pIn[i]; // 把不同点赋回它的颜色
}
if(differentPoint > 200){
// 不同点大于 200 就认为有情况,应适当改变
// 调用警报等……
}
}
}
当然了,我可舍不得整天整夜开着电脑守着我睡觉,只是试验这项技术获取了却罢了。
9. 广阔的图像处理天地
因为写程序的需要,也因为浓厚的兴趣,我在此段期间找了不少图像处理的资料,不过正如前面说过的,图像处理需要数学,大多资料都有一大堆公式,看不看得懂就得看您的造诣了。虽然我看不懂那些公式,但我也得到了很多有益的启示,它们是我从更多更新的角度去看待图像,改变了我的思维方式,例如图像是平面的,但可以把其RGB 分量看作是高度,使图形呈现"立体模式",从而可以对它应用立体几何的方法。
看看我理解的线性放缩吧,这也是下面 D3D 应用的铺垫。
如上图,很容易写出此直线段的方程 y = 2 * x (0<= x <= 10)。我不知道您是怎么理解此方程的,我自己认为以前一点也不理解"映射"这个概念,现在从线性放缩中明白到:x 被映射到 y 上,长度被拉长了 2 倍。这和单单知道方程是两回事,我认为这比原来理解要好。利用这个映射就可以把 11 个像素点(下标为 0 ~ 10)的图像放大为 21 个像素点大小,使用下面程序:
for(y = 0; y < 21; y ++){
x = y / 2;
newPicture[y] = oldPicture[x];
}
就这样把图像的宽度扩大后再扩大高度就可完成整个图像的放大,缩小也一样,把直线段的斜率减小就行。直线段代表线性放大,那么抛物线等曲线呢,分段曲线呢?它们都可以实现放缩,因为都是 x 到 y 的映射,曲线代表的是映射规则。呵呵,都怪中学没学好!
在实际放缩时不可能都除得整数,这时就有两种解决方法,一是插值,上面的右图就是线性插值的示意图,二是取整数部分,也就是最近点法,这两种方法的效果和运算量大家都明瞭,自不必我说。
此放缩原理还可以应用于灰度拉伸等方面,对比度增减就是一个例子。
现在摄像头热门的人脸跟踪也是应用图像处理的,其它高级的物体识别、运动分析等都是基于图像处理,其应用前景十分广阔,您足可投身畅游其中,只要您有足够的兴趣和知识。使用图像处理时您是否有这样一个想法:软件让硬件价值倍增!
Tags:VC DirectShow 视频
编辑录入:爽爽 [复制链接] [打 印]更多精彩
赞助商链接