Не удалось записать видео с OpenCV, но ошибки не выдаются - PullRequest
0 голосов
/ 14 ноября 2011

Я хотел написать видео файл, используя OpenCV (C ++).Глядя на документы, это казалось очень простым.Однако, когда я пытался сделать это в моей программе (работающей в Windows 7), я не смог этого сделать.

При поиске в Интернете потенциальных проблем не смог найти пример, в котором использовался 2.x OpenCVинтерфейс или что-то, что относится к моей проблеме.

Сначала вот код:

cv::VideoCapture cap("C:\\Users\\Me\\Video\\test.mov");

cv::VideoWriter writer("C:\\Users\\Me\\Video\\test_result.mov",
                           cap.get(CV_CAP_PROP_FOURCC),
                           cap.get(CV_CAP_PROP_FPS),
                           cv::Size((int)cap.get(CV_CAP_PROP_FRAME_HEIGHT), (int)cap.get(CV_CAP_PROP_FRAME_WIDTH)));

while(cap.grab()) {
   cv::Mat img;
   cap.retrieve(img);

   // process img

   writer << img;
}

Не выдается сообщение об ошибке, но видеофайл не создается.Хуже того, на консоли появляется следующее сообщение:

Output #0, mov, to 'C:\Users\Me\Video\teste_result.mov':
Stream #0.0: Video: [0][0][0][0] / 0x0000, yuv420p, 480x720, q=2-31, 22118 kb/s, 90k tbn, 15 tbc

Разве это не значит, что видеофайл создан?Где еще я могу найти возможную ошибку?

РЕДАКТИРОВАТЬ:

При использовании кода выше, я также проверяю, объекты VideoCapture и VideoWriter с методом isOpened, который идет нормально.*

Ответы [ 2 ]

1 голос
/ 14 ноября 2011

Вы пытались вручную настроить поля FOURCC, FPS и размер кадра?

Примерно так:

cv::VideoWriter writer("C:\\Users\\Me\\Video\\test_result.mov",
                       CV_FOURCC('M','J','P','G'),
                       30,
                       Size(720, 480),
                       true);

Это что-нибудь выводит? Иногда get(CV_*) не возвращает действительные данные. Возможно, вы захотите убедиться, что они возвращают правильную информацию.

EDIT: Кроме того, я только что заметил, что вы создаете объект размера с кортежом (высота, ширина). Вы должны поменять это на (ширина, высота), так как это ожидаемый порядок для конструктора CvSize .

0 голосов
/ 14 ноября 2011

Не выдается сообщение об ошибке , но вы также не проверяете успешность VideoCapture и VideoWriter :

cv::VideoCapture cap("C:\\Users\\Me\\Video\\test.mov");
if (!cap.isOpened())  // check if we succeeded
{
    // print error message
}


cv::VideoWriter writer("C:\\Users\\Me\\Video\\test_result.mov",
                           cap.get(CV_CAP_PROP_FOURCC),
                           cap.get(CV_CAP_PROP_FPS),
                           cv::Size((int)cap.get(CV_CAP_PROP_FRAME_HEIGHT), (int)cap.get(CV_CAP_PROP_FRAME_WIDTH)));

if (!writer.isOpened())  // check if we succeeded
{
    // print error message
}

Выполните эти проверки, и у вас будет больше информации о том, что не работает и почему.

...