opencv视频流的读取和处理

  1. Opencv提供一个简单易用的框架以提取视频文件和USB摄像头中的图像帧,如果只是想读取某个视频,你只需要创建一个VideoCapture实例,然后在循环中提取每一帧。下面是一个简单的代码
#include<opencv2\core\core.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<iostream>
using namespace cv;
using namespace std;

int main()
{
    VideoCapture capture("d:\\road.avi");
    //检测视频是否读取成功
    if (!capture.isOpened())
    {
        cout << "No input image";
        return 1;
    }

    //获取图像帧率
    double rate = capture.get(CV_CAP_PROP_FPS);
    bool stop = false;
    Mat frame;
    namedWindow("Example");

    int delay = 1000/rate;

    while (!stop)
    {
        if (!capture.read(frame))
            break;
        imshow("Example",frame);
        if (waitKey(delay) >= 0)
            stop = true;
    }
    return 0;
}

要正确地打开视频文件必须确保电脑具有相应的解码器。同时也应该注意文件路径的未知是否正确,路径为止错误经常也会提示错误warning: Error opening file (../../modules/highgui/src/cap_ffmpeg_impl.hpp:545)。这个错误一般都是文件路径错误而导致的。

  1. 处理视频帧

    为了对视频中的每一帧进行处理,我们可以创建自己的类VideoProcessor,其中封装OopenCV的视频获取框架,该类允许我们制定每帧调用的处理函数。

    首先,我们希望制定一个回调处理函数,(关于回调函数,另外一个帖子http://blog.csdn.net/neal1991/article/details/45009377有介绍)。这个喊出可以接受一个Mat对象然后输出处理之后的Mat对象。

void processFrame(Mat& img, Mat& out);

    // 对视频的每帧做Canny算子边缘检测
void canny(Mat& img, Mat& out)
{
    // 先要把每帧图像转化为灰度图
   cvtColor(img,out,CV_BGR2GRAY);
    // 调用Canny函数
   Canny(out,out,100,200);
    // 对像素进行翻转
    threshold(out,out,128,255,THRESH_BINARY_INV);
}

定义好一个视频处理类,它将与一个回调函数相关联。使用该类,可以创建一个实例,制定输入的视频文件,绑定回调函数,然后开始对每一帧进行处理,要调用这个视频处理类,只需要在main函数添加就可以了:

    // 首先创建实例
    VideoProcessor processor;
    // 打开视频文件
    processor.setInput("e:\\road.avi");

    // 分别为输入和输出视频
    processor.displayInput("Input Video");
    processor.displayOutput("Output Video");
    // 以原始帧率播放视频
    processor.setDelay(1000./processor.getFrameRate());
    // 设置处理回调函数
    processor.setFrameProcessor(canny);
    // 开始帧处理过程
    processor.run();
    waitKey();
时间: 2024-10-13 16:32:18

opencv视频流的读取和处理的相关文章

使用OpenCV的VideoCapture 读取.mp4文件时出现以下错误:Unable to stop the stream: Inappropriate ioctl for device

使用OpenCV的VideoCapture 读取.mp4文件时出现以下错误:Unable to stop the stream: Inappropriate ioctl for device 此问题由于未安装ffmpeg导致. sudo apt-get install ffmpeg 重新编译opecv即可. cd xx/opecv/build rm -rf * cmake ../                                //执行cmake ../后打印信息中video I/

[OpenCV] 1、读取图片

>_<" 安装及配置请看http://www.cnblogs.com/zjutlitao/p/4042074.html >_<" 这篇是一个简单的在VS2012里运行的openCV读取图片并显示的简单例子 1 #include <stdio.h> 2 #include <opencv2/opencv.hpp> 3 using namespace std; 4 using namespace cv; 5 int main(int argc,

【OpenCV】imread读取数据为空

直接加配置好的props文件到新的工程时,会出现imread读出来的Mat为空的情形,搜了一下,发现是opencv的配置问题!!! 是这样的,之前配置时为了省事儿,无论是Debug还是Release中的附加依赖项,都添加了所有的lib,也就是没有分Debug和Release. 但实际上OpenCv是要分的,文件名尾带d的为Debug库函数,不带d的为Release库函数.只需将其中库函数分开添加进附加依赖项即可: 其他版本以此类推. Debug库: opencv_calib3d244d.libo

opencv VideoCapture.read()读取错误

错误详情: OpenCV Error: Assertion failed (size.width>0 && size.height>0) in cv::imshow, file ..\..\..\..\opencv\modules\highgui\src\window.cpp, line 261 源码: import cv2 as cv clicked = False def onMouse(event,x,y,flags,param): global clicked if e

C++使用OpenCV保存和读取XML

代码 // save xml file cv::FileStorage file(save_transform, cv::FileStorage::WRITE); cv::Mat TransM = cv::Mat::ones(100,200,CV_8UC1); file << "TransM" << TransM; // read xml file cv::FileStorage file("xml_file_path", cv::FileS

Python下opencv使用笔记(一)(图像简单读取、显示与储存)

写在之前 从去年開始关注python这个软件,途中间间断断看与学过一些关于python的东西.感觉python确实是一个简单优美.easy上手的脚本编程语言,众多的第三方库使得python异常的强大.能够处理很多不同的问题,同一时候它的很多开源免费的库使得python的使用也是十分的广泛. 在科学计算.数据处理与图像领域,自己以前一直在使用matlab.感觉matlab也是一个语言优美.简单方便的编程语言,都说matlab与python在某些领域是非常类似的,确实是这样,就科学计算.数据处理上真

Opencv 图像读取与保存问题

本系列文章由 @yhl_leo 出品,转载请注明出处. 文章链接: http://blog.csdn.net/yhl_leo/article/details/49737357 本文仅对 Opencv图像读取与保存进行阐述,重在探讨图像读取与保存过程中应注意的细节问题. 1 图像读取 首先看一下,imread函数的声明: // C++: Mat based Mat imread(const string& filename, int flags=1 ); // C: IplImage based

python3随笔-opencv读取图像数据

如何安装opencv-python $pip3 install opencv-python 如何读取图像数据 import numpy as np import cv2 as cv img = cv.imread('1.png') print(img) print(img.dtype) [[[200 228 197][200 228 197][200 228 197]......[200 228 197][200 228 197][200 228 197]]] dtype('uint8') 使用

Java使用OpenCV3.2实现视频读取与播放

Java使用OpenCV3.2实现视频读取与播放 OpenCV从3.x版本开始其JAVA语言的SDK支持视频文件读写,这样就极大的方便了广大Java语言开发者学习与使用OpenCV,通过摄像头或者视频文件读取帧的内容与播放,完成视频内容分析与对象跟踪等各种应用开发任务.可以说OpenCV C++ SDK可以做到绝大多数事情,在OpenCV3.x版本上用Java都可以完成,这样就为很多Java开发者学习OpenCV打开了方便之门. 实现思路 首先用OpenCV相关API读取视频流或者视频文件的每一