Теперь в нашем онлайн-магазине доступна уникальная книга «BEAM-робототехника. От азов до создания практических устройств», идеально подходящая как для кружков робототехники, так и для самообучения дома. Вы можете приобрести её по привлекательной цене в 699 рублей. Дополнительная информация о книге доступна на нашем сайте. Также в ассортименте нашего онлайн-магазина представлены готовые наборы для сборки роботов, с помощью которых ваш ребенок сможет легко собрать своего первого робота, следуя нашим подробным инструкциям. Перейти в магазин
Программу нашел. ЗАпустил, но тестирование не понравилось, с вебкамеры она как то работает не правильно. Хотя расширение не изменял.
Код программы:
Code
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using Emgu.CV; using Emgu.CV.Structure; using Emgu.CV.VideoSurveillance; using Emgu.Util;
namespace MotionDetection { public partial class Form1 : Form { private Capture _capture; private MotionHistory _motionHistory; private IBGFGDetector<Bgr> _forgroundDetector;
public Form1() { InitializeComponent();
//try to create the capture if (_capture == null) { try { _capture = new Capture(); } catch (NullReferenceException excpt) { //show errors if there is any MessageBox.Show(excpt.Message); } }
if (_capture != null) //if camera capture has been successfully created { _motionHistory = new MotionHistory( 1.0, //in second, the duration of motion history you wants to keep 0.05, //in second, parameter for cvCalcMotionGradient 0.5); //in second, parameter for cvCalcMotionGradient
Application.Idle += ProcessFrame; } }
private void ProcessFrame(object sender, EventArgs e) { using (Image<Bgr, Byte> image = _capture.QueryFrame()) using (MemStorage storage = new MemStorage()) //create storage for motion components { if (_forgroundDetector == null) { //_forgroundDetector = new BGCodeBookModel<Bgr>(); //_forgroundDetector = new FGDetector<Bgr>(Emgu.CV.CvEnum.FORGROUND_DETECTOR_TYPE.FGD); _forgroundDetector = new BGStatModel<Bgr>(image, Emgu.CV.CvEnum.BG_STAT_TYPE.FGD_STAT_MODEL); }
_forgroundDetector.Update(image);
capturedImageBox.Image = image;
//update the motion history _motionHistory.Update(_forgroundDetector.ForgroundMask);
#region get a copy of the motion mask and enhance its color double[] minValues, maxValues; Point[] minLoc, maxLoc; _motionHistory.Mask.MinMax(out minValues, out maxValues, out minLoc, out maxLoc); Image<Gray, Byte> motionMask = _motionHistory.Mask.Mul(255.0 / maxValues[0]); #endregion
//create the motion image Image<Bgr, Byte> motionImage = new Image<Bgr, byte>(motionMask.Size); //display the motion pixels in blue (first channel) motionImage[0] = motionMask;
//Threshold to define a motion area, reduce the value to detect smaller motion double minArea = 100;
storage.Clear(); //clear the storage Seq<MCvConnectedComp> motionComponents = _motionHistory.GetMotionComponents(storage);
//iterate through each of the motion component foreach (MCvConnectedComp comp in motionComponents) { //reject the components that have small area; if (comp.area < minArea) continue;
// find the angle and motion pixel count of the specific area double angle, motionPixelCount; _motionHistory.MotionInfo(comp.rect, out angle, out motionPixelCount);
//reject the area that contains too few motion if (motionPixelCount < comp.area * 0.05) continue;
//Draw each individual motion in red DrawMotion(motionImage, comp.rect, angle, new Bgr(Color.Red)); }
// find and draw the overall motion angle double overallAngle, overallMotionPixelCount; _motionHistory.MotionInfo(motionMask.ROI, out overallAngle, out overallMotionPixelCount); DrawMotion(motionImage, motionMask.ROI, overallAngle, new Bgr(Color.Green));
//Display the amount of motions found on the current image UpdateText(String.Format("Total Motions found: {0}; Motion Pixel count: {1}", motionComponents.Total, overallMotionPixelCount));
//Display the image of the motion motionImageBox.Image = motionImage; } }
/// <summary> /// Clean up any resources being used. /// </summary> /// <param name="disposing">true if managed resources should be disposed; otherwise, false.</param> protected override void Dispose(bool disposing) {
if (disposing && (components != null)) { components.Dispose(); }
Алгоритм немного другой. Судя по всему отличие только в том, что прорисовка окружности, показывающей направление движения в кадре происходит только тогда, когда motionComponents.Total больше чем X. Тот самый пример на C: http://rghost.ru/20603821 Заработает ли он хз, все библиотеки в папке в .exe, с ними должен запуститься.
Общайтесь с друзьями в нашем Online-чате по робототехнике
Мы рады, что в России открывается все больше кружков по робототехнике и мы стараемся прикладывать к этому свои усилия начиная с 2008 года :) Мы будем очень рады видеть в чате живое общение, обмен опытом между учащимися в робототехнике и просто увлеченными в этом направлении людей. Мы всегда онлайн, приходите, спрашивайте, помогайте другим - давайте сделаем Мир чуточку лучше!
Чтобы не потерять чат и быть всегда с нами на связи - откройте окно чата в новом окне браузера и добавьте его в заколадки. Открыть в новом окне