程序简介:
主要使用Qt中的QMediaPlayer结合OPencv中的VideoCapture类,制作一个视频截图小工具;包含视频的播放、暂停、音量控制、播放进度显示,视频总帧数的显示,手动输入指定帧间隔进行视频帧截取,手动输入要保存的帧图片前缀,而后进行帧抽取并在界面右下侧的QTextBrowser中显示抽帧保存的进度;在未导入视频和opencv读取视频失败时,右下方的QTextBrowser中将显示相应的提示信息,主界面展示;
未导入视频时点击播放或开始截图显示 信息
以100帧为间隔截图后的图片显示
程序组织
主界面主要在UI设计器中完成,风格图标存在资源文件中,采用qss文件加载;
截图部分槽函数代码:
void CapVideoWidget::on_startCapBtn_clicked()
{
if (openVideoName.isEmpty()) {
ui->textBrowser->textCursor().insertText(QString("请检查视频是否已导入!!!") + "\n");
return;
}
int frameSpace = 0;
ui->frameSpaceEdit->text().isEmpty() ? frameSpace = DEFAULE_CUT_SPACE : frameSpace = spaceNum.toInt();
QByteArray opencvName=openVideoName.toLatin1();
const char *openName=opencvName.data();
capVideoPic.open(openName);
if (capVideoPic.isOpened()) {
QString allPath = saveDirPath;
for (int i = 0; i < realFrameNum; ++i) {
cv::Mat perFrame;
capVideoPic>>perFrame;
if (i % frameSpace == 0) {
QString tempSuffixStr = suffixStr + QString("%1").arg(i, 5, 10, QLatin1Char('0'));
allPath = saveDirPath + tempSuffixStr + ".jpg";
QByteArray finalSaveName = allPath.toLatin1();
const char *cStyleName = finalSaveName.data();
cv::imwrite(cStyleName, perFrame) ? ui->textBrowser->textCursor().insertText(allPath + "\n") :
ui->textBrowser->textCursor().insertText(QString("Opencv保存图片异常!!!") + "\n");
allPath = "";
}
}
ui->textBrowser->textCursor().insertText(QString("保存完成") + "\n");
}
}
:完整资源加源码链接
https://download.csdn.net/download/qq_44896246/86806883
小白一枚,开始学习不久,代码能力不足之处,盼望各位大佬多多指点哈!