2010-09-21 49 views
22

C# có thể được sử dụng để phát triển một ứng dụng thời gian thực có liên quan đến việc nhập từ web cam liên tục và xử lý đầu vào không?sử dụng C# cho các ứng dụng thời gian thực

+0

Tôi không chắc chắn rằng như được mô tả hiện tại, ứng dụng của bạn nằm trong danh mục "thời gian thực", vì nó sẽ không quan trọng nếu video được đệm khi ứng dụng của bạn dừng lại. Vấn đề quan trọng duy nhất là xử lý các bộ đệm nhanh hơn khi chúng lấp đầy. – spender

+12

Windows không có ý định trở thành hệ điều hành "thời gian thực". Xem xét các hậu quả của việc không xử lý trong thời gian thực: trong trường hợp của bạn, chế độ thất bại là bạn bỏ lỡ một khung hình của video, có lẽ không phải là một việc lớn. Một hệ thống thời gian thực kiểm soát vị trí của cánh tay robot trong nhà máy, hoặc di chuyển các công tắc theo dõi trên đường ray tốc độ cao, có những tác động an toàn thực tế trong cuộc sống của con người nếu hoạt động vượt quá ngân sách thời gian hoặc công tắc điều khiển. trong một thời gian. Tôi không nghĩ bạn thực sự cần * thời gian thực *; Tôi nghĩ bạn chỉ cần * nhanh *. –

+3

@Eric: Có sự phân biệt giữa các hệ thống thời gian thực mềm và thời gian thực cứng. Lấy đầu vào từ một web cam trông giống như một kịch bản thời gian thực mềm với tôi, và Windows sẽ ổn. –

Trả lời

12

Tôi đã sử dụng C# để tạo nhiều ứng dụng thị giác máy, tốc độ cao, thời gian thực, chạy 24/7 và có máy móc di chuyển phụ thuộc vào ứng dụng. Nếu có điều gì đó sai trong phần mềm, một cái gì đó ngay lập tức và rõ ràng đi sai trong thế giới thực.

Tôi đã tìm thấy rằng C# /. Net cung cấp chức năng khá tốt để làm như vậy. Như những người khác đã nói, chắc chắn ở trên đầu trang của bộ sưu tập rác thải. Chia nhỏ để xử lý thành nhiều bước hợp lý và có các chuỗi riêng biệt hoạt động từng bước. Tôi đã tìm thấy mô hình lập trình Consumer Consumer để làm việc tốt cho điều này, có lẽ là ConcurrentQueue cho người mới bắt đầu.

Bạn có thể bắt đầu với một cái gì đó như:

  • Chủ đề 1 chụp hình ảnh camera, chuyển nó đến một số định dạng, và đặt nó vào một ImageQueue
  • Chủ đề 2 tiêu thụ từ ImageQueue, xử lý hình ảnh và đi kèm với một đối tượng dữ liệu được đưa vào một ProcessedQueue
  • Chủ đề 3 tiêu thụ từ ProcessedQueue và thực hiện điều gì đó thú vị với kết quả.

Nếu chủ đề 2 quá dài, chủ đề 1 và 3 vẫn đang lưu lại. Nếu bạn có một bộ xử lý đa lõi, bạn sẽ ném nhiều phần cứng hơn vào môn toán. Bạn cũng có thể sử dụng một số chủ đề thay cho bất kỳ chủ đề nào mà tôi đã viết ở trên, mặc dù bạn sẽ phải chăm sóc sắp xếp các kết quả theo cách thủ công.

Sửa

Sau khi đọc câu trả lời của những người khác, có lẽ bạn có thể tranh luận định nghĩa của tôi về "thời gian thực". Trong trường hợp của tôi, máy tính tạo ra các mục tiêu mà nó gửi đến các bộ điều khiển chuyển động làm chuyển động thời gian thực thực tế. Bộ điều khiển chuyển động cung cấp các lớp an toàn của riêng chúng cho những thứ như thời gian, dải max/min, tăng tốc/giảm tốc trơn tru và cảm biến an toàn. Các bộ điều khiển này đọc cảm biến trên toàn bộ nhà máy với thời gian chu kỳ nhỏ hơn 1ms.

+0

Điều gì sẽ xảy ra nếu phần mềm của bạn xử lý hình ảnh trễ sau mỗi vài tuần, phần còn lại của thiết bị chỉ dừng dây chuyền sản xuất khi bạn bắt kịp. –

