2012-10-22 45 views
10

Tôi đang cố gắng viết một ứng dụng có thể truy cập vào máy ảnh được kết nối với PC, quay video và tải hình ảnh từ video. Tôi sử dụng thư viện AForge.NET để truy cập máy ảnh: http://www.aforgenet.com/framework/Tải Ảnh từ Video

Tôi không biết sự kiện có tên AForge.Video.NewFrameEventHandler hoạt động như thế nào. Trong mã này, sự kiện trả về null thành bitmap thay vì một khung mới từ video hoặc sự kiện không được gọi. Tôi muốn lấy khung hình từ video đến một hộp hình ảnh mỗi khung thời gian để làm một cái gì đó giống như một dòng video và sau khi nhấp vào nút dừng Tôi muốn hình ảnh cuối cùng được hiển thị trong hộp hình ảnh. Có ai biết làm thế nào? Và tại sao mã của tôi không hoạt động?

Code:

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using AForge.Video.DirectShow; 
using System.Drawing; 
using AForge.Video; 

namespace CameraDevice 
{ 
    public class CameraImaging 
    { 
     // enumerate video devices 
     public FilterInfoCollection videoDevices = new FilterInfoCollection(FilterCategory.VideoInputDevice); 
     //camera 
     public VideoCaptureDevice videoSource; 
     //screen shot 
     public Bitmap bitmap; 
     public CameraImaging() 
     { 
      // create video source 
      VideoCaptureDevice videoSource = new VideoCaptureDevice(videoDevices[0].MonikerString); 
      // set NewFrame event handler 
      videoSource.NewFrame += new NewFrameEventHandler(video_NewFrame); 
     } 
     public void StartVideo(VideoCaptureDevice videoSource) 
     { 
      // start the video source 
      videoSource.Start(); 
      // ... 
     } 
     public void StopVideo(VideoCaptureDevice videoSource) 
     { 
      // stop the video source 
      videoSource.Stop(); 
      // ... 
     } 
     private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
     { 
      // get new frame 
      bitmap = eventArgs.Frame; 
      // process the frame 
     } 
    } 
} 

Mã tương tự là ở đây: http://www.aforgenet.com/framework/features/directshow_video.html[ ^]

Trong Windows Forms tôi chạy video này trong một chủ đề mà không phương pháp này:

private void VideoRecording() 
    { 
     camImg.videoSource.Start(); 

     while (!StopVideo) 
     { 
      pictureBox1.Image = camImg.bitmap; 
      pictureBox1.Invalidate(); 
     } 
     camImg.videoSource.Stop(); 

    } 
+0

AForge.NET sử dụng API DirectShow gốc để truy cập phần cứng quay video.Bạn có thể muốn xem thư viện [DirectShow.NET] (http://directshownet.sourceforge.net/) thay vào đó là "cầu nối" được sử dụng rộng rãi nhất giữa các ứng dụng .NET và các API bắt hình. –

Trả lời

0

Một đường đi là get or write a wrapper around FFMPEG, có thể thực hiện công việc cho bạn extracting images from your video. Tôi đã làm việc trên hai dự án đã sử dụng phương tiện này để nhận hình thu nhỏ và/hoặc ảnh tĩnh từ video đã tải lên. Nó sẽ cảm thấy một chút hackish, nhưng nó sẽ hoạt động.

3

Nếu tôi nhớ chính xác bitmap cần được sao chép ngay lập tức vì nó bị ghi đè sau sự kiện. Sử dụng một tham chiếu là không tốt ở đây. Hãy thử một cái gì đó như:

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    // copy the new frame 
    bitmap = new Bitmap(eventArgs.Frame); 
    // process the frame 
} 

hoặc

private void video_NewFrame(object sender, NewFrameEventArgs eventArgs) 
{ 
    // clone new frame 
    bitmap = eventArgs.Frame.Clone(); 
    // process the frame 
} 

Ngoài ra, bạn không nên sử dụng một chủ đề thêm cho điều này, AForge đã thực hiện điều đó.

  1. Gọi Bắt đầu (ví dụ như trong trường hợp tải, hoặc sau khi nhấn một nút)
  2. Xử lý các sự kiện khung

    private void VideoStream_NewFrame (object sender, EventArgs AForge.Video.NewFrameEventArgs) { Bitmap newFrame = new Bitmap (eventArgs.Frame); pictureBox1.Image = newFrame; }

  3. Gọi Stop (đóng kiện hoặc nút)

Nếu bạn gặp sự cố với WinForm điều khiển ví dụ một nhãn bạn cần biết rằng các điều khiển này đã được tạo trên một luồng khác và bạn cần sử dụng Gọi. Ví dụ:

label_ms.Invoke((MethodInvoker)(() => label_ms.Text = msTimeSpan.TotalMilliseconds.ToString())); 

Tốt nhất là để kiểm tra mẫu này AForge mà đi kèm với khung làm việc: http://aforge.googlecode.com/svn/trunk/Samples/Video/Player/

1

Tôi đang sử dụng các thư viện video Aforge với Foscams của tôi, và nó đang làm việc rất tốt. Đây là mã của tôi cho trình xử lý sự kiện.

private void Video_NewFrame(object sender, AForge.Video.NewFrameEventArgs eventArgs) 
    { 
     //Create Bitmap from frame 
     Bitmap FrameData = new Bitmap(eventArgs.Frame); 
     //Add to PictureBox 
     PictureBox.Image = FrameData; 
    } 
Các vấn đề liên quan