2012-06-14 11 views
7

Zajmuję się przetwarzaniem głębi (Xbox Kinect, Asus Xtion, itp.) Przy użyciu OpenNI.C# szybkie renderowanie pikseli

Potrzebuję bardzo prosty i szybki sposób rysowania na formularzu systemu Windows, gdy nowe dane głębokości są dostępne z czujnika (30 lub 60 fps w zależności od rozdzielczości).

Obecnie unieważniam podwójnie buforowany panel z oddzielnego wątku, gdy dane staną się dostępne, a następnie ustawiam piksele mapy bitowej w metodzie malowania panelu, uzyskując przewidywalnie straszne 5 klatek na sekundę.

System.Drawing.Graphics wydaje się brakować szybkiego sposobu ustawiania poszczególnych pikseli, chyba że ktoś może polecić inaczej.

Dosłownie wystarczy ustawić kolory pikseli, więc jeśli to możliwe, należy unikać zewnętrznych interfejsów renderowania innych firm i najlepiej użyć czegoś tak natywnego, jak to tylko możliwe.

Czy ktoś ma jakieś sugestie?

+0

Jak obecnie ustawiasz piksele? – leppie

+0

Utworzono bitmapę, używając image.SetPixel (x, y, color). Po tym wszystkim, wywołanie graphics.drawImage (obraz, itp.) –

+2

'SetPixel' jest bardzo wolny. Spójrz na podejście 'Scanline'. – leppie

Odpowiedz

4

Jeśli używasz bitmap, to powinieneś używać blokad i odblokowań, aby uzyskać dostęp do danych bezpośrednio w pamięci. W języku C# można uzyskać dodatkową wydajność, używając niebezpiecznych bloków kodu i wskaźników.

Zobacz ten link aby uzyskać więcej informacji: http://web.archive.org/web/20150227183132/http://bobpowell.net/lockingbits.aspx

+0

To była drastyczna poprawa. Nie mogłem uzyskać więcej niż 10 klatek na sekundę podczas rysowania pustej mapy bitowej 640x480, więc wniosek jest taki, że System.Drawing zasadniczo nie jest szybki. To rozwiązanie, w połączeniu ze skalowaniem obrazu i renderowaniem tylko niektórych pikseli w celu uzyskania wymaganego FPS, było odpowiedzią. –

4

image.SetPixel() jest bardzo powolny, gdy zastępujesz wiele pikseli na klatkę i potrzebujesz wielu klatek na sekundę.

To będzie dużo szybciej podczas korzystania z WriteableBitmap i nazywają CopyPixels

ten sposób można wypełnić tablicę z danych pikseli przy użyciu wielu wątków i po prostu Blit tablicę do obrazu w jednym połączeniu.

EDIT

Zauważ, że WriteableBitmap jest klasą WPF. Jeśli jesteś związany z WinForms, być może musisz stworzyć własną implementację. WPF/WinForms/GDI interop: converting a WriteableBitmap to a System.Drawing.Image?

+0

Dziękujemy za odpowiedź, ale podany link odpowiedzi używa metody .SetPixel() w konwersji z WriteableBitmap na System.Drawing.Image. –

+0

Tak, i to jest okropne z powodu prędkości. Alternatywą byłoby napisanie do tablicy i użycie enkodera (PNG, BMP, ...), aby przekształcić go w obraz i wyświetlić. Głównym problemem z SetPixel jest to, że ustawia pojedynczy piksel. –

0

Można spróbować mój LINQ image processing library pracować z „buforem bitmap”. Używa bardzo przystępnej składni, ale jest bardzo wydajna w przypadku dużych bitmap. Jest dostępny pod numerem Nuget, ponieważ pojedynczy plik znajduje się w projekcie.

Nadzieję, że pomaga!