5

Tuyệt đối. Điều quan trọng là để tránh thu gom rác và quản lý bộ nhớ càng nhiều càng tốt. Cố gắng tránh các đối tượng mới càng nhiều càng tốt, sử dụng bộ đệm hoặc các nhóm đối tượng khi bạn có thể.

+0

bạn có thể giải thích 'tránh thu gom rác và quản lý bộ nhớ' không? làm cách nào để tránh những trợ giúp này? và làm thế nào để tránh chúng :)? – mrid

4
  • Tất nhiên, có người thậm chí đã phát triển một thư viện để làm điều đó: AForge.NET
  • Như với bất kỳ ứng dụng thời gian thực và không chỉ C#, bạn sẽ phải quản lý bộ đệm cũng như @ David gợi ý .
  • Không chỉ vậy, còn có XNA Framework (đối với những thứ như trò chơi 3D) và bạn có thể lập trình DirectX sử dụng C# cũng rất thời gian thực.
  • Và bạn có biết rằng, nếu bạn muốn, bạn cũng có thể làm pointer manipulations in C#?
+0

Bạn biết đấy, DirectX được quản lý đã bị xóa vì quá chậm. – Puppy

+0

đó là một thông tin tốt đẹp. AForge.NET sẽ hữu ích cho tôi. cảm ơn – Jsinh

+0

[Ở đây] (http://www.mesta-automation.com/getting-started-with-computer-vision-in-c-sharp/) một số tài liệu hữu ích tồn tại để làm việc với khuôn khổ AForge. – GntS

30

Bạn không thể sử dụng bất kỳ ngôn ngữ thu gom rác chính nào cho "hệ thống thời gian thực cứng", vì thu thập rác đôi khi sẽ dừng hệ thống phản hồi trong một khoảng thời gian xác định. Tránh bố trí đối tượng có thể giúp đỡ, tuy nhiên bạn cần một cách để chứng minh bạn không tạo ra bất kỳ rác và thu gom rác sẽ không kick trong.

Tuy nhiên hầu hết các hệ “thời gian thực” không trong thực tế cần phải luôn luôn trả lời trong một thời gian khó khăn, do đó, tất cả đi xuống làm những gì bạn có nghĩa là bởi "thời gian thực".

Ngay cả khi các bộ phận của hệ thống cần phải là "thời gian thực khó" thường khác các bộ phận lớn của hệ thống như giao diện người dùng không.

(Tôi nghĩ rằng ứng dụng của bạn cần phải được khá nhanh so với “thời gian thực”, nếu 1 khung bị mất mỗi 100 năm có bao nhiêu người sẽ bị giết?)

+0

Còn cách sử dụng thì sao? Process.GetCurrentProcess(). PriorityClass = ProcessPriorityClass.RealTime; – Roger

+1

Đây phải là câu trả lời được chấp nhận !! +1 Thu gom rác các đối tượng tạm dừng trong vài phần nghìn giây để các ràng buộc về thời gian mới hơn sẽ được điền đầy đủ. – schoetbi

+0

Trừ khi ràng buộc thời gian của bạn là 1 giây và phần còn lại của chương trình của bạn chạy trong 500msec? Sau đó, bạn đã có 500 phụ tùng mili giây để thu gom rác thải? Nếu bạn ở dưới mức ràng buộc thời gian, nó có thực sự quan trọng đến mức đó không? – Paul

1

Nó phụ thuộc vào cách 'thời gian thực ' nó cần phải; tức là, những hạn chế về thời gian của bạn là gì và bạn cần phải làm gì một cách nhanh chóng.

Nếu bạn có thể xử lý 'làm điều gì đó' có thể cứ 300ms một lần trong .NET, hãy nói về sự kiện hẹn giờ, tôi thấy Windows hoạt động ổn. Lưu ý rằng đây là điều tôi thấy đúng trên nhiều hệ thống ở các độ tuổi khác nhau và tốc độ khác nhau. Như mọi khi, YMMV.

Nhưng con số đó quá dài đối với nhiều ứng dụng. Có thể không dành cho bạn.

Thực hiện một số nghiên cứu, đảm bảo ứng dụng của bạn phản hồi đủ nhanh cho ứng dụng của bạn.

Các vấn đề liên quan