基於Aforge的手勢識別之三~~~多點手勢識別

本文來自http://blog.csdn.net/hellogv/ ,引用必須注明出處!

       上次介紹了單點手勢識別,這次就繼續介紹一下如何實現多點手勢識別,先來看看本文實現的效果圖,圖片有點大,請稍候。。。:

 

       我預先讓程序學習了B和C這兩個字母,第一個對象通過點擊鼠標左鍵去選擇顏色(對象為綠色),第二個對象通過點擊鼠標右鍵去選擇顏色(對象為紅色),然後通過兩支手指的手勢識別分別向程序繪畫圖形,所以點擊recorgize時,就自動把圖形的特征對應的字母給識別出來了。

       本文上一篇文章的延伸,如圖中所示,這裡通過一個對象的消失/重現來識別是否開始繪圖,當突然消失/重現則開始繪圖,再次消失/重現則停止繪圖。本文的代碼可以到這裡下載:http://download.csdn.net/source/2323958

        接下來貼出本文的核心代碼:

[c-sharp]  view plain copy print ?
  1. private void videoSourcePlayer1_NewFrame( object sender, ref Bitmap image )  
  2. {  
  3.     //保存捕獲到的對象  
  4.     List<Rectangle> []rects = new List<Rectangle>[2];  
  5.   
  6.     Bitmap[] objectImage = new Bitmap[2];  
  7.     for (int i = 0; i < ObjectSum; i++)//捕獲對象  
  8.     {  
  9.         nowImg[i] = (Bitmap)image.Clone();  
  10.   
  11.         objectImage[i] = colorFilter[i].Apply(nowImg[i]);  
  12.   
  13.         // lock image for further processing  
  14.         BitmapData objectData = objectImage[i].LockBits(new Rectangle(0, 0, image.Width, image.Height),  
  15.             ImageLockMode.ReadOnly, image.PixelFormat);  
  16.   
  17.         // grayscaling  
  18.         UnmanagedImage grayImage = new GrayscaleBT709().Apply(new UnmanagedImage(objectData));  
  19.   
  20.         // unlock image  
  21.         objectImage[i].UnlockBits(objectData);  
  22.   
  23.         // 從顏色中篩選有效的對象  
  24.         blobCounter[i].ProcessImage(grayImage);  
  25.         rects[i] = new List<Rectangle>();  
  26.         rects[i].AddRange(blobCounter[i].GetObjectsRectangles());  
  27.   
  28.         //如果當前對象i不存在,並且原有的對象i又是存在的,則表示是對象i隱藏起來了  
  29.         if (rects[i].Count == 0 && oldRect[i].IsEmpty == false)  
  30.         {  
  31.             isCapture[i] = !isCapture[i];//改變為反模式  
  32.             clsHandWrite[i].Clear();  
  33.         }  
  34.         else if (rects[i].Count > 0)//如果當前對象i存在  
  35.         {  
  36.             #region 去掉內部和黏在一起的對象  
  37.             for (int ii = 0; ii < rects[i].Count - 1; ii++)  
  38.             {  
  39.                 //true表示X軸上不能相交,false表示相交  
  40.                 Boolean isNoTouchX = Math.Max(rects[i][ii + 1].Right, rects[i][ii].Right) - Math.Min(rects[i][ii + 1].Left, rects[i][ii].Left) > (rects[i][ii].Width + rects[i][ii + 1].Width);  
  41.                 //true表示Y軸上不能相交,false表示相交  
  42.                 Boolean isNoTouchY = Math.Max(rects[i][ii + 1].Bottom, rects[i][ii].Bottom) - Math.Min(rects[i][ii + 1].Top, rects[i][ii].Top) > (rects[i][ii].Height + rects[i][ii + 1].Height);  
  43.                 if (isNoTouchX == false && isNoTouchY == false)//如果兩個對象相交  
  44.                 {  
  45.                     Rectangle rect = new Rectangle(Math.Min(rects[i][ii].Left, rects[i][ii + 1].Left),  
  46.                         Math.Min(rects[i][ii].Top, rects[i][ii + 1].Top),  
  47.                         Math.Max(rects[i][ii].Right, rects[i][ii + 1].Right) - Math.Min(rects[i][ii].Left, rects[i][ii + 1].Left),  
  48.                         Math.Max(rects[i][ii].Bottom, rects[i][ii + 1].Bottom) - Math.Min(rects[i][ii].Top, rects[i][ii + 1].Top));  
  49.                     rects[i].RemoveAt(ii + 1);  
  50.                     rects[i].RemoveAt(ii);  
  51.   
  52.                     rects[i].Add(rect);  
  53.                     ii = 0;  
  54.                 }  
  55.             }  
  56.             #endregion  
  57.  
  58.             #region 畫出表示點  
  59.             Rectangle objectRect = rects[i][0];//只取得該對象第一個矩陣  
  60.             Graphics g = Graphics.FromImage(image);  
  61.   
  62.             if (isCapture[i])//如果捕捉到對象  
  63.             {  
  64.                 Pen pen = new Pen(Color.FromArgb(255, 255, 255), 3);  
  65.                 g.DrawRectangle(pen, objectRect);  
  66.                 int x = (objectRect.Left + objectRect.Width / 2) * pbDraw1.Width / videoSourcePlayer1.Width;  
  67.                 int y = (objectRect.Top + objectRect.Height / 2) * pbDraw1.Height / videoSourcePlayer1.Height;  
  68.                 clsHandWrite[i].Draw(x, y);  
  69.             }  
  70.             else//如果沒有捕捉到對象  
  71.             {  
  72.                 Pen pen = new Pen(Color.FromArgb(160, 255, 160), 3);  
  73.                 g.DrawRectangle(pen, objectRect);  
  74.             }  
  75.   
  76.             g.Dispose();  
  77.   
  78.             oldRect[i] = new Rectangle();//初始化  
  79.             oldRect[i] = rects[i][0];  
  80.             #endregion  
  81.         }  
  82.     }  
  83.     Cls_Common.UpdateObjectPicture(ref pictureBox1, objectImage[0]);//顯示過濾顏色的對象1  
  84.     Cls_Common.UpdateObjectPicture(ref pictureBox2, objectImage[1]);//顯示過濾顏色的對象2  
  85. }  
  86.   
  87. /// <summary>  
  88. /// 選擇綠色的物體為識別的對象  
  89. /// </summary>  
  90. private void videoSourcePlayer1_MouseUp(object sender, MouseEventArgs e)  
  91. {  
  92.     if (e.Button == MouseButtons.Left)//點擊左鍵,識別綠色對象  
  93.         Cls_Common.MarkGreen(nowImg[0], ref colorFilter[0], e.X, e.Y);  
  94.     else  if (e.Button == MouseButtons.Right)//點擊右鍵,識別紅色對象  
  95.         Cls_Common.MarkRed(nowImg[1], ref colorFilter[1], e.X, e.Y);  
  96. }  

