WEB开发网
开发学院软件开发VC VC+DirectShow对视频进行图片处理之四 阅读

VC+DirectShow对视频进行图片处理之四

 2007-03-15 21:48:55 来源:WEB开发网   
核心提示: void CDSControl::DNS(BYTE* pIn,BYTE* pReduce,BYTE* pOut){// pIn 新图的数据区指针,pReduce 背景指针,VC+DirectShow对视频进行图片处理之四(7),pOut 存储区指针if(!pReduce) return;
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 的映射,曲线代表的是映射规则。呵呵,都怪中学没学好!

在实际放缩时不可能都除得整数,这时就有两种解决方法,一是插值,上面的右图就是线性插值的示意图,二是取整数部分,也就是最近点法,这两种方法的效果和运算量大家都明瞭,自不必我说。

此放缩原理还可以应用于灰度拉伸等方面,对比度增减就是一个例子。

现在摄像头热门的人脸跟踪也是应用图像处理的,其它高级的物体识别、运动分析等都是基于图像处理,其应用前景十分广阔,您足可投身畅游其中,只要您有足够的兴趣和知识。使用图像处理时您是否有这样一个想法:软件让硬件价值倍增!

上一页  2 3 4 5 6 7 

Tags:VC DirectShow 视频

编辑录入:爽爽 [复制链接] [打 印]
赞助商链接