0
웹캠에서 비디오를 표시하고 피드에서 모션을 감지 할 수있는 간단한 프로그램을 만들었지 만, 모션이 감지되면 웹캠에서 녹화하는 방법을 이해하는 데 문제가 있습니다. Aforge.Net 사이트를 검색했지만 필요한 작업을 이해하기가 어렵습니다. 움직임이 감지되면 미리 지정된 위치로 녹화를 시작하고 움직임이 감지되지 않으면 일정 시간 동안 녹화를 계속 한 다음 중지하고 싶습니다. 이 프로그램은 제가 지금까지 가지고있는 프로그램의 일부입니다 ...모션을 기반으로 웹캠에서 녹화하기. aforge를 사용하는 wpf
더 많은 정보 나 코드를 제공해야 할 필요가 있다면 알려주십시오. 감사합니다
$ // 열기 비디오 소스
private void OpenVideoSource(IVideoSource source)
{
// set busy cursor
//this.Cursor = Cursors.WaitCursor;
// close previous video source
CloseVideoSource();
//motionDetectionType = 1;
//SetMotionDetectionAlgorithm(new TwoFramesDifferenceDetector());
//motionProcessingType = 1;
//SetMotionProcessingAlgorithm(new MotionAreaHighlighting());
// start new video source
videoSourcePlayer.VideoSource = new AsyncVideoSource(source);
videoSourcePlayer.NewFrame +=new VideoSourcePlayer.NewFrameHandler(videoSourcePlayer_NewFrame);
//videoSourcePlayer.DesiredFrameRate = 30;
//webcam's default frame rate will be used instead of above code that has an error
// create new video file
writer.Open("test.avi", width, height, 25, VideoCodec.MPEG4);
// create a bitmap to save into the video file
Bitmap image = new Bitmap(width, height, System.Drawing.Imaging.PixelFormat.Format24bppRgb);
// write 1000 video frames
for (int i = 0; i < 1000; i++)
{
image.SetPixel(i % width, i % height, System.Drawing.Color.Red);
writer.WriteVideoFrame(image);
}
writer.Close();
try
{
videoSourcePlayer.Start();
//motionAlarmLevel = sldMotionSensitivity.Value/100;
}
catch (Exception x)
{
System.Windows.MessageBox.Show(x.ToString());
}
//videoSource.DesiredFrameSize = new System.Drawing.Size(800,600);
videoSourcePlayer.BorderColor = System.Drawing.Color.Blue;
// reset statistics
statIndex = statReady = 0;
// start timers
clock.Start();
//alarm.Start();
videoSource = source;
//this.Cursor = Cursors.Default;
}
// Close current video source
private void CloseVideoSource()
{
// set busy cursor
//this.Cursor = Cursors.WaitCursor;
// stop current video source
videoSourcePlayer.SignalToStop();
// wait 2 seconds until camera stops
for (int i = 0; (i < 50) && (videoSourcePlayer.IsRunning); i++)
{
Thread.Sleep(100);
}
if (videoSourcePlayer.IsRunning)
videoSourcePlayer.Stop();
// stop timers
clock.Stop();
//alarm.Stop();
motionHistory.Clear();
// reset motion detector
if (detector != null)
detector.Reset();
//videoSourcePlayer.BorderColor = System.Drawing.Color.Red;
//this.Cursor = Cursors.Default;
}
// New frame received by the player
void videoSourcePlayer_NewFrame(object sender, ref Bitmap image)
{
lock (this)
{
if (detector != null)
{
//motion detected
if (detector.ProcessFrame(image) > motionAlarmLevel)
{
//float motionLevel = detector.ProcessFrame(image);
videoSourcePlayer.BorderColor = System.Drawing.Color.Red;
Dispatcher.BeginInvoke(new ThreadStart(delegate { lblMotionDetected.Content = "Motion Detected"; }));
//lblMotionDetected.Content = "Motion Detected";
//flash = (int)(2 * (1000/alarm.Interval));
}
// no motion detected
if (detector.ProcessFrame(image) < motionAlarmLevel)
{
videoSourcePlayer.BorderColor = System.Drawing.Color.Black;
Dispatcher.BeginInvoke(new ThreadStart(delegate { lblMotionDetected.Content = "No Motion Detected"; }));
}
// if (motionLevel > motionAlarmLevel)
// {
// // flash for 2 seconds
// timer.Start();
// }
}
}
}