实例介绍
【实例简介】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();
}
}
}
}
好例子网口号:伸出你的我的手 — 分享!
网友评论
小贴士
感谢您为本站写下的评论,您的评论对其它用户来说具有重要的参考价值,所以请认真填写。
- 类似“顶”、“沙发”之类没有营养的文字,对勤劳贡献的楼主来说是令人沮丧的反馈信息。
- 相信您也不想看到一排文字/表情墙,所以请不要反馈意义不大的重复字符,也请尽量不要纯表情的回复。
- 提问之前请再仔细看一遍楼主的说明,或许是您遗漏了。
- 请勿到处挖坑绊人、招贴广告。既占空间让人厌烦,又没人会搭理,于人于己都无利。
关于好例子网
本站旨在为广大IT学习爱好者提供一个非营利性互相学习交流分享平台。本站所有资源都可以被免费获取学习研究。本站资源来自网友分享,对搜索内容的合法性不具有预见性、识别性、控制性,仅供学习研究,请务必在下载后24小时内给予删除,不得用于其他任何用途,否则后果自负。基于互联网的特殊性,平台无法对用户传输的作品、信息、内容的权属或合法性、安全性、合规性、真实性、科学性、完整权、有效性等进行实质审查;无论平台是否已进行审查,用户均应自行承担因其传输的作品、信息、内容而可能或已经产生的侵权或权属纠纷等法律责任。本站所有资源不代表本站的观点或立场,基于网友分享,根据中国法律《信息网络传播权保护条例》第二十二与二十三条之规定,若资源存在侵权或相关问题请联系本站客服人员,点此联系我们。关于更多版权及免责申明参见 版权及免责申明


支持(0) 盖楼(回复)