Mam konfigurację w Pythonie, gdzie używam biblioteki OpenCV do odczytywania ramek wideo w postaci tablic 2D - te filmy są w skali szarości, więc jestem przy użyciu niepodpisanych 8-bitowych liczb całkowitych dla wartości pikseli.Wyświetlam tablicę 2D z OpenCV w Matplotlib.pyplot.imshow()
W następnym kroku próbuję użyć pyplot.imshow()
z matplotlib, aby wyświetlić ramkę wideo. Niestety, dostaję coś, co nie ma żadnego sensu.
Oto kod do zapoznania się z filmem:
import numpy as np
import cv
def read_video(filename):
video = cv.CaptureFromFile('%s' % filename)
num_frames = int(cv.GetCaptureProperty(video, cv.CV_CAP_PROP_FRAME_COUNT))
frames = []
for i in range(0, num_frames):
frame = cv.QueryFrame(video)
if frame is None:
quit('Failed to extract frame %s of %s!' % (i, num_frames))
toadd = cv2numpy(frame, 'uint8')
frames.append(np.array(toadd))
return np.array(frames)
cv2numpy
jest funkcją narzędzie, które konwertuje tablicę OpenCV do numpy tablicy (tylko wywołania fromstring
a następnie reshape
). Oto kod używam do działki pierwsza klatka filmu:
import matplotlib.pyplot as plot
import matplotlib.cm as cm
frames = read_video('video.avi')
plot.imshow(frames[0], cmap = cm.gray)
plot.show()
w jakiś inny kod, użyłem OpenCV SaveImage
na jednej klatce, aby zapewnić odniesienie do tego, co można oczekiwać od imshow
. Here's the image I get from the former i here's the image I get from the code above.
Jak widać są one zupełnie inne. Jedyną rzeczą, jaką mogę zebrać z rzeczywistego obrazu, jest pasmowanie: wygląda prawie tak, jakby miało błędne wymiary, że jest więcej pikseli na szerokości niż na wysokości (ten obrazek ma być 128 x 256). Ale próbowałem transponować tablicę przed jej wykreśleniem, zmieniając parametry extent
i aspect
, jak na imshow documentation iz wyjątkiem dziwacznego rozciągania pikseli, nie znalazłem poprawki.
Jakieś myśli?
EDIT 1: I postać może to być rozsądne, aby dodać kod cv2numpy
, w przypadku, przekształcanie się jakoś muddling rzeczy (od mojego „prawda” obrazek powyżej nie używa tego kodu i stąd cv2numpy
zaangażowany jest tylko w wątpliwy rurociąg).
def cv2numpy(cvarr, the_type):
a = np.fromstring(
cvarr.tostring(),
dtype = the_type,
count = cvarr.width * cvarr.height)
a.shape = (cvarr.height, cvarr.width)
return a
To był dokładnie problem. OpenCV wciąż czytał wideo jako RGB, więc dodałem je w "cv.CreateImage" i "cv.CvtColor", wydrukowałem obraz i wygląda dokładnie tak, jak oczekiwałem. Dzięki wielkie! Najwyraźniej konwersja macierzy OpenCV na numpy tablic za pomocą łańcuchów jest suboptymalna. – Magsol