### 回答1: aforge的图像识别程序是一种利用计算机视觉技术实现的自动图像识别应用程序,它采用了aforge人工智能框架来对图像进行处理和分析,从而能够自动识别出图像中的目标物体、人脸、文字等信息,具有广泛的应用价值。 aforge的图像识别程序的工作原理是:先将待识别的图像进行预处理,如裁剪、缩放、去噪等操作,使其符合算法处理的要求。然后,根据不同的需求选用不同的算法进行图像分析和处理,如特征点检测、颜色分析、形状匹配等。最终,将分析得到的结果与预先设置的策略进行比对,确定目标物体的位置、尺寸和属性等信息。 aforge的图像识别程序可以应用于各种领域,如工业自动化、智能监控、医学影像分析等。例如,在工业生产中,可以用于检测产品的缺陷、质量问题等;在智能监控中,可以用于识别行人、车辆等信息,实现于视觉的安防措施;在医学影像分析中,可以用于识别医学图像中的病变、器官等信息,提升医疗诊断的准确性。 总之,aforge的图像识别程序是一种十分有前景和潜力的应用程序,能够运用先进的计算机视觉技术实现自动化的图像识别,为现代化社会的进步和发展贡献巨大。 ### 回答2: aforge库的图像识别程序可用于在图像、视频或摄像头实时流中识别物体、人脸、文字等。 该程序的主要流程为:首先加载所需的aforge库,然后打开要识别的图像或视频文件,对其进行归一化、分割等处理操作。接着将处理后的图像通过训练好的算法进行特征提取和分类,从而确定图像中是否存在所需识别的物体、人脸等。 对于物体识别,通常使用SIFT或SURF算法进行特征提取;人脸识别则使用Haar-cascade或于深度学习的卷积神经网络(CNN)等算法。 在实际使用中,使用者可以根据实际需求调整参数,提高图像的识别准确度,例如改变图像的亮度、对比度、尺寸等,或更改特征提取算法的参数。 总之,aforge的图像识别程序可以广泛应用于安防监控、智能家居、无人驾驶、医疗影像等各种领域,为人们的生活和工作提供更便捷、高效的解决方案。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值