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

vc++数字图像运动检测处理系统 第11页
图23 去掉离散点后的图
(15)物体中心点的取得
因为要绘制的物体的运动轨迹是一条曲线,所以每张图片上面的物体最终都只能用一个点来表示,这个点就是物体的中心点。在图形学上称为图形的几何中心。确定物体的几何中心比较容易,只需扫描整张图片,寻找颜色是白色点,记录它们的横坐标和纵坐标的位置,并做累加,同时累加白色点个数。最后把累加得到的横坐标的值除以白色点个数后,得到的值就是物体中心点的横坐标数值,纵坐标也是如此。一般来说,这样得到物体的几何中心还是比较准确的,除非物体在运动过程当中发生了非常大地形变。物体中心点的获取的函数OnMinuYdpdCenter(具体参见源程序)。计算中心点的效果如图24所示。
图24 计算中心点的效果图
(16)物体运动轨迹的绘制
绘制物体运动轨迹是系统的最终目标,对此自然不能忽视。在取得物体中心点的过程中,已经把一系列的中心点都保存到了一个专门记录物体运行轨迹的数组里,当处理完所有的图片后,数组里面就记录了完整的物体的运行轨迹。只要扫描整个数组,按照里面的数值把曲线绘制出来即可,在这里面还可以根据图片的大小、运行轨迹的具体情况对绘制的曲线进行适当的缩放,以便观看。
轨迹绘制是在OnPaint中实现的。
//下面的函数实现运动物体轨迹绘制的功能
void Track::OnPaint()
{
 CPaintDC dc(this); // device context for painting
 int i;
 CPen Pen;
 //创建画笔
 Pen.CreatePen(PS_SOLID, 1, RGB(255, 255, 0));
 //选中画笔
 dc.SelectObject(&Pen);
 CWnd *Chart;
 CRect m_ChartRect;
 //得到窗口指针
 Chart = GetDlgItem(IDC_STATIC_GUIJI);
    //得到窗口的矩形大小
 Chart->GetWindowRect(&m_ChartRect);
 //更改屏幕坐标,使之与客户区相对应
 ScreenToClient(&m_ChartRect);
 //画物体中心点
 for(i =0 ;i<this->m_YDGJ.m_Len;i++)
 {
  CPoint po;
  //得到物体中心点的横坐标、纵坐标
  po.x = m_YDGJ.m_Guiji[i].x+40;
  po.y = m_mapheight - m_YDGJ.m_Guiji[i].y+50;
  //画点
  dc.SetPixel(po,RGB(255,0,0));
 }
 //画物体的运动轨迹曲线
 for( i=0;i<this->m_YDGJ.m_Len-1;i++)
 {   //移动到起始点
  dc.MoveTo(m_YDGJ.m_Guiji[i].x+40,m_mapheight - m_YDGJ.m_Guiji[i].y+50);
  //画线
  dc.LineTo(m_YDGJ.m_Guiji[i+1].x+40,m_mapheight - m_YDGJ.m_Guiji[i+1].y+50);
 }
 Pen.DeleteObject();
}       
 运动物体的运动轨迹如图25所示。

 << 上一页  [11] [12] 下一页

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