【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上。不过也可以利用视频后期合成工具制作。
版权声明:本文为博主原创文章,未经博主允许不得转载。

OpenCV视频写入详解_Python

cv2.VideoWriter()第二个参数控制视频编码的格式,多数教程上是这样写的 videoWriter = cv2.VideoWriter('out.mp4', cv2.cv.CV_FOURCC...
  • u014036026
  • u014036026
  • 2015年02月28日 15:11
  • 16781

opencv VideoWriter保存视频失败原因

为了采集昨晚自己在PC上搭了一个简单的DVR
  • opentld
  • opentld
  • 2014年11月11日 09:42
  • 5713

自然图像抠图/视频抠像技术梳理(image matting, video matting)

1. Bayesian Matting, Chuang, CVPR 2001. http://grail.cs.washington.edu/projects/digital-matting/pap...
  • kezunhai
  • kezunhai
  • 2014年12月08日 16:04
  • 3311

如何捕捉视频流并保存到文件(Capture video to File)

1 将视频流保存到AVI文件 AVI Mux filter接收从capture pin过来的视频流,然后将其打包成AVI流。音频流也可以连接到AVI Mux Filter上,这样mux fi...
  • ILoveThisSite
  • ILoveThisSite
  • 2013年11月18日 17:20
  • 2428

自然图像抠图/视频抠像技术发展情况梳理(image matting, alpha matting, video matting)--计算机视觉专题1

自然图像抠图/视频抠像技术发展情况梳理 持续更新. 当前更新日期2013.03.05, 添加Fast Mating、Global Matting、视频扣像。 当前更新日期2013.04.23, ...
  • luckyboy101
  • luckyboy101
  • 2013年08月26日 20:01
  • 1395

自然图像抠图/视频抠像技术发展情况梳理(image matting, alpha matting, video matting)--计算机视觉专题1

自然图像抠图/视频抠像技术发展情况梳理 Sason@CSDN 持续更新. 当前更新日期2013.03.05, 添加Fast Mating、Global Matting、视频扣像。 当前...
  • luckyboy101
  • luckyboy101
  • 2013年12月11日 21:22
  • 1039

自然图像抠图/视频抠像技术梳理(image matting, video matting)

1. Bayesian Matting, Chuang, CVPR 2001. http://grail.cs.washington.edu/projects/digital-matting/p...
  • jaccen
  • jaccen
  • 2015年12月07日 17:08
  • 2170

自然图像抠图/视频抠像技术发展情况梳理(image matting, alpha matting, video matting)--计算机视觉专题1

自然图像抠图/视频抠像技术发展情况梳理 Sason@CSDN 持续更新. 当前更新日期2013.03.05, 添加Fast Mating、Global Matting、视频扣像。 当前更新日期2...
  • anshan1984
  • anshan1984
  • 2013年02月15日 03:30
  • 12116

【OpenCV_12】旋转视频以及图片 Rotate Image & Video

旋转图像 Rotate Image 通过给定角度来选择图像是常见的图像处理问题,虽然看起来有点复杂,但是得益于OpenCV内置的一些函数,使得实现起来非常简单。下面就是代码,为了使得表达更加...
  • tealex
  • tealex
  • 2016年06月07日 16:46
  • 1302

图形(graphic、图像image和视频video有什么区别

原帖地址:http://www.xiangb.com/faq/faq_1342.html 视频(video):   视频简单的理解就是连续的图像,被称为视频。对视频图像的处理,核心是压缩,其他的就...
  • yazhouren
  • yazhouren
  • 2012年05月12日 10:28
  • 2099
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:【OpenCV_05】把图像&视频写入文件Write Image & Video to File
举报原因:
原因补充:

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