【OpenCV_05】把图像&视频写入文件Write Image & Video to File

原创 2016年05月30日 12:18:14
今天,聊聊怎么吧图像以及视频写入到文件里。

Write Image to File 把图片写入到文件

下面的例子是创建一个黄色的图像并且写到文件里,下面就是采用OpenCV来实现.

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
// Write Image & Video to File

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main( int argc, const char** argv )
{
  Mat img(650, 600, CV_16UC3, Scalar(0,50000, 50000)); //create an image ( 3 channels, 16 bit image depth, 650 high, 600 wide, (0, 50000, 50000) assigned for Blue, Green and Red plane respectively. )

if (img.empty()) //check whether the image is loaded or not
{
cout << "ERROR : Image cannot be loaded..!!" << endl;
          //system("pause"); //wait for a key press
return -1;
}

     vector<int> compression_params; //vector that stores the compression parameters of the image

     compression_params.push_back(CV_IMWRITE_JPEG_QUALITY); //specify the compression technique

     compression_params.push_back(98); //specify the compression quality



     bool bSuccess = imwrite("D:/TestImage.jpg", img, compression_params); //write the image to file



     if ( !bSuccess )

    {

cout << "ERROR : Failed to save the image" << endl;

         //system("pause"); //wait for a key press

    }

namedWindow("MyWindow", CV_WINDOW_AUTOSIZE); //create a window with the name "MyWindow"
imshow("MyWindow", img); //display the image which is stored in the 'img' in the "MyWindow" window

waitKey(0);  //wait for a keypress

     destroyWindow("MyWindow"); //destroy the window with the name, "MyWindow"

return 0;
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


新出现的OpenCV函数
  • bool imwrite( const string& filename, InputArray img, const vector<int>& params=vector<int>())
这个函数是保存图像到变量'img'文件中,文件名为 'filename' .。如果这个文件保存失败返回值为false,如果写入硬盘成功返回true。简单的说,三个参数分别为图像数据,filename是目标图像名字,最后一个是生成图像的图片格式。

参数 -

  • filename - 指定保存文件的位置和名称被保存
  • img - 此变量保存图像文件
  • params - 这是一个int型的 vector,需要插入一些int的参数来指定保存图片的格式。
    • JPEG 格式 - puch_back CV_IMWRITE_JPEG_QUALITY  它的值是从0到100,值越小压缩的越多,默认值是95.本文采用98,值越大写入图像所需时间越长。
    • PNG 格式 - puch_back CV_IMWRITE_PNG_COMPRESSION 它的值是从0到9值越大表示图片尺寸越小,压缩时间越长。默认值是3。
    • PPM,PGM或者PBM格式,参数为CV_IMWRITE_PXM_BINARY,它的值是0或者1。默认值是1。
图片格式的选择,取决于文件扩展名,只有图像采用8bit 或者16bit无符单通道或者三通道 ( CV_8UC1, CV_8UC3, CV_8SC1, CV_8SC3, CV_16UC1, CV_16UC3) 的'BGR'通道顺序下可以保存。如果位深或者通道顺序不一样,用 'Mat::convertTo()' 或者 'cvtColor'函数 变成 imwrite所支持的格式类型。

这个程序非常类似于前面一片博文『创建并显示一个空白图片』

Summary
这个程序是创建一个黄图害羞,(3通道,16位深,650*600 (0, 50,000, 50,000) BGR通道),这里定义的是16位深,每个通道的每个元素采用的值是 0 到 65535。这里对green及red通道的每个pixel赋予50,000 ,产生出黄色,有兴趣的话可以尝试不同的颜色。
而后就是压缩图像,这里是采用了JPEG作为存储格式。然后把图片保存路径为"D:/TestImage.jpg" ,并且display 。



把视频写入文件

下面简单介绍一个,通过摄像头获取到视频文件如何写入文件里。

///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//Write Video to File

#include "opencv2/highgui/highgui.hpp"
#include <iostream>

using namespace cv;
using namespace std;

int main(int argc, char* argv[])
{
    VideoCapture cap(0); // open the video camera no. 0

    if (!cap.isOpened())  // if not success, exit program
    {
        cout << "ERROR: Cannot open the video file" << endl;
        return -1;
    }

 namedWindow("MyVideo",CV_WINDOW_AUTOSIZE); //create a window called "MyVideo"

   double dWidth = cap.get(CV_CAP_PROP_FRAME_WIDTH); //get the width of frames of the video
   double dHeight = cap.get(CV_CAP_PROP_FRAME_HEIGHT); //get the height of frames of the video

   cout << "Frame Size = " << dWidth << "x" << dHeight << endl;

   Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight));

 VideoWriter oVideoWriter ("D:/MyVideo.avi", CV_FOURCC('P','I','M','1'), 20, frameSize, true); //initialize the VideoWriter object 

   if ( !oVideoWriter.isOpened() ) //if not initialize the VideoWriter successfully, exit the program
   {
cout << "ERROR: Failed to write the video" << endl;
return -1;
   }

    while (1)
    {

        Mat frame;

        bool bSuccess = cap.read(frame); // read a new frame from video

        if (!bSuccess) //if not success, break loop
{
             cout << "ERROR: Cannot read a frame from video file" << endl;
             break;
        }

oVideoWriter.write(frame); //writer the frame into the file

        imshow("MyVideo", frame); //show the frame in "MyVideo" window

        if (waitKey(10) == 27) //wait for 'esc' key press for 30ms. If 'esc' key is pressed, break loop
       {
            cout << "esc key is pressed by user" << endl;
            break; 
       }
    }

    return 0;

}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////



