在好例子网,分享、交流、成长!
您当前所在位置:首页C# 开发实例C#语言基础 → AForge运动物体识别 实例源码下载

AForge运动物体识别 实例源码下载

C#语言基础

下载此实例
  • 开发语言:C#
  • 实例大小:0.19M
  • 下载次数:91
  • 浏览次数:827
  • 发布时间:2017-02-07
  • 实例类别:C#语言基础
  • 发 布 人:zb0104
  • 文件格式:.rar
  • 所需积分:2
 相关标签: AForge 识别 运动物体

实例介绍

【实例简介】AForge运动物体识别

【实例截图】

【核心代码】


// Two Cameras Vision
//
// Copyright © Andrew Kirillov, 2009
// andrew.kirillov@aforgenet.com
//

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Drawing.Imaging;
using System.Text;
using System.Windows.Forms;
using System.Threading;

using AForge;
using AForge.Imaging;
using AForge.Imaging.Filters;
using AForge.Video;
using AForge.Video.DirectShow;

namespace Gesture
{
    public partial class MainForm : Form
    {
        // list of video devices
        FilterInfoCollection videoDevices;
        // form to tune object detection filter
        TuneObjectFilterForm tuneObjectFilterForm;

        ColorFiltering colorFilter = new ColorFiltering( );
        GrayscaleBT709 grayFilter  = new GrayscaleBT709( );
        // use two blob counters, so the could run in parallel in two threads
        BlobCounter blobCounter1 = new BlobCounter( );

        private AutoResetEvent camera1Acquired = null;
        private Thread trackingThread = null;

        private Bitmap nowImg;

        // object coordinates in both cameras
        private float x1, y1, x2, y2;

        public MainForm( )
        {
            InitializeComponent( );

            // show device list
            try
            {
                // enumerate video devices
                videoDevices = new FilterInfoCollection( FilterCategory.VideoInputDevice );

                if ( videoDevices.Count == 0 )
                {
                    throw new Exception( );
                }

                for ( int i = 1, n = videoDevices.Count; i <= n; i   )
                {
                    string cameraName = i   " : "   videoDevices[i - 1].Name;

                    camera1Combo.Items.Add( cameraName );
                }

                camera1Combo.SelectedIndex = 0;
            }
            catch
            {
                startButton.Enabled = false;

                camera1Combo.Items.Add( "No cameras found" );
                camera1Combo.SelectedIndex = 0;
                camera1Combo.Enabled = false;
            }

            //
            colorFilter.Red = new IntRange( 0, 100 );
            colorFilter.Green = new IntRange( 0, 200 );
            colorFilter.Blue = new IntRange( 150, 255 );

            // configure blob counters
            blobCounter1.MinWidth = 10;
            blobCounter1.MinHeight = 10;
            blobCounter1.FilterBlobs = true;
            blobCounter1.ObjectsOrder = ObjectsOrder.Size;

        }

        // Main form closing - stop cameras
        private void MainForm_FormClosing( object sender, FormClosingEventArgs e )
        {
            StopCameras( );
        }

        // On "Start" button click - start cameras
        private void startButton_Click( object sender, EventArgs e )
        {
            StartCameras( );

            startButton.Enabled = false;
            stopButton.Enabled = true;
        }

        // On "Stop" button click - stop cameras
        private void stopButton_Click( object sender, EventArgs e )
        {
            StopCameras( );

            startButton.Enabled = true;
            stopButton.Enabled = false;
        }

        // Start cameras
        private void StartCameras( )
        {
            // create first video source
            VideoCaptureDevice videoSource1 = new VideoCaptureDevice( videoDevices[camera1Combo.SelectedIndex].MonikerString );
            videoSource1.DesiredFrameRate = 15;

            videoSourcePlayer1.VideoSource = videoSource1;
            videoSourcePlayer1.Start( );

            camera1Acquired = new AutoResetEvent( false );
            // start tracking thread
            trackingThread = new Thread( new ThreadStart( TrackingThread ) );
            trackingThread.Start( );
        }

        // Stop cameras
        private void StopCameras( )
        {
            videoSourcePlayer1.SignalToStop( );

            videoSourcePlayer1.WaitForStop( );

            UpdateObjectPicture(null);

            if ( trackingThread != null )
            {
                // signal tracking thread to stop
                x1 = y1 = x2 = y2 = -1;
                camera1Acquired.Set( );
                trackingThread.Join( );
            }
        }

        // On "Tune Object Filter" button click - show filter tuning dialog
        private void tuneObjectFilterButton_Click( object sender, EventArgs e )
        {
            if ( tuneObjectFilterForm == null )
            {
                tuneObjectFilterForm = new TuneObjectFilterForm( );
                tuneObjectFilterForm.OnFilterUpdate  = new EventHandler( tuneObjectFilterForm_OnFilterUpdate );

                tuneObjectFilterForm.RedRange   = colorFilter.Red;
                tuneObjectFilterForm.GreenRange = colorFilter.Green;
                tuneObjectFilterForm.BlueRange  = colorFilter.Blue;
            }
            tuneObjectFilterForm.Show( );
        }

