Подтвердить что ты не робот

Как обрабатывать изображения видео, кадр за кадром в потоковой передаче видео с помощью Opencv python

Я новичок в OpenCV. Я хочу сделать некоторую обработку изображения в кадрах видео, которое загружается на мой сервер. Я просто хочу прочитать доступные кадры и записать их в каталог. И дождитесь загрузки другой части видео и записи кадров в каталог. И я должен ждать, пока каждый кадр будет полностью загружен, а затем напишет его в файл.

Можете ли вы рассказать мне, как я могу это сделать с помощью OpenCV (Python)?

Изменить 1: Я написал этот код для захвата видео из файла, в то время как новые данные добавляются в конце файла. Другими словами, файл out.mp4 не является полным видео, а другая программа записывает на него новые кадры. Я собираюсь сделать это, ожидая, что другая программа будет писать новые кадры, затем прочитает их и покажет.

Вот мой код:

import cv2
cap = cv2.VideoCapture("./out.mp4")

while True:
    if cap.grab():
        flag, frame = cap.retrieve()
        if not flag:
            continue
        else:
            cv2.imshow('video', frame)
    if cv2.waitKey(10) == 27:
        break

Таким образом, проблема заключается в вызове cap.grab()! когда нет рамки, он вернет False! И он больше не будет захватывать кадры, даже если я жду долгое время.

4b9b3361

Ответ 1

Прочитав документацию VideoCapture. Я понял, что вы можете сказать VideoCapture, какой кадр обрабатывать в следующий раз, когда мы вызываем VideoCapture.read() (или VideoCapture.grab()).

Проблема заключается в том, что если вы хотите read() фрейм, который не готов, объект VideoCapture застревает в этом фрейме и никогда не будет продолжен. Поэтому вы должны заставить его начать снова с предыдущего кадра.

Вот код

import cv2

cap = cv2.VideoCapture("./out.mp4")
while not cap.isOpened():
    cap = cv2.VideoCapture("./out.mp4")
    cv2.waitKey(1000)
    print "Wait for the header"

pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)
while True:
    flag, frame = cap.read()
    if flag:
        # The frame is ready and already captured
        cv2.imshow('video', frame)
        pos_frame = cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES)
        print str(pos_frame)+" frames"
    else:
        # The next frame is not ready, so we try to read it again
        cap.set(cv2.cv.CV_CAP_PROP_POS_FRAMES, pos_frame-1)
        print "frame is not ready"
        # It is better to wait for a while for the next frame to be ready
        cv2.waitKey(1000)

    if cv2.waitKey(10) == 27:
        break
    if cap.get(cv2.cv.CV_CAP_PROP_POS_FRAMES) == cap.get(cv2.cv.CV_CAP_PROP_FRAME_COUNT):
        # If the number of captured frames is equal to the total number of frames,
        # we stop
        break

Ответ 2

используйте это -

import cv2
cap = cv2.VideoCapture('path of video file')
count = 0
while cap.isOpened():
    ret,frame = cap.read()
    cv2.imshow('window-name',frame)
    cv2.imwrite("frame%d.jpg" % count, frame)
    count = count + 1
    if cv2.waitKey(10) & 0xFF == ord('q'):
        break


cap.release()
cap.destroyAllWindows()

Ответ 3

В документации openCV есть пример для получения видео по кадру. Это написано на языке С++, но очень просто перенести пример на python - вы можете искать каждую документацию о фумутации, чтобы увидеть, как их называть в python.

#include "opencv2/opencv.hpp"

using namespace cv;

int main(int, char**)
{
    VideoCapture cap(0); // open the default camera
    if(!cap.isOpened())  // check if we succeeded
        return -1;

    Mat edges;
    namedWindow("edges",1);
    for(;;)
    {
        Mat frame;
        cap >> frame; // get a new frame from camera
        cvtColor(frame, edges, CV_BGR2GRAY);
        GaussianBlur(edges, edges, Size(7,7), 1.5, 1.5);
        Canny(edges, edges, 0, 30, 3);
        imshow("edges", edges);
        if(waitKey(30) >= 0) break;
    }
    // the camera will be deinitialized automatically in VideoCapture destructor
    return 0;
}

Ответ 4

В соответствии с последними обновлениями для OpenCV 3.0 и выше вам нужно изменить Идентификаторы свойств, как указано в коде Мехрана:

cv2.cv.CV_CAP_PROP_POS_FRAMES

to

cv2.CAP_PROP_POS_FRAMES

и то же самое относится к cv2.CAP_PROP_POS_FRAME_COUNT.

Надеюсь, что это поможет.

Ответ 5

Вот как я начал бы это решать:

[1] zenpoy уже указал в правильном направлении. Вам просто нужно знать, что вы можете получать изображения с веб-камеры или файла: -)

Надеюсь, я правильно понял требования.

Ответ 6

Единственное решение, которое я нашел, - это не устанавливать индекс в предыдущий кадр и ждать (тогда OpenCV перестает читать кадры, так или иначе), но для инициализации захвата еще раз. Итак, это выглядит так:

cap = cv2.VideoCapture(camera_url)
while True:
    ret, frame = cap.read()

    if not ret:
        cap = cv.VideoCapture(camera_url)
        continue

    # do your processing here

И он отлично работает!