【OpenCV学习笔记】四、摄像头/视频的读取与写入

主要内容:

1、讲解VideoCapture类,读取视频或摄像头

2、讲解VideoWriter类,写视频文件

先上ppt:

代码:读取视频或摄像头,并加入简单处理效果

//读取视频或摄像头,并加入简单处理效果
#include "opencv2/core/core.hpp"
#include "opencv2/highgui/highgui.hpp"
#include "opencv2/imgproc/imgproc.hpp"
using namespace cv;
void main()
{
    VideoCapture cap("2.avi"); //读取视频方法一
    //VideoCapture cap("http://www.laganiere.name/bike.avi");//也可以是网络视频
    //VideoCapture cap;        //读取视频方法二
	//cap.open("E:\\2.avi"); 
    //cap.open(0);             //读取摄像头
    if(!cap.isOpened())        //检查视频/摄像头打开是否成功
         return;
    Mat frame;                 //定义Mat变量,用来存储每一帧
    //循环显示每一帧
    while(1)
    {
        cap>>frame;            //读取当前帧方法一
        //cap.read(frame);     //读取当前帧方法二
        //加入简单图像处理效果
        Canny(frame, frame, 30, 100);         //Canny边缘检测
        //cvtColor(frame, frame, CV_BGR2HSV); //颜色空间转换到HSV
        if(!frame.empty())     //对当前帧进行异常检测
        {
            imshow("video", frame);
           //用waitKey()返回值判断退出预览
           if(waitKey(30)==27) //指定Esc键退出
               break;
        }
        else
            break;
    }
    cap.release();            //关闭视频流文件
}

运行结果:

代码:打开视频,加入简单处理效果,写视频到本地

//打开视频,进行candy边缘检测,写视频到本地
#include "opencv2/opencv.hpp"
#include <iostream>
using namespace cv;
using namespace std;

void main()
{
	 VideoCapture cap("2.avi"); //读取视频方法一
    //VideoCapture cap;         //读取视频方法二
	//cap.open("E:\\2.avi"); 
    //VideoCapture cap("http://www.laganiere.name/bike.avi");//也可以是网络视频
    //cap.open(0);              //读取摄像头
    if(!cap.isOpened())         //检查视频/摄像头打开是否成功
		return;
    //VideoCapture的get方法返回指定视频类的相关参数信息
	double width = cap.get(CV_CAP_PROP_FRAME_WIDTH);  //帧宽度
	double height = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //帧高度
	double frameRate = cap.get(CV_CAP_PROP_FPS);  //帧率 x frames/s
	double totalFrames = cap.get(CV_CAP_PROP_FRAME_COUNT); //总帧数
    //输出视频相关参数信息
	cout<<"视频宽度="<<width<<endl;
	cout<<"视频高度="<<height<<endl;
	cout<<"视频总帧数="<<totalFrames<<endl;
	cout<<"帧率="<<frameRate<<endl;
	
	Size size0 = Size(cap.get(CV_CAP_PROP_FRAME_WIDTH), cap.get(CV_CAP_PROP_FRAME_HEIGHT));
	//VideoWriter类的构造函数
    //VideoWriter writer("E:\\out.avi", CV_FOURCC('X', 'V', 'I', 'D'), 20, size0, true);
	VideoWriter writer("E:\\out.avi", //文件名
                        -1, //编解码器,写入视频前需安装对应的编解码器。
                            //这里填-1,不指定编解码方式,程序运行时会跳出窗口让我们选择
                        cap.get(CV_CAP_PROP_FPS),//播放帧率
                        size0,//帧尺寸,生成视频尺寸需与读取视频尺寸一致
                               //若不一致,则写入的视频会出错。
                        false);//是否创建彩色视频,生成视频是否支持彩色应与构造函数设置一致
                              //因为后面进行candy检测,每一帧都变成了黑白二值图像,所以这里应填false
                              //如果填true,则写入的视频会出错
	
	Mat frame;                 //定义Mat变量,用来存储每一帧
    //循环显示每一帧
	while(1)
	{
        cap>>frame;            //读取当前帧方法一
        //cap.read(frame);     //读取当前帧方法二
        
        if(frame.empty())      //对当前帧进行异常检测
			break;
        
        //加入简单图像处理效果
        Canny(frame, frame, 30, 100);         //Canny边缘检测
        //cvtColor(frame, frame, CV_BGR2HSV); //颜色空间转换到HSV
        imshow("video", frame);  
        
        //写入帧       
       writer<<frame;  //写入帧方法一
		//writer.write(frame); //写入帧方法二
     
        //用waitKey()返回值判断退出预览
        if(waitKey(30)>0)   //如果有按键.对于waitKey,若没有按键按下则返回-1.
			break;
	}
	cout<<"write end!";
	cap.release();  //关闭视频流文件
	destroyAllWindows();
}


运行结果:

写入本地的out.avi

  • 2
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
如果你想在Qt中读取地方摄像头视频,可以使用OpenCV的`VideoCapture`类进行操作。 具体步骤如下: 1. 在Qt中添加OpenCV库,可以在.pro文件中添加以下内容: ``` INCLUDEPATH += /usr/local/include/opencv4 LIBS += -L/usr/local/lib -lopencv_core -lopencv_highgui -lopencv_videoio ``` 其中,`/usr/local/include/opencv4`为OpenCV的头文件路径,`/usr/local/lib`为OpenCV库文件路径。 2. 在Qt中创建一个窗口用于显示视频。 3. 使用`VideoCapture`类打开地方摄像头,可以通过参数指定摄像头的设备编号或者视频文件的路径。 4. 循环读取视频帧并在窗口中显示,直到读取失败或者用户退出程序。 完整代码示例如下: ``` #include <opencv2/opencv.hpp> #include <QApplication> #include <QMainWindow> #include <QImage> #include <QPixmap> #include <QLabel> int main(int argc, char *argv[]) { QApplication app(argc, argv); QMainWindow window; QLabel label; window.setCentralWidget(&label); window.show(); cv::VideoCapture cap(0); // 打开地方摄像头 if (!cap.isOpened()) // 打开失败 { std::cerr << "Failed to open camera." << std::endl; return -1; } while (true) // 循环读取视频帧 { cv::Mat frame; cap >> frame; // 读取视频帧 if (frame.empty()) break; // 读取失败,退出循环 cv::cvtColor(frame, frame, cv::COLOR_BGR2RGB); // OpenCV图像格式为BGR,需要转换为RGB QImage qimg(frame.data, frame.cols, frame.rows, QImage::Format_RGB888); // 创建QImage对象 QPixmap qpixmap = QPixmap::fromImage(qimg); // 转换为QPixmap对象 label.setPixmap(qpixmap); // 显示在窗口中 QApplication::processEvents(); // 处理Qt事件,保证窗口正常显示 if (cv::waitKey(30) == 'q') break; // 按下q键退出循环 } return app.exec(); } ``` 其中,`QMainWindow`和`QLabel`用于创建窗口和显示视频帧,`QImage`和`QPixmap`用于将OpenCV的图像格式转换为Qt的图像格式,`QApplication::processEvents()`用于保证窗口正常显示。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值