Więc skorzystałem z tego samouczka, ale wydaje się, że nic nie robi. Po prostu nic. Czeka kilka sekund i zamyka program. Co jest nie tak z tym kodem?
import cv2
vidcap = cv2.VideoCapture('Compton.mp4')
success,image = vidcap.read()
count = 0
success = True
while success:
success,image = vidcap.read()
cv2.imwrite("frame%d.jpg" % count, image) # save frame as JPEG file
if cv2.waitKey(10) == 27: # exit if Escape is hit
break
count += 1
Również w komentarzach jest napisane, że ogranicza to ramki do 1000? Czemu?
EDYCJA: próbowałem zrobić success = True
najpierw, ale to nie pomogło. Utworzył tylko jeden obraz, który miał 0 bajtów.
python
python-2.7
opencv
GShocked
źródło
źródło
success
?True
alboFalse
?print success
gdzieś.success
; jeśli jest fałszywa, oznacza to, że odczyt wideo z jakiegoś powodu nie powiódł się. Najpierw musisz uruchomić ten kawałek.brew install opencv --python27 --ffmpeg
jeśli używasz innej wersji Pythona, będziesz musiał zmienić ją na swoją wersję.Odpowiedzi:
Od tutaj pobrać ten film, więc mamy ten sam plik wideo do testu. Upewnij się, że ten plik mp4 znajduje się w tym samym katalogu, w którym znajduje się kod Pythona. Następnie upewnij się, że interpreter języka Python jest uruchamiany z tego samego katalogu.
Następnie zmodyfikuj kod, porzuć
waitKey
marnowanie czasu również bez okna nie może przechwytywać zdarzeń klawiatury. Drukujemy równieżsuccess
wartość, aby upewnić się, że pomyślnie odczytuje ramki.Jak to idzie?
źródło
Read a new frame: False
Aby rozszerzyć to pytanie (i odpowiedź autorstwa @ user2700065) dla nieco innych przypadków, jeśli ktoś nie chce wyodrębniać każdej klatki, ale chce wyodrębniać klatkę co jedną sekundę. Tak więc 1-minutowy film da 60 klatek (obrazów).
źródło
opencv-2.4.9
, więc zamiastcv2.CAP_PROP_POS_MSEC
musiałem użyćcv2.cv.CAP_PROP_POS_MSEC
count = count + 5
cv2.imwrite()
na początku pętli, skoro dzwoniłeścv2.imread()
przed pętlą?To jest poprawka z poprzedniej odpowiedzi dla Pythona 3.x z @GShocked, opublikowałbym to w komentarzu, ale nie mam wystarczającej reputacji
źródło
Jest to funkcja, która konwertuje większość formatów wideo na liczbę klatek w filmie. Działa
Python3
zOpenCV 3+
Obsługuje
.mts
i normalne pliki, takie jak.mp4
i.avi
. Wypróbowane i przetestowane na.mts
plikach. Działa jak marzenie.źródło
Po wielu badaniach nad konwersją klatek na wideo stworzyłem tę funkcję, mam nadzieję, że to pomoże. Do tego potrzebujemy opencv:
zmień wartość fps (klatki na sekundę), ścieżkę folderu wejściowego i ścieżkę folderu wyjściowego zgodnie z lokalnymi lokalizacjami
źródło
Poprzednie odpowiedzi straciły pierwszą klatkę. I fajnie będzie przechowywać obrazy w folderze.
Nawiasem mówiąc, możesz sprawdzić współczynnik klatek e przez VLC. Przejdź do windows -> informacje o multimediach -> szczegóły kodeka
źródło
cv.CAP_PROP_POS_AVI_RATIO
, ale nie wiem jak. tnxTen kod wyodrębnia klatki z wideo i zapisuje klatki w formacie .jpg
źródło
Używam Pythona za pośrednictwem oprogramowania Spyder firmy Anaconda. Używając oryginalnego kodu podanego w pytaniu tego wątku przez @Gshocked, kod nie działa (python nie odczyta pliku mp4). Pobrałem więc OpenCV 3.2 i skopiowałem „opencv_ffmpeg320.dll” i „opencv_ffmpeg320_64.dll” z folderu „bin”. Wklejałem oba te pliki dll do folderu „Dlls” Anacondy.
Anaconda ma również folder „pckgs”… Skopiowałem i wkleiłem cały pobrany folder „OpenCV 3.2” do folderu „pckgs” programu Anaconda.
Wreszcie Anaconda ma folder „Library”, który ma podfolder „bin”. Wklejałem pliki „opencv_ffmpeg320.dll” i „opencv_ffmpeg320_64.dll” do tego folderu.
Po zamknięciu i ponownym uruchomieniu Spydera kod działał. Nie jestem pewien, która z trzech metod zadziałała, i jestem zbyt leniwy, żeby wrócić i to rozgryźć. Ale to działa, na zdrowie!
źródło
Ta funkcja wyodrębnia obrazy z wideo z 1 fps, DODATKOWO identyfikuje ostatnią klatkę i przestaje czytać:
źródło
Poniższy skrypt wyodrębni klatki co pół sekundy ze wszystkich filmów w folderze. (Działa na Pythonie 3.7)
źródło