我们知道,OpenCV是一个计算机视觉的开源库,它最基本也最重要的功能肯定是对图像和视频的处理。参数中的 0 表示等待时间,0表示无限等待。视频的保存也是一帧一帧来保存的。参数const String & winname为显示的窗口名,可以使用cv::namedWindow()函数创建窗口,如不创建,imshow()函数将自动创建;参数InputArray mat为待显示的图像。InputOutputArrayOfArrays都是OutputArray的别名。
第一种方式:
cv::VideoWriter out( const string& filename, // 输出文件名 int fourcc, // 编码形式,使用 CV_FOURCC()宏 double fps, // 输出视频帧率 cv::Size frame_size, // 单帧图像的大小 bool is_color = true // 如果是false,则可传入灰度图像,true为彩色图像);
第二种方式:
cv::VideoWriter out; out.open( "my_video.mpg", //输出文件名 CV_FOURCC('D','I','V','X'), // MPEG-4 编码 30.0, // 输出视频帧率 cv::Size( 640, 480 ), // 单帧图像分辨率为 640像素×480像素 true // 只可传入彩色图像,false为灰度图像);
其中需要注意的是FOURCC编码形式,操作时常用以下函数把4个字符连接起来形成一个FOURCC 码,形式为cv::VideoWriter::fourcc(char c1,char c2,char c3,char c4)。 Mat image = imread("C:/Users/27844/Desktop/icon.jpg",IMREAD_GRAYSCALE); if (image.empty()) { cout << "图片为空!" << endl; return; } // 2.显示图像 // cv::namedWindow的功能是创建一个OpenCV窗口,它是由OpenCV自动创建与释放,用户无需销毁它。 namedWindow("window", WINDOW_AUTOSIZE); imshow("window", image); // waitKey(0); 等待键盘输入,不加这句,窗口会一闪而逝 waitKey(0);}
下面为代码中用到的函数做解释:
- imshow():用来显示图像的函数。
CV_FOURCC('M','J','P','G') = motion-jpeg codec。
1.2 图像保存:
同图像读取类似,OpenCV中使用cv::imwrite()函数实现将图像保存到指定的文件,该函数定义如下。
CV_FOURCC('M', 'P', '4', '2') = MPEG-4.2 codec。
cv::VideoWriter::write( const Mat& image // 写入图像作为下一帧);out << frame;
示例:
#include <iostream>#include <opencv2/core/core.hpp>#include <opencv2/highgui/highgui.hpp>#include <opencv2/imgproc/imgproc.hpp>using namespace cv;using namespace std;void function(){VideoCapture video("C:/Users/27844/Desktop/video1.mp4"); if(!video.isOpened()) { cout<<"video open false"<<endl; return; } Mat img; namedWindow("video test"); int frame_num = video.get(CAP_PROP_FRAME_COUNT); cout<<"this video frame conut:"<<frame_num<<endl; // 1.5.2 VideoWriter对象创建 // cv::VideoWriter类用于写入视频,该类使用起来比cv::VideoCapture类稍微复杂一些。函数定义为cv::imshow ( const String & winname, InputArray mat )。这个章节学习基本的图像和视频的读取。另外,OutputArrayOfArrays、示例如下。Mat cv::imread(const String & filename, int flags = IMREAD_COLOR)
可以看到,imread()函数的定义非常简单,其解析如下。
举例:
Mat image(2,2,CV_8UC3,Scalar(0,255,255)); cout<<"矩阵元素"<<endl<<image<<endl; // 将图像保存 if(imwrite("D:/test.jpg",image)) { cout<<"图片保存成功!"<<endl; } else { cout<<"图片保存失败!"<<endl; }
2. 视频读取与保存:
2.1视频的读取:
opencv使用 cv::VideoCapture类来读取视频。
CV_FOURCC('F', 'L', 'V', '1') = FLV1 codec。InputOutputArray、
返回值Mat 类型:返回读取的图像,读取图像失败时返回一个空的矩阵对象(Mat::data == NULL)。
waitKey():OpenCV中的内置函数,语句waitKey(0)表示“暂停程序,等待一个按键输入”,也就是说,当程序执行到waitKey(0)时暂停运行,只有当用户按下一个按键时,它才会继续运行。
(VideoWirter与VideoCapture一般配合使用,类似于文件的读写操作)
cv::VideoWriter类的对象的创建有两种方式,第一种是使用构造函数,第二种是使用open()函数,具体示例如下。vector<Mat>,也就意味着函数的参数类型是InputArray型时,把上述几种类型作为参数都可以。
向创建的cv::VideoWriter对象写入图像也有两种方式,即write()操作和<<操作,示例如下。 // 对于视频捕捉设备而言,这个标识符就是一个标识数字——如果只有一台视频捕捉设备,那么就是0, // 如果系统中有多台视频捕捉设备,那么增加标识数字的值即可。
CV_FOURCC('D', 'I', 'V', 'X') = MPEG-4 codec。if (!capture.isOpened()){ std::cout << "Vidoe open failed!" << std::endl; return -1;}//(3)验证完成,开始读取视频。cv::VideoCapture capture("D:/images/test1.mp4");//参数类型为const string&,即从文件中读取,若设置为0则读取视频捕捉设备。