2013-02-03 21 views
7

Hai ngày qua tôi đã tìm cách chụp ảnh từ webcam bằng C#. Tôi khá mới trong C# và tôi KHÔNG muốn sử dụng libs bên thứ ba bên ngoài, vì vậy tôi tìm thấy hai cách tốt đẹp, nhưng cả hai dường như trở lại gần như cùng một lỗi. Tôi không thể có được bất kỳ người trong số họ để làm việc, vì vậy nó sẽ thực sự tốt đẹp nếu bạn giúp tôi để có được một trong số họ chạy hoặc giúp tôi để tìm thay thế.C# chụp ảnh từ webcam

Vì vậy, cách đầu tiên tôi tìm thấy là sử dụng Windows WIA. Tôi thấy đoạn mã sau:

CommonDialogClass dialog = new CommonDialogClass(); 
Device camera = dialog.ShowSelectDevice(WiaDeviceType.CameraDeviceType, true, false); 
     // take the photo 
Item item = camera.ExecuteCommand(CommandID.wiaCommandTakePicture); 
ImageFile image = (ImageFile)item.Transfer(FormatID.wiaFormatJPEG); 
     // filename and saving 
image.SaveFile("Test.jpg"); 

mã này có vẻ là exacly những gì tôi đang tìm kiếm, nhưng tôi không thể làm cho nó chạy, vì tôi nhận được lỗi sau trên dòng thứ hai:

Exception from HRESULT: 0x80210015 

cách thứ hai tôi thấy là sử dụng Avicap32.dll với mẫu sau:

http://www.timvw.be/wp-content/code/csharp/testavicap32.zip 

nhưng tôi nhận được vào mã này:

Image image = ((CaptureDevice)cboDevices.SelectedItem).Capture(); 
image.Save(@"c:\capture.png", ImageFormat.Png); 

ngoại lệ sau: Không có ngoại lệ

Tôi nghĩ rằng cả hai giải pháp đều gây ra sự cố vì họ không thể tìm thấy máy ảnh của tôi, nhưng tôi có thể sử dụng máy ảnh của mình trên skype mà không gặp bất kỳ sự cố nào.

Trả lời

9
  • WIA dành cho ảnh tĩnh, đây là một loại "API để làm việc với máy quét"; 0x80210015WIA_S_NO_DEVICE_AVAILABLE
  • AVICAP32 tên API là "Video for Windows" mà thực sự là bị phản đối và lỗi thời, nó có thể làm việc ra (tương thích vẫn là ở đây) nhưng rất có thể là cao mà nó sẽ đưa bạn đến đâu

API để làm việc với máy ảnh web là:

  • DirectShow
  • Media Foundation

Cả hai đều là các API gốc và bạn có thể gặp khó khăn trong việc giao tiếp chúng trực tiếp từ mã C#, tuy nhiên với DirectShow.NET (đặc biệt) và Media Foundation.NET bạn có các trình bao bọc cho mã được quản lý. Bạn có thể tìm thêm về việc sử dụng DirectShow.NET đây:

1

Tôi khuyên bạn nên Aforge.net framework.

Nó có thể triển khai videoCaptureDevice class được sử dụng trong dự án mẫu: Snapshot Maker example để nhanh chóng tạo hộp thoại chụp hình ảnh. Đó là một chút chậm hơn so với DirectShow Library-How to capture image using directshow library without showing the webcam live images on the PictureBox or Panel nhưng nó là ổn định và nó là phương pháp dễ dàng để thiết lập độ phân giải video và hình ảnh từ một thiết bị được hỗ trợ.

Vấn đề duy nhất tôi gặp phải là VideoCaptureDevice.SimulateTrigger() sử dụng chuỗi bacjground để tạo hình ảnh từ nguồn cấp dữ liệu video và trả về hình ảnh trên sự kiện. Cần ủy quyền phương pháp để ngăn chặn các vấn đề về chuỗi chéo nếu bạn đặt hình ảnh được trả về trên một điều khiển winform trên chuỗi giao diện người dùng.

Lấy nguồn từ dự án Snapshot Maker từ nguồn Aforge.net SVN link.

+0

tôi đã thành công sử dụng chúng quá, tuy nhiên mức độ so sánh cho ảnh tĩnh có vẻ khá thấp , Tôi chỉ chạy ở 2 trong số 7 máy ảnh được thử nghiệm, tôi đoán là máy ảnh hiện đại không bận tâm với chức năng chụp ảnh riêng biệt và chỉ cần lấy khung video và aforge chưa được cập nhật trong vài năm – MikeT

7

Tôi đã thử nhiều cách tiếp cận và cách tiếp cận dễ dàng nhất đối với tôi là Emgu.cv (gói nuget).

 VideoCapture capture = new VideoCapture(); //create a camera capture 
     Bitmap image = capture.QueryFrame().Bitmap; //take a picture 

Vậy đó (như các phiên bản API 3.3.0)

Cũ API tiếp cận

 Capture capture = new Capture(); //create a camera captue 
     Bitmap image = capture.QueryFrame().Bitmap; //take a picture 
+1

Tri chỉnh sửa nó nhưng bây giờ sẽ là VideoCapture thay vì Capture. –

+0

Tôi đồng ý, trung thực câu hỏi này Tiêu đề nên được tái cơ cấu để cụ thể hơn. Phần thân của câu hỏi yêu cầu một cách tiếp cận mà không có thư viện của bên thứ ba. Nhưng câu hỏi này là câu hỏi duy nhất liên quan đến chụp ảnh C# webcam. – Ashitakalax