我一直在尝试使用OpenCV来运行我的应用程序一段时间,而我似乎无法解决的一个长期错误是:
问题:
OpenCV的VideoCapture在将视频分为不同文件格式和编解码器的帧中不一致。
详细信息:
我的错误出现在应用程序的一部分中:将视频分成帧。当我为VideoCapture选择有效目录并打开它时,存在三种当前方案。要么:
打开并完美运行。
能够打开VideoCapture(cap.isOpened()= true),但是在帧拆分期间会收到一两个空帧,这会导致应用抛出错误。
完全不打开。
给定的视频只会做这三件事之一。但是,AVI文件格式似乎存在大多数错误。
已尝试解决:
完整安装K-Lite编解码器包
在项目目录和PATH中放入OpenCV_FFMPEG.dll和OpenCV_FFMPEG_64.dll
我唯一能想到的解释是这与我安装OpenCV和FFmpeg的方式有关。
任何帮助将不胜感激!谢谢。
顺便说一句,我正在运行Qt 5.8.0和OpenCV 3.2.0,这是我的FrameSplit代码。
vector<int> mainFrame::frameSplit(string filename, string location)
{
//Extract + Save Frames
string vidDir = filename;
string locationDir = location + "/frames/";
VideoCapture cap(vidDir);
if (!cap.isOpened())
{
qDebug() << "OO";
return {};
}
else
{
Mat firstFrame;
Mat nextFrame;
Mat frame;
int count = 1;
QProgressDialog progress("Extracting files...", "Abort", 0, cap.get(CV_CAP_PROP_FRAME_COUNT));
progress.setWindowModality(Qt::WindowModal);
progress.setAttribute(Qt::WA_DeleteOnClose, true);
progress.setFixedSize(500, 100);
progress.show();
vector<int> compression_params;
compression_params.push_back(CV_IMWRITE_JPEG_QUALITY);
compression_params.push_back(100);
qDebug() << cap.get(CV_CAP_PROP_FRAME_COUNT);
bool failure = false;
for (count = 1; count < cap.get(CV_CAP_PROP_FRAME_COUNT); count++)
{
cap >> frame;
if(frame.empty()) {
QMessageBox messageBox;
messageBox.critical(this, "Error", "There was an error in analyzing the video. Please try and install the appropriate codecs and try again.");
messageBox.setFixedSize(600,400);
vector<int> empty;
return empty;
}
string filePath = locationDir + to_string(count) + ".jpg";
imwrite(filePath,frame,compression_params);
progress.setValue(count);
}
progress.setValue(count);
progress.close();
vector<int> props;
props.push_back(cap.get(CV_CAP_PROP_FRAME_COUNT));
props.push_back(round(cap.get(CV_CAP_PROP_FPS)));
props.push_back(cap.get(CV_CAP_PROP_FRAME_WIDTH));
props.push_back(cap.get(CV_CAP_PROP_FRAME_HEIGHT));
qDebug() << props[0];
return props;
}
}