[笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV视频lO接口

简介: [笔记]OpenCV+FFmpeg+Qt实现视频编辑器之OpenCV视频lO接口

一、OpenCV VideoCapture打开摄像头接口讲解和源码分析

VideoCapture

可以打开数据源(文件/摄像机/rtsp流)

以下两种方案打开:

  • bool open ( int index )
  • VideoCapture cap(index)

bool open ( int index )

VideoCapture cap(index)

二、OpenCV VideoCapture打开视频流接口讲解和源码分析

三、VideoCapture release关闭和空间释放源码分析

四、OpenCV read读取一帧视频接口讲解和源码分析

五、使用OpenCV VideoCapture播放视频示例

isOpen判断打开失败原因

1.opencv_ffmpeg.dll 没有放入bin

2. 尚未得知

注意:我使用的opencv-3.4.1/3.4.16 版本 无法打开MP4 我换avi格式 isOpen就成功了,怀疑是x264.dll 以及相关没有导致不支持mp4

读取Frame(解码+转rgb)

Read()

VideoCapture video;
Mat frame;
video.read(frame)

流形式

VideoCapture video;
Mat frame;
video >> frame;

解码+转化颜色

if (!video.grab())
{
  break;
}
//转换颜色格式
if (!video.retrieve(frame))
{
  break;
}

解码和转化颜色分割开来,类似利于实现解码一个线程和渲染一个线程的道理

源码

int main(int argc, char *argv[])
{
  VideoCapture video;
  cv::String strPath = ".\\res\\test.avi";
  video.open(strPath);
  if (!video.isOpened())
  {
    cout << "open video failed!" << endl;
    getchar();
    return -1;
  }
  cout << "open video success!" << endl;
  namedWindow("video");
  Mat frame;
  for (;;)
  {
    //if (!video.read(frame))
    //{
    //  break;
    //}
    //读帧,解码
    if (!video.grab())
    {
      break;
    }
    //转换颜色格式
    if (!video.retrieve(frame))
    {
      break;
    }
    if (frame.empty()) break;
    imshow("video", frame);
    waitKey(30);
  }
  getchar();
  return 0;
}

六、获取视频和相机的属性并分析获取视频属性的源码

获取视频、相机属性

  • CAP_PROP_FPS帧率
  • CAP_PROP_FRAME_COUNT总帧数
  • CAP_PROP_POS_FRAMES 播放帧的位置
  • CAP_PROP_FRAME_WIDTH
  • CAP_PROP_FRAME_HEIGHT

源码

int main(int argc, char *argv[])
{
  VideoCapture video;
  video.open(".\\res\\test.avi");
  if (!video.isOpened())
  {
    cout << "open video failed!" << endl;
    getchar();
    return -1;
  }
  cout << "open video success!" << endl;
  namedWindow("video");
  Mat frame;
  int fps = video.get(CAP_PROP_FPS);
  int s = 30;
  if (fps != 0)
    s = 1000 / fps;
  cout << "fps is " << fps << endl;
  int fcount = video.get(CAP_PROP_FRAME_COUNT);
  cout << "total frame is " << fcount << endl;
  cout << "total sec is " << fcount / fps << endl;
  cout << "CAP_PROP_FRAME_WIDTH " << video.get(CAP_PROP_FRAME_WIDTH) << endl;
  cout << "CAP_PROP_FRAME_HEIGHT " << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
  s = s / 2;
  int f = 0;
  for (;;)
  {
    video.read(frame);
    if (frame.empty()) break;
    imshow("video", frame);
    waitKey(s);
  }
  getchar();
  return 0;
}

七、使用opencv实现视频播放位置跳转

建议:使用帧数进行跳转;使用毫秒数跳转,需要先转为帧数,再进行帧数跳转

获得当前帧号

  • CAP PROP POS FRAMES
video.get( CAP PROP POS FRAMES);

设置跳转帧

video.set( CAP PROP POS FRAMES,0);//跳到 第一帧

源码

int main(int argc, char *argv[])
{
  VideoCapture video;
  video.open(".\\res\\test.avi");
  if (!video.isOpened())
  {
    cout << "open video failed!" << endl;
    getchar();
    return -1;
  }
  cout << "open video success!" << endl;
  namedWindow("video");
  Mat frame;
  int fps = video.get(CAP_PROP_FPS);
  int s = 30;
  if (fps != 0)
    s = 1000 / fps;
  cout << "fps is " << fps << endl;
  int fcount = video.get(CAP_PROP_FRAME_COUNT);
  cout << "total frame is " << fcount << endl;
  cout << "total sec is " << fcount / fps << endl;
  cout << "CAP_PROP_FRAME_WIDTH " << video.get(CAP_PROP_FRAME_WIDTH) << endl;
  cout << "CAP_PROP_FRAME_HEIGHT " << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
  s = s / 2;
  int f = 0;
  for (;;)
  {
    video.read(frame);
    if (frame.empty()) break;
    int cur = video.get(CAP_PROP_POS_FRAMES);
    if (cur > 90)
    {
      video.set(CAP_PROP_POS_FRAMES, 0);
      continue;
    }
    imshow("video", frame);
    waitKey(s);
  }
  getchar();
  return 0;
}

八、通过VideoWrite的open创建视频文件并分析源码

VideoWriter

open

CV_WRAP virtual bool open(
  const String& filename, 
  int fourcc, 
  double fps,
  Size frameSize,
  bool isColor = true
);

create

static Ptr<IVideoWriter> create(
  const String& filename, 
  int fourcc, 
  double fps,
  Size frameSize, 
  bool isColor = true
);

fourcc格式

九、通过VideoWrite的write创建视频文件并分析源码

VideoWriter

write

CV_WRAP virtual void write(const Mat& image)

writeFrame

十、以h264格式录制并预览摄像机视频代码演示

摄像头打开失败的几个原因

openH264dll少了

openh264开源地址

源码

#include <opencv2/core.hpp>
#include <opencv2/imgcodecs.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main(int argc, char *argv[])
{
  VideoCapture cam(0);
  if (!cam.isOpened())
  {
    cout << "cam open failed!" << endl;
    getchar();
    return -1;
  }
  cout << "cam open success!" << endl;
  namedWindow("cam");
  Mat img;
  VideoWriter vw;
  int fps = cam.get(CAP_PROP_FPS);
  if (fps <= 0)fps = 25;
  vw.open("out.avi",
    VideoWriter::fourcc('X', '2', '6', '4'),
    fps,
    Size(cam.get(CAP_PROP_FRAME_WIDTH),
      cam.get(CAP_PROP_FRAME_HEIGHT))
    );
  if (!vw.isOpened())
  {
    cout << "VideoWriter open failed!" << endl;
    getchar();
    return -1;
  }
  cout << "VideoWriter open success!" << endl;
  for (;;)
  {
    cam.read(img);
    if (img.empty())break;
    imshow("cam", img);
    vw.write(img);
    if (waitKey(5) == 'q') break;
  }
  waitKey(0);
  return 0;
}

十一、使用ffmpeg工具实现音频抽取、剪切和与视频

使用ffmpeg工具抽取音频

ffmpeg.exe -i 1.avi -vn 1.mp3

-i表示源

-vn表示不转换视频

使用ffmpeg剪切音频

ffmpeg -ss 0:0:30 -t 0:0:20 -i input.mp -c copy output.mp

使用ffmpeg工具音视频合并

ffmpeg.exe -i 1.mp3 -i 1.mp4 -c copyout.mp

=========================================

要源码的请私密


相关文章
|
5月前
|
算法 计算机视觉
基于qt的opencv实时图像处理框架FastCvLearn实战
本文介绍了一个基于Qt的OpenCV实时图像处理框架FastCvLearn,通过手撕代码的方式详细讲解了如何实现实时人脸马赛克等功能,并提供了结果展示和基础知识回顾。
207 7
|
5月前
|
文字识别 计算机视觉 开发者
基于QT的OCR和opencv融合框架FastOCRLearn实战
本文介绍了在Qt环境下结合OpenCV库构建OCR识别系统的实战方法,通过FastOCRLearn项目,读者可以学习Tesseract OCR的编译配置和在Windows平台下的实践步骤,文章提供了技术资源链接,帮助开发者理解并实现OCR技术。
252 9
基于QT的OCR和opencv融合框架FastOCRLearn实战
|
4月前
|
并行计算 PyTorch TensorFlow
Ubuntu安装笔记(一):安装显卡驱动、cuda/cudnn、Anaconda、Pytorch、Tensorflow、Opencv、Visdom、FFMPEG、卸载一些不必要的预装软件
这篇文章是关于如何在Ubuntu操作系统上安装显卡驱动、CUDA、CUDNN、Anaconda、PyTorch、TensorFlow、OpenCV、FFMPEG以及卸载不必要的预装软件的详细指南。
6490 3
|
4月前
|
缓存 并行计算 Ubuntu
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
本文是关于在Jetson AGX Xavier上编译FFmpeg(3.4.1)和OpenCV(3.4.0)的详细教程,包括编译需求、步骤、测试和可能遇到的问题及其解决方案。还提供了Jetson AGX Xavier编译CUDA版本的OpenCV 4.5.0的相关信息。
143 4
Jetson 学习笔记(十一):jetson agx xavier 源码编译ffmpeg(3.4.1)和opencv(3.4.0)
|
4月前
|
Ubuntu 应用服务中间件 nginx
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
本文是关于Ubuntu系统中使用ffmpeg 3.2.16源码编译OpenCV 3.4.0的安装笔记,包括安装ffmpeg、编译OpenCV、卸载OpenCV以及常见报错处理。
307 2
Ubuntu安装笔记(三):ffmpeg(3.2.16)源码编译opencv(3.4.0)
|
4月前
|
缓存 监控 计算机视觉
视频监控笔记(三):opencv结合ffmpeg获取rtsp摄像头相关信息
本文介绍了如何使用OpenCV结合FFmpeg获取RTSP摄像头信息,包括网络架构、视频监控系统组成、以及如何读取和显示网络摄像头视频流。
151 1
|
5月前
|
计算机视觉
基于QT的opencv插件框架qtCvFrameLearn实战
这篇文章详细介绍了如何基于Qt框架开发一个名为qtCvFrameLearn的OpenCV插件,包括项目配置、插件加载、Qt与OpenCV图像转换,以及通过各个插件学习OpenCV函数的使用,如仿射变换、卡通效果、腐蚀、旋转和锐化等。
84 10
|
5月前
|
机器学习/深度学习 Java 计算机视觉
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
本文记录了使用mingw81_64编译OpenCV 4.5.5、Qt 5.15.2、VTK 9.1的详细过程,包括编译结果截图、编译步骤、遇到的问题及其解决方案,以及相关参考链接。文中还提到了如何编译boost源码为静态库,并提供了测试代码示例。
159 0
opencv4.5.5+qt5.15.2+vtk9.1+mingw81_64编译记录
|
6月前
|
计算机视觉
使用QT显示OpenCV读取的图片
使用QT显示OpenCV读取的图片
139 1
|
8月前
|
算法 计算机视觉
【Qt&OpenCV 图像的感兴趣区域ROI】
【Qt&OpenCV 图像的感兴趣区域ROI】
282 1

热门文章

最新文章