        // Object filter properties are updated
        private void tuneObjectFilterForm_OnFilterUpdate( object sender, EventArgs eventArgs )
        {
            colorFilter.Red   = tuneObjectFilterForm.RedRange;
            colorFilter.Green = tuneObjectFilterForm.GreenRange;
            colorFilter.Blue  = tuneObjectFilterForm.BlueRange;
        }

        // Turn on/off object detection
        private void objectDetectionCheck_CheckedChanged( object sender, EventArgs e )
        {
            if ( ( !objectDetectionCheck.Checked ))
            {
                UpdateObjectPicture(null );
            }
        }

        // received frame from the 1st camera
        private void videoSourcePlayer1_NewFrame( object sender, ref Bitmap image )
        {
            nowImg = (Bitmap)image.Clone();
            if ( objectDetectionCheck.Checked )
            {
                Bitmap objectImage = colorFilter.Apply( image );

                // lock image for further processing
                BitmapData objectData = objectImage.LockBits( new Rectangle( 0, 0, image.Width, image.Height ),
                    ImageLockMode.ReadOnly, image.PixelFormat );

                // grayscaling
                UnmanagedImage grayImage = grayFilter.Apply( new UnmanagedImage( objectData ) );

                // unlock image
                objectImage.UnlockBits( objectData );

                // locate blobs 
                blobCounter1.ProcessImage( grayImage );
                Rectangle[] rects = blobCounter1.GetObjectsRectangles( );

                if ( rects.Length > 0 )
                {
                    Rectangle objectRect = rects[0];

                    // draw rectangle around derected object
                    Graphics g = Graphics.FromImage( image );

                    using ( Pen pen = new Pen( Color.FromArgb( 160, 255, 160 ), 3 ) )
                    {
                        g.DrawRectangle( pen, objectRect );
                    }

                    g.Dispose( );

                    // get object's center coordinates relative to image center
                    lock ( this )
                    {
                        x1 = ( objectRect.Left   objectRect.Right - objectImage.Width ) / 2;
                        y1 = ( objectImage.Height - ( objectRect.Top   objectRect.Bottom ) ) / 2;
                        // map to [-1, 1] range
                        x1 /= ( objectImage.Width / 2 );
                        y1 /= ( objectImage.Height / 2 );

                        camera1Acquired.Set( );
                    }
                }

                UpdateObjectPicture(objectImage );
            }
        }

        // Thread to track object
        private void TrackingThread( )
        {
            float targetX = 0;
            float targetY = 0;

            while ( true )
            {
                camera1Acquired.WaitOne( );
                lock ( this )
                {
                    // stop the thread if it was signaled
                    if ( ( x1 == -1 ) && ( y1 == -1 ) && ( x2 == -1 ) && ( y2 == -1 ) )
                    {
                        break;
                    }

                    // get middle point
                    targetX = ( x1   x2 ) / 2;
                    targetY = ( y1   y2 ) / 2;
                }

            }
        }

        /// <summary>
        /// 选择绿色的物体为识别的对象
        /// </summary>
        private void videoSourcePlayer1_MouseUp(object sender, MouseEventArgs e)
        {
            Color[] pixelColor = new Color[10];
            int redMax = 0, blueMax = 0, greenMin = 0;
            for (int i = -5, ii = 0; i < 5; i  , ii  )
            {
                int x = e.X   i;
                int y = e.Y   i;

                pixelColor[ii] = nowImg.GetPixel(x, y);
                redMax = Math.Max(redMax, pixelColor[ii].R);
                blueMax = Math.Max(blueMax, pixelColor[ii].B);
                greenMin = Math.Max(redMax, blueMax);
            }
            colorFilter.Red.Min = 0;
            colorFilter.Red.Max = redMax;
            colorFilter.Blue.Min = 0;
            colorFilter.Blue.Max = blueMax;
            colorFilter.Green.Min = greenMin;
            colorFilter.Green.Max = 255;
        }

        // Update object's picture
        public void UpdateObjectPicture(Bitmap picture)
        {
            System.Drawing.Image oldPicture = null;

            oldPicture = pictureBox1.Image;
            pictureBox1.Image = picture;

            if (oldPicture != null)
            {
                oldPicture.Dispose();
            }
        }
    }
}


实例下载地址

AForge运动物体识别 实例源码下载

不能下载?内容有错? 点击这里报错 + 投诉 + 提问

好例子网口号:伸出你的我的手 — 分享

网友评论

第 1 楼 蒹葭zyj 发表于: 2018-01-31 11:29 33
不知道为什么摄像头打不开一直connectting

支持(0) 盖楼(回复)

发表评论

(您的评论需要经过审核才能显示)

查看所有1条评论>>

小贴士

感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。

  • 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
  • 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
  • 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
  • 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。

关于好例子网

本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明

;
报警