2014-04-03 43 views
9

Tworzę program w OpenCV (2.4.8), który powinien odczytywać pliki wideo i wykonywać na nich obliczenia. Do tych obliczeń nie potrzebuję ramek o wysokiej rozdzielczości, mam całkowitą rozdzielczość 640 * 360.Zmiana rozdzielczości pliku wideo OpenCV

W pierwszych testach miałem kamera przymocowana i użyłem:

VideoCapture cap(0); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 360); 
Mat image; 
cap.read(image); 
namedWindow("firstframe", 1); 
imshow("firstframe", image); 
waitKey(0); 

Które przeskalowany obraz idealnie. Teraz przechodzę do następnego etapu, w którym chcę użyć mojego programu do zapisanego wideo zamiast na żywo (którego użyłem do testowania). Kiedy zmieniam "0" ze ścieżką pliku źródłowego (ciąg), plik jest ładowany, ale rozdzielczość pozostaje 1920 * 1080.

Czy zrobiłem coś złego? Czy istnieje sposób na załadowanie wideo w niższej rozdzielczości "w locie"?

Przeczytałem dokumentację OpenCV. Niektóre ustawienia są oznaczone jako "tylko kamery", ale to ustawienie nie jest: http://docs.opencv.org/modules/highgui/doc/reading_and_writing_images_and_video.html#videocapture-videocapture

Używam OpenCV na Macu i zainstalowałem go z MacPorts.

Daj mi znać, jeśli potrzebujesz więcej informacji.

naprzód Dzięki za pomoc

edit: zdałem sobie sprawę, że (...) Działa cap.set zwraca wartość logiczną, więc próbowałem ich drukowania i oboje zwracają 0 To oczywiście potwierdza, że ​​ramka nie jest zmieniana. Nadal nie ma pojęcia, dlaczego ...

edit 2: Więc teraz, za rozwiązanie tymczasowe używam następujący wiersz po read (obrazu):

resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC); 

I to działa. Ale domyślam się, że to nie jest najbardziej optymalne rozwiązanie.

+0

jeśli masz kamerę internetową, możesz ustawić rozdzielczość pozyskanych obrazów, ale po załadowaniu filmu wideo jest tam zakodowana rozdzielczość. Jedynym sposobem, jaki widzę, jest zmiana rozmiaru obrazu, tak jak ty. –

+0

Dzięki, myślałem o tym samym. Zmiana rozdzielczości jest prawdopodobnie dokonywana bezpośrednio w sprzęcie na kamerach internetowych. Domyślam się, że ffmpeg zmieniałby rozmiar w locie z włączoną opcją. Ale potem znowu, to powinno być takie samo obliczenie jak moje oświadczenie o zmianie rozmiaru. – user3319803

Odpowiedz

8

użyciu

resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC); 

po read (obrazek) wydaje się być najlepszym rozwiązaniem, aby rozwiązać ten problem. Więc całkowita (test) kod staje:

VideoCapture cap("path/to/file"); 
cap.set(CV_CAP_PROP_FRAME_WIDTH, 640); 
cap.set(CV_CAP_PROP_FRAME_HEIGHT, 360); 
Mat image; 
cap.read(image); 
resize(image, image, Size(640, 360), 0, 0, INTER_CUBIC); 
namedWindow("firstframe", 1); 
imshow("firstframe", image); 
waitKey(0); 

Jeśli ktoś zna lepszy sposób, proszę dać mi znać.