OpenCV при попытке чтения или записи в видеофайл вызывает исключение VIDEOIO «Не удается найти начальный номер» (icvExtractPattern) - PullRequest
0 голосов
/ 27 октября 2019

Так что для школьного проекта я пытаюсь использовать cv::VideoCapture, чтобы открыть файл .avi, чтобы выполнить некоторую обработку изображения на нем. Кроме того, я пытаюсь записать видео с моей камеры (ноутбука) и сохранить его в файл out.avi. Оба раза я встречал более или менее одно и то же исключение. Я использую OpenCV 4.1.2 и CLion на Linux Mint.

Попытка использовать cv::VideoCapture vid(0); работает отлично, показывает вывод с камеры ноутбука. Однако при указании пути к открываемому видеофайлу я получаю следующую ошибку:

VIDIOC_REQBUFS: Inappropriate ioctl for device
[ERROR:0] global /home/aris/dev/opencv/modules/videoio/src/cap.cpp (116) open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.1.2-dev) /home/aris/dev/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): ../example_depth.avi in function 'icvExtractPattern'

При попытке создать объект cv::VideoWriter (для сохранения видеоизображения камеры в файл), используя:

cv::VideoWriter vidWrit("out.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, cv::Size(width, height), true);

Я сталкиваюсь с этой ошибкой:

[ERROR:0] global /home/aris/dev/opencv/modules/videoio/src/cap.cpp (392) open VIDEOIO(CV_IMAGES): raised OpenCV exception:

OpenCV(4.1.2-dev) /home/aris/dev/opencv/modules/videoio/src/cap_images.cpp:253: error: (-5:Bad argument) CAP_IMAGES: can't find starting number (in the name of file): out.avi in function 'icvExtractPattern'

Это похоже на другую.

Вот минимальный пример (обратите внимание, что программапо-прежнему показывает вывод камеры в task == "write"):

#include <opencv2/opencv.hpp>

int main ()
{
    std::string task = "write";
    if(task == "read") {    // Read from .avi file
        system("pwd");  // Print current path
        cv::VideoCapture vid("../example_depth.avi");   // Throws first exception "Inappropriate ioctl for device"

        int key = 0;
        cv::Mat frame;
        while (key != 27) {
            vid >> frame;
            if (frame.empty())
                break;

            cv::imshow("Video", frame);
            key = cv::waitKey(25);
        }
    } else if (task == "write") {   // Write Laptop video to file
        cv::VideoCapture vid(0);    // Video from camera

        int width = vid.get(cv::VideoCaptureProperties::CAP_PROP_FRAME_WIDTH);
        int height = vid.get(cv::VideoCaptureProperties::CAP_PROP_FRAME_HEIGHT);
        cv::VideoWriter vidWriter("out.avi", cv::VideoWriter::fourcc('M', 'J', 'P', 'G'), 10, cv::Size(width, height), true);   // Throws second exception

        int key = 0;
        cv::Mat frame;
        while (key != 27) {
            vid >> frame;
            if (frame.empty())
                break;
            vidWriter.write(frame);

            cv::imshow("Video", frame);
            key = cv::waitKey(25);
        }
    }
    return 0;
}

Я искал решение в течение двух дней. Возможно, мне не хватает какой-то библиотеки или OpenCV не был установлен правильно, я не знаю об этом (да, я пытался «перекомпилировать» OpenCV). Я использовал этот учебник, чтобы сделать все файлы OpenCV.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...