2011-12-05 29 views
6

[Chú ý: Đây là một viết lại của một earlier question đó được coi là không phù hợp và đóng cửa.]khuyến nghị cho thời gian thực phân tích pixel cấp của truyền hình (TV) Video

tôi cần phải làm một số phân tích pixel cấp video truyền hình (TV). Bản chất chính xác của phân tích này không phù hợp, nhưng về cơ bản nó liên quan đến việc xem từng điểm ảnh của mỗi khung hình của video truyền hình, bắt đầu từ luồng truyền tải MPEG-2. Nền tảng máy chủ sẽ là các máy Linux 64 bit đa cấp máy chủ.

Tôi cần thư viện có thể xử lý giải mã luồng truyền tải và hiển thị cho tôi dữ liệu hình ảnh trong thời gian thực. OpenCV và ffmpeg là hai thư viện mà tôi đang xem xét cho công việc này. OpenCV hấp dẫn bởi vì tôi đã nghe nói rằng nó dễ sử dụng các API và hỗ trợ phân tích hình ảnh phong phú, nhưng tôi không có kinh nghiệm sử dụng nó. Tôi đã sử dụng ffmpeg trong quá khứ để trích xuất dữ liệu khung hình video từ các tệp để phân tích, nhưng nó thiếu hỗ trợ phân tích hình ảnh (mặc dù IPP của Intel có thể bổ sung).

Ngoài các khuyến nghị chung của các phương pháp cho vấn đề này (không bao gồm việc phân tích hình ảnh thực tế), tôi có một số câu hỏi cụ thể hơn mà có thể giúp tôi bắt đầu:

  1. Are ffmpeg hoặc OpenCV thường được sử dụng trong ngành công nghiệp như nền tảng cho phân tích video theo thời gian thực hoặc có điều gì khác mà tôi nên xem xét?
  2. OpenCV có thể giải mã các khung hình video trong thời gian thực hay không và vẫn còn đủ CPU còn sót lại để thực hiện phân tích hình ảnh không tự phát, cũng trong thời gian thực?
  3. Đủ để sử dụng ffpmeg cho giải mã luồng truyền tải MPEG-2, hoặc có thích hợp hơn khi chỉ sử dụng thư viện giải mã MPEG-2 trực tiếp (và nếu có, cái nào)?
  4. Có định dạng pixel cụ thể cho khung hình đầu ra ffmpeg hoặc OpenCV đặc biệt hiệu quả khi sản xuất (như RGB, YUV hoặc YUV422, v.v ...) không?
+0

Rất nhiều câu hỏi liên quan đến hiệu suất mà bạn đã hỏi chỉ phụ thuộc vào phần cứng bạn đang sử dụng. – karlphillip

+0

@karlphillip Tôi nhận ra rằng sự lựa chọn của nền tảng sẽ tác động đến hiệu suất, nhưng nó sẽ không ảnh hưởng đến tất cả các tùy chọn thư viện như nhau? Nếu không, và bạn có thể nói về cách lựa chọn nền tảng sẽ mang lại lợi ích cho một thư viện nhiều hơn một thư viện khác, vui lòng chia sẻ. Phần cứng chưa được mua, vì vậy thông tin này có giá trị. –

+0

Tôi đã thực hiện phân tích khung webcam thời gian thực với opencv bằng cách sử dụng trình bao bọc C++. Nó xoay quanh từng điểm ảnh và màu được kiểm tra, nó khá nhanh, vì tôi có thể chạy các ứng dụng khác như opera và ứng dụng khung nhìn 3d. Làm việc trên Linux. –

Trả lời

6

1.
Tôi chắc chắn sẽ khuyên OpenCV cho "thời gian thực" phân tích hình ảnh. Tôi giả sử theo thời gian thực, bạn đang đề cập đến khả năng theo kịp tốc độ khung hình TV (ví dụ: NTSC (29,97 fps) hoặc PAL (25 khung hình/giây)). Tất nhiên, như đã đề cập trong các ý kiến, nó chắc chắn phụ thuộc vào phần cứng bạn có sẵn cũng như kích thước hình ảnh SD (480p) so với HD (720p hoặc 1080p). FFmpeg chắc chắn có những điều kỳ quặc của nó, nhưng bạn sẽ khó ép để tìm một giải pháp thay thế miễn phí tốt hơn. Sức mạnh và tính linh hoạt của nó khá ấn tượng; Tôi chắc chắn đó là một trong những lý do mà các nhà phát triển OpenCV quyết định sử dụng nó như là back-end cho giải mã video/mã hóa với OpenCV.