新出现的OpenCV函数
  • Size frameSize(static_cast<int>(dWidth), static_cast<int>(dHeight))
创建一个 Size对象. 相幅大小为dWidth 及 dHeight的整数,不能设浮点数。

  • VideoWriter::VideoWriter(const string& filename, int fourcc, double fps, Size frameSize, bool isColor=true)
这是VideoWriter类的构造函数,通过下面参数对对象进行初始化。
  • const string& filename - 指定文件名以及输出位置。把视频流写入文件。
  • int fourcc - 指定用来压缩该视频编解码器的4字符代码。如果计算机可能不支持某些编解码器。那么,可能不能保存视频,需要尝试其他的编解码器。下面是一些流行的编解码器。
    • CV_FOURCC('D', 'I', 'V', '3') for DivX MPEG-4 codec
    • CV_FOURCC('M', 'P', '4', '2') for MPEG-4 codec
    • CV_FOURCC('D', 'I', 'V', 'X') for DivX codec 
    • CV_FOURCC('P','I','M','1') for MPEG-1 codec
    • CV_FOURCC('I', '2', '6', '3') for ITU H.263 codec
    • CV_FOURCC('M', 'P', 'E', 'G') for MPEG-1 codec
完整的codec列表点击here

这里采用了CV_FOURCC('P', 'I', 'M', '1') 。 
  • double fps - 视频流单位帧/秒。这里采用20,也可以尝试不同的值。但是,必须是对应codec支持支持FPS值。
  • Size frameSize - Size对象对视频流的每一帧进行定义宽度和高度。
  • bool isColor - 如果想保存彩色视频,参数为true. 
  •  if ( !oVideoWriter.isOpened() ) 检查VideoWriter对象初始化是否成功
  • void write(const Mat& image) 把帧写入到视频流,帧尺寸应该与VideoWriter对象初始化的尺寸一样。

注意:
目前,OpenCV只支持avi的格式,而且生成的视频文件不能大于2GB,而且不能添加音频。如果你想突破这些限制,最好还是看看ffMpeg,而不是浪费时间在OpenCV上。不过也可以利用视频后期合成工具制作。
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Python&OpenCV - 读写(read&write)视频(video) 详解 及 代码

读取(read&write)视频(video) 详解 及 代码 本文地址: http://blog.csdn.net/caroline_wendy/article/details/17084397...

OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui

首先要先纠正个误区,我见有人用OpenCV做多媒体开发,真的是很搞笑,OpenCV这东西再强大,这方面也不行的,之所以把视频读取写入这部分做的强大一些,也是为了方便大家做视频处理的时候方便些,而且这部...

【OpenCV3】视频读写——cv::VideoCapture和cv::VideoWriter详解

OpenCV3和OpenCV2类似,视频的读、写操作,分别通过cv::VideoCapture和cv::VideoWriter两个类来实现。...

OpenCV 处理内存中的图像数据

IplImage* iplImage; BYTE* data;内存中的图像数据 1 由IplImage*得到BYTE*图像数据: data = iplImage->imageData...
  • b5w2p0
  • b5w2p0
  • 2013年09月03日 12:15
  • 2775

openCV获取图像数据的方式

方式一:存取像素值。        如果想要获取指定坐标像素的值,可以采用Mat的成员函数at(j,i)来获取坐标()处的像素值。试例代码如下: //用Mat的成员函数访问图像数据 if (i...

opencv 读取视频、打开摄像头、写入视频文件

1、打开摄像头,采集图片,并保存到视频 主要用到两个类  VideoCapture  打开摄像头 VideoWriter   保存为视频文件 #include #include usi...

OpenCV写入的视频

1、cvCreateVideoWriter()中的第二个参数:avi对应的编码格式分别为: CV_FOURCC('P','I','M','1') = MPEG-1 codec ...
  • Augusdi
  • Augusdi
  • 2013年05月02日 16:34
  • 9856

【Opencv笔记】利用VideoCapture和VideoWriter函数读取和写入视频文件

本程序旨在使用电脑默认摄像头作为捕捉设备,来抓取帧,并进行图像处理。将处理后的视频帧作为一个新的文件保存。 同时创建两个窗口同时显示原始帧和处理过的帧。代码如下: #include #include...

OpenCV 视频与图片序列相互转换 VideoWriter生成视频流

OpenCV学习笔记(四十七)——VideoWriter生成视频流highgui http://blog.csdn.net/yang_xian521/article/details/744019...

opencv中Mat的使用与存取

特征存取是机器学习过程中的一步,因为数据量很大的话,如果直接对数据提取特征然后进行训练需要花很多时间,如果中途出了点问题那运行这么久就白做了。 所以把提取的特征进行保存就是很重要的一个步骤啦。 我打算...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV_05】把图像&视频写入文件Write Image & Video to File
举报原因:
原因补充:

(最多只允许输入30个字)