2011-08-12 7 views
6

Powinno to być komentarz do this thread, ale najwyraźniej jest zamknięty, więc tutaj jest. Z powodzeniem radzę sobie z matplotlib i numpy oraz mencoder, jak to sugerowano tutaj. Od tego czasu adoptowałem Voki Codder buffer to stdin solution, co znacznie przyspiesza cały proces. Chodzi o to, że nie mogłem znaleźć żadnej dokumentacji w części -format = "bgra" polecenia. Oznacza to, że bajty są od prawej do lewej niebiesko-zielonej czerwonej alfa, po prawej. Czy muszą to być uint32 lub coś innego. Problem polega na tym, że kreślę mapy kolorów, więc próbuję przekonwertować je na skalę szarości, ale dostaję mnóstwo dziwnych wzorców, które każą mi mocno wierzyć, że robię coś złego. Napisałem tę funkcję, aby przekonwertować z float na uint32 w zakresie. Ale rezultatem tego nie jest, dlaczego się spodziewałem, czy robię coś okropnie głupiego?Wypisywanie bezpośrednio do filmu z numpy i mencoderem

def grayscale(x, min, max): 
    return np.uint32((x-min)/(max-min)*0xffffff) 

Odpowiedz

5

Myślę, że jesteś coraz mylić na co uint32 reprezentuje. To 4 pasma liczb całkowitych uint8.

Jeśli masz dane zmiennoprzecinkowe i chcesz je reprezentować w skali szarości, nie chcesz przeskalować go do pełnego zakresu 32-bitowego, chcesz go przeskalować do zakresu 8-bitowego i powtórzyć dla czerwone, zielone i niebieskie pasy (a następnie przypuszczalnie umieścić w stałym paśmie alfa).

Można również użyć innego bajtu. Y8 to tylko jedna skala szarości, 8-bitowe pasmo, a Y16 to pojedyncze, 16-bitowe pasmo 16-bitowe. (Zobacz na wyjściu mencoder -rawvideo format=help do pełnej (choć nieco mylące) aukcji.)

Żeby zilustrować za pomocą NumPy na widok 32-bitową liczbę całkowitą jako cztery zespoły 8-bitowych liczb całkowitych:

import numpy as np 
height, width = 20,20 

# Make an array with 4 bands of uint8 integers 
image = np.zeros((height, width, 4), dtype=np.uint8) 

# Filling a single band (red) 
b,g,r,a = image.T 
r.fill(255) 

# Fill the image with yellow and leave alpha alone 
image[...,:3] = (255, 255, 0) 

# Then when we want to view it as a single, 32-bit band: 
image32bit = image.reshape(-1).view(np.uint32).reshape(height, width) 
# (Note that this is a view. In other words, we could change "b" above 
# and it would change "image32bit") 

W twoim przypadku, jednak, prawdopodobnie chcesz zrobić coś więcej tak:

import numpy as np 
from videosink import VideoSink 

height, width = 20,20 
numframes = 1000 
data = np.random.random((height, width, numframes)) 

# Rescale your data into 0-255, 8-bit integers 
# (This could be done in-place if you need to conserve memory) 
d ata_rescaled = 255.0/(data.max() - data.min()) * (data - data.min()) 
data_rescaled = data_rescaled.astype(np.uint8) 

# The key here is the "Y8" format. It's 8-bit grayscale. 
video = VideoSink((height,width), "test", rate=20, byteorder="Y8") 

# Iterate over last axis 
for frame in data.T: 
    video.run(frame.T) 
video.close() 
+0

cool, więc najlepiej byłoby zrobić coś takiego def skali szarości (x, min, max): t = INT_MAX * (x-min)/(max-min) return np.uint8 (t) * 0x1 + np.uint8 (t) * 0x100 + np.uint8 (x) * 0x10000 + 0x0f000000, gdzie int_max woul d być maksymalną wartością 8-bitowych znaków. –

+0

@Alex - Zobacz zmiany. Mam nadzieję, że to trochę wyjaśnia! –

+0

Świetne rzeczy Joe, teraz testuję, ale myślę, że mam go teraz, bajt prawdopodobnie wykona lewę! Dzięki za tonę! Alex. –

Powiązane problemy