Так что для школьного проекта я пытаюсь использовать 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.