2012-01-13 24 views
5

Tôi đang phát triển ứng dụng sẽ nhận hình ảnh từ thiết bị camera và hiển thị chúng trong cửa sổ GTK.C, GTK: hiển thị luồng hình ảnh RGB ở <60 khung hình/giây

Máy ảnh cung cấp hình ảnh RGB thô (3 byte cho mỗi pixel, không có kênh alpha, kích thước cố định) ở tốc độ khung hình khác nhau (1-50 khung hình/giây).

Tôi đã thực hiện tất cả nội dung phần cứng đó và hiện có chức năng gọi lại được gọi với mọi hình ảnh mới được máy ảnh chụp.

Cách dễ nhất nhưng đủ nhanh để hiển thị những hình ảnh đó trong cửa sổ của tôi là gì?

Dưới đây là những gì tôi đã cố gắng:

  • sử dụng gdk_draw_rgb_image() trên một diện tích vẽ gtk: về cơ bản làm việc, nhưng render quá chậm rằng các quá trình vẽ chồng chéo và các ứng dụng bị rơi sau vài khung hình đầu tiên, ngay cả ở tốc độ chụp 1 fps.

  • phân bổ một GdkPixbuf cho mỗi khung mới và gọi gtk_image_set_from_pixbuf() trên một widget ảnh gtk: chỉ hiển thị frame đầu tiên, sau đó tôi thấy không có sự thay đổi trong cửa sổ. Có thể là một lỗi trong mã của tôi, nhưng không biết nếu nó sẽ đủ nhanh.

  • sử dụng Cairo (cairo_set_source_surface(), sau đó cairo_paint()): có vẻ khá nhanh, nhưng hình ảnh trông có vẻ sọc, không biết nếu định dạng hình ảnh tương thích.

Hiện tại tôi đang nghĩ về việc thử một thứ gì đó như gstreamer và xử lý những hình ảnh đó như luồng video, nhưng tôi không chắc liệu đây có phải là quá mức cần thiết cho cơ chế đơn giản của tôi hay không.

Cảm ơn trước vì lời khuyên nào!

+0

Cairo xác định pixel bề mặt hình ảnh CAIRO_FORMAT_RGB24 của nó theo 32 bit, do đó trong bộ nhớ trên một máy cuối nhỏ, pixel sẽ là BGR0BGR0, có thể bạn đang sử dụng ngược lại hoặc không đặt trong 0 byte, do đó tước. – ergosys

+0

@lynix Tôi cần viết mã giống nhau. Bạn có thể chia sẻ cách cairo để nhận nguồn cấp dữ liệu webcam không? – inckka

+0

@inckka: Đã 4 năm kể từ đó, và câu hỏi của bạn quá chung chung đối với bất kỳ ai để cung cấp cho bạn câu trả lời chính xác. Vấn đề cụ thể của tôi đã được giải quyết [theo cách này] (http://pastebin.com/QMCgaaUT). – lynix

Trả lời

4

Toàn bộ API GdkRGB dường như không được chấp nhận, vì vậy, đó có thể không phải là cách được khuyến nghị để giải quyết vấn đề này.

Điều tương tự cũng xảy ra đối với cuộc gọi đến render a pixbuf. Các tài liệu có điểm tại Cairo, do đó, giải pháp có vẻ là để tiếp tục điều tra lý do tại sao hình ảnh của bạn trông không chính xác khi được trả lại bởi Cairo.

+0

Cảm ơn, điều này giải thích lý do tại sao tôi không thể tìm thấy bất kỳ hướng dẫn đầy đủ cho công cụ GdkRGB. Tôi sẽ đi với cairo ngay bây giờ, chỉ cần tự hỏi nếu nó là đủ nhanh cho 50 fps – lynix

1

thư giãn là đúng, cairo là con đường để đi nếu bạn muốn một cái gì đó sẽ làm việc trong GTK2 và GTK3. Vì các mẫu của bạn là RGB không có alpha, bạn nên sử dụng định dạng CAIRO_FORMAT_RGB24. Đảm bảo bề mặt bạn vẽ ở định dạng đó. Cũng cố gắng đảm bảo rằng bạn không liên tục phân bổ/phá hủy bộ đệm bề mặt nếu hình ảnh đầu vào giữ cùng kích thước.

+0

Cảm ơn, tôi đã bắt đầu thực hiện với cairo. – lynix

+0

Vì tôi mới làm quen với stackoverflow, tôi có nên đặt câu hỏi về cách giải quyết một vấn đề mà tôi gặp phải khi cairo ở đây hoặc trong một chủ đề mới không? :) – lynix

+0

@lynix Nếu bạn có câu hỏi mới, hãy đăng câu hỏi mới. Stack Overflow dựa trên * câu hỏi *, không phải là "chủ đề". Nó không phải là một diễn đàn thảo luận. – unwind

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