vc++数字图像运动检测处理系统 第9页

vc++数字图像运动检测处理系统 第9页
lOffset = this->PixelOffset(i+pt1.y,j+pt1.x,wBytesPerLine);
   int c11 = *(lpData1+lOffset++);
   int c12 = *(lpData1+lOffset++);
   int c13 = *(lpData1+lOffset++);
   //第二幅图
   lOffset = this->PixelOffset(i+pt2.y,j+pt2.x,wBytesPerLine);
   int c21 = *(lpData2+lOffset++);
   int c22 = *(lpData2+lOffset++);
   int c23 = *(lpData2+lOffset++);
   //计算差值
   sum += abs(c11-c21)+abs(c12-c22)+abs(c13-c23);
  }
  GlobalUnlock(hDIB1);
  GlobalUnlock(hDIB2);
 if(sum>width1*height1*3*2)//判断是否相似
  return false;
 else
  return true;}
到现在为止,系统已经完成了背景图片的提取,接下来要做的上分析一系列的图片,把图片与背景对照,找到物体的运动轨迹。这部分分成两个模块:物体定位模块、物体轨迹描述模块。下面先分析物体定位模块。
在进行运动物体定位的时候,同样要进行文件数据读取、图像的中值滤波、图像特征区域的确定等操作,这些过程和上面背景提取的过程是相似的,因此不再做具体介绍,仅给出它们的效果图。被分析的图片如图16所示。
图16 被分析的图
中值滤波起的作用是对图像的平滑操作,去除图像中的随机噪声或者是图像输出过程中后加如的噪声。这些处理达到的处理后的效果跟上面的第2步是一样的,因为是处理的对象是像素,这是肉眼难以分别其中的差别,所以给人的感觉与上面图16是一样,因此在这里就不显示具体处理后的图像效果。但是这一步是图像处理中必不可少的,在此特别强调一下这一步。这一步为一下的操作顺利进行打下基础。
特征区域的匹配效果图17所示(白框中为特征区域)
图17 特征区域的匹配图
(8)特征区域的第二次判定
在进行特征区域确定的时候,如果第一次判定失败,则需要进行第二次判定,因为有可能运动物体刚刚遮盖了被分析图片上的特征区域,如果仅仅进行简单的一次判断,就会出现错误。进行第二次判定的算法为:在背景图片中找到第二个特征区域,而且这个特征区域必须和第个特征区域有一定的空间间隔,然后把找到的特征区域当作滤波模板,在前景图片上找寻相似的区域。寻找过程和第一次判定相似。特征区域的第二次判定的函数OnSecondPipei(参见源程序)。
(9)物体的区域定位
要判断物体的运动轨迹,首先就要从图片中提取出物体,这就是物体的区域定位。物体的区域定位在系统中是很关键的一步。在进行物体的区域定位之前,已经先对前景图片中进行特征区域的确定。具体的算法如下:下把前景图片中的特征区域和背景图片中的特征区域对齐,然后根据两个特征区域中心点在各自图片中的位置,计算得到要进行处理的像素点。接着扫描所有要处理的像素点,把两幅图片像素值相减的绝对值存放到前景中,同时把前景图片中没有被处理的像素点都置成黑色。经过这样的处理,前景图片中所有背景成分都被滤掉(显示为黑色),而运动物体则显示出来了。可以根据需要,适当地放大物体像素点的数值,这样可以看得更加明显。物体提取的函数CompareImg2:


 //下面的函数实现物体提取的操作
BOOL DIB::  CompareImg2(HANDLE hDIBBK,HANDLE hDIBCurrent,CPoint pt1,CPoint pt2)
{
 if(abs(pt1.x-pt2.x)>3 || abs(pt1.y -pt2.y)>3)
 { 
  AfxMessageBox("Imgs Offset are too big");
  return false;
 }
 LPBITMAPINFOHEADER lpbi1,lpbi2;
 lpbi1 = (LPBITMAPINFOHEADER)GlobalLock(hDIBBK);
 int width1 = lpbi1->biWidth;
 int height1 = lpbi1->biHeight;
 lpbi2 = (LPBITMAPINFOHEADER)GlobalLock(hDIBCurrent);
 int width2 = lpbi2->biWidth;
 
int height2 = lpbi2->biHeight;
if(width1 != width2 || height1 != height2)
 {
  GlobalUnlock(hDIBBK);
  GlobalUnlock(hDIBCurrent);
  AfxMessageBox("Img is not same size");
  return false;
 }
 LPBYTE lpData1,lpData2;
 lpData1 = this->FindDIBBits(hDIBBK);
 lpData2 = this->FindDIBBits(hDIBCurrent);
 WORD wBytesPerLine = this->BytePerLine(hDIBBK);
 int xleft,xright,ytop,ybottom;

 if(pt1.x>=pt2.x)
 { 
 
  xleft = pt2.x;
  xright =width1-pt1.x-1;
 }
   
 else
 { 
 
  xleft = pt1.x;
  xright = width1-pt2.x-1;
 }
 
 if(pt1.y >=pt2.y)
 { 
  ytop = pt2.y;
  ybottom = height1-pt1.y-1;

 }

 else
 { 
  
  ytop = pt1.y;
  ybottom = height1-pt2.y-1;
 }
 long sum=0;
 long lOffset;
 for(int i=-ytop;i<=ybottom;i++)
  for(int j=-xleft;j<=xright;j++)
  { 
  
   lOffset = this->PixelOffset(i+pt1.y,j+pt1.x,wBytesPerLine);
   int c11 = *(lpData1+lOffset++);
   int c12 = *(lpData1+lOffset++);
   int c13 = *(lpData1+lOffset++);
   lOffset = this->PixelOffset(i+pt2.y,j+pt2.x,wBytesPerLine);
   int c21 = *(lpData2+lOffset++);
   int c22 = *(lpData2+lOffset++);
   int c23 = *(lpData2+lOffset++);
   lOffset = this->PixelOffset(i+pt2.y,j+pt2.x,wBytesPerLine);
   *(lpData2+lOffset++) = abs(c11-c21);
   *(lpData2+lOffset++) = abs(c12-c22);
   *(lpData2+lOffset++) = abs(c13-c23);
  }
  for(i =0;i<height1;i++)
   for(int j=0;j<width1;j++)
   {
   if(i<pt2.y-ytop || i>pt2.y+ybottom||j<pt2.x-xleft || j >pt2.x+xright)
   {
    lOffset = this->PixelOffset(i,j,wBytesPerLine);
    *(lpData2+lOffset++) = 0;
    *(lpData2+lOffset++) = 0;
    *(lpData2+lOffset++) = 0;

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  ... 下一页  >> 

Copyright © 2007-2012 www.chuibin.com 六维论文网 版权所有