2.
Tôi chưa gặp sự cố với độ trễ cao khi sử dụng OpenCV để giải mã. Hệ thống của bạn có độ trễ bao nhiêu? Nếu bạn cần tăng hiệu suất, hãy xem xét sử dụng các luồng riêng biệt để chụp/giải mã và phân tích hình ảnh. Vì bạn đã đề cập có hệ thống đa bộ xử lý, nên tận dụng lợi thế của khả năng xử lý của bạn. Tôi chắc chắn sẽ khuyên bạn nên sử dụng kiến ​​trúc Intel Core-i7 mới nhất (hoặc có thể là Xeon tương đương) vì điều này sẽ mang đến cho bạn hiệu suất tốt nhất hiện nay.

Tôi đã sử dụng OpenCV trên một số hệ thống nhúng, vì vậy tôi khá quen thuộc với mong muốn của bạn về hiệu suất cao nhất. Tôi đã tìm thấy nhiều lần rằng nó là không cần thiết để xử lý một hình ảnh khung hình đầy đủ (đặc biệt là khi cố gắng xác định mặt nạ). Tôi rất muốn giới thiệu các hình ảnh lấy mẫu xuống nếu bạn đang gặp khó khăn khi xử lý các luồng video đã thu được của mình.Điều này đôi khi có thể cung cấp cho bạn tốc độ 4-8X ngay lập tức (tùy thuộc vào yếu tố mẫu xuống) của bạn. Ngoài ra trên mặt trận hiệu suất, tôi chắc chắn sẽ khuyên bạn nên sử dụng của Intel IPP. Vì OpenCV ban đầu là một dự án của Intel, IPP và OpenCV kết hợp rất tốt với nhau.

Cuối cùng, vì xử lý hình ảnh là một trong những trường "vấn đề song song" không quên khả năng sử dụng GPU làm bộ tăng tốc phần cứng cho các vấn đề của bạn nếu cần. OpenCV đã làm rất nhiều công việc trong lĩnh vực này kể từ cuối năm, vì vậy bạn nên có những công cụ có sẵn cho bạn nếu cần thiết.

3.
Tôi nghĩ FFmpeg sẽ là điểm khởi đầu tốt; hầu hết các lựa chọn thay thế mà tôi có thể nghĩ đến (Handbrake, mencoder, v.v.) có xu hướng sử dụng ffmpeg như một phụ trợ, nhưng có vẻ như bạn có thể cuộn của riêng mình với thư viện Video Coding của IPP nếu bạn muốn.

4.
đại diện nội bộ của OpenCV của màu sắc là BGR trừ khi bạn sử dụng một cái gì đó giống như cvtColor để chuyển đổi nó. Nếu bạn muốn xem danh sách các định dạng pixel được hỗ trợ bởi FFmpeg, bạn có thể chạy

ffmpeg -pix_fmts 

để xem những gì có thể nhập và xuất.

+0

Thông tin chi tiết hữu ích, @mevatron. Cảm ơn nhiều. –

3

Đối với chỉ các câu hỏi 4:

dòng video được mã hóa trong một định dạng 422: YUV, YUV422, YCbCr vv Chuyển đổi họ BGR và trở lại (tái mã hóa) ăn lên rất nhiều thời gian. Vì vậy, nếu bạn có thể viết các thuật toán của mình để chạy trên YUV, bạn sẽ nhận được tăng hiệu suất ngay lập tức.

Lưu ý 1. Trong khi OpenCV hỗ trợ hình ảnh BGR, bạn có thể xử lý YUV, với một số sự quan tâm và kiến ​​thức về nội bộ của nó.

Ví dụ: nếu bạn muốn phát hiện một số người trong video, chỉ cần chiếm nửa trên của bộ đệm video đã giải mã (nó chứa biểu diễn màu xám của hình ảnh) và xử lý nó.

Lưu ý 2. Nếu bạn muốn truy cập hình ảnh YUV trong opencv, bạn phải sử dụng API ffmpeg trực tiếp trong ứng dụng của mình. OpenCV buộc chuyển đổi từ YUV sang BGR trong API VideoCapture của nó.

+0

Thông tin tốt. Cảm ơn. –

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