一、图像读写
1、读取
Mat cv::imread ( const String & filename,
int flags = IMREAD_COLOR
)
返回读取得到的一个Mat矩阵,读取图像失败时返回一个空的矩阵对象(Mat::data == NULL);
第一个参数为文件路径,第二个参数flags为读取标记,用于选择读取图片的方式,默认值为IMREAD_COLOR,flag值的设定与用什么颜色格式读取图片有关。
//函数调用
Mat image = imread(path_name);
2、写入
bool imwrite( const String& filename, InputArray img,
const std::vector<int>& params = std::vector<int>());
第一个参数为文件路径;第二个参数表示Mat类型的图像数据;第三个参数表示为特定格式保存的参数编码,一般情况下不用写。
//函数调用
imwrite(store_path, image);
二、图像显示
读取一张图片并显示出来,读取得到的数据类型为IplImage
;
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
int main(){
IplImage *img = cvLoadImage("pic/pro30.jpg"); //读取图片
cvNamedWindow("window1", CV_WINDOW_AUTOSIZE); //创建窗口
cvShowImage("window1",img); //窗口显示图片
cvWaitKey(0); //等待时间,正数时以毫秒为单位,0时等待按键操作
cvReleaseImage(&img); //释放图像文件
cvDestroyWindow("window1"); //销毁窗口
}
三、高斯模糊
#include <opencv2/opencv.hpp>
#include <iostream>
#include <string>
#include <vector>
using namespace std;
using namespace cv;
int main(){
IplImage *img = cvLoadImage("pic/test1.jpg");
cvNamedWindow("emp_in");
cvShowImage("emp_in",img);
IplImage *imgout = cvCreateImage(
cvGetSize(img), //Size
IPL_DEPTH_8U, //像素点数据类型
3 //通道数
);
cvSmooth(img, imgout, CV_GAUSSIAN, 15, 15); //高斯模糊处理
cvNamedWindow("emp_out");
cvShowImage("emp_out",imgout);
cvWaitKey(0);
cvReleaseImage(&img);
cvReleaseImage(&imgout);
cvDestroyWindow("emp_in");
cvDestroyWindow("emp_out");
}
函数原型:
void cvSmooth( const CvArr* src, CvArr* dst,int smoothtype=CV_GAUSSIAN,
int param1, int param2, double param3, double param4 );
-
src:输入图像
-
dst:输出图像.
-
smoothtype:平滑方法
-
param1:平滑操作的第一个参数.
-
param2:平滑操作的第二个参数. 对于简单/非尺度变换的高斯模糊的情况,如果param2的值为零,则表示其被设定为param1。
-
param3:对应高斯参数的 Gaussian sigma (标准差).
平滑方法有以下几种:
CV_BLUR_NO_SCALE(简单不带尺度变换的模糊) - -对每个象素的 param1×param2 领域求和。如果邻域大小是变化的,可以事先利用函数 cvIntegral 计算积分图像。
CV_BLUR (simple blur)- -对每个象素param1×param2邻域求和并做尺度变换 1/(param1×param2)。
CV_GAUSSIAN(gaussian blur) - -对图像进行核大小为 param1×param2 的高斯卷积。
CV_MEDIAN(median blur) - -对图像进行核大小为param1×param1 的中值滤波 (邻域是方的)。
CV_BILATERAL(双向滤波) - -应用双向 3x3 滤波,彩色 sigma=param1,空间 sigma=param2。
四、视频生成
下面是一个简单的生成视频实例,当前目录已有N张图片并且按照顺序命名,下面将其合成一个视频:
#include<opencv2/opencv.hpp>
#include<iostream>
cv::VideoWriter writer;
using namespace std;
using namespace cv;
int main()
{
//初始化
int N = 3000,dataNum = 0;
string data_path = "./";
string data_name = to_string(dataNum);
string left_path = "./pic_";
//读取第一张图片,得到视频的长宽
Mat src=imread(left_path+ data_name+".jpg",1);
int isColor = 1; //颜色设定
int fps = 10; //帧数
int frameWidth = src.cols;
int frameHeight = src.rows;
//视频文件初始化
writer = VideoWriter("./Aplay.avi",CV_FOURCC('M','J','P','G'), fps,
Size(frameWidth, frameHeight), isColor);
for (int i = 0; i < dataNum+N; i++)
{
data_name = to_string(i);
src=imread(left_path+ data_name+".jpg",1);
if (src.empty())
{
cout<<" 全部图像加载完成!";
break;
}
imshow("【src】", src); //显示
waitKey(5);
writer.write(src); //写入视频文件
}
}
核心部分是cv::videowriter
类, 这是在opencv中提供的录制视频的句柄,基本操作有如下几种(与上述代码不怎么相同):
//声明
VideoWriter writer;
//打开
writer.open("path/04.avi",CV_FOURCC('M', 'J', 'P', 'G'),
rate, //不进行跟踪,定位,只显示、录制时的帧率
Size(inFrame.cols,inFrame.rows),
true);
if (!writer.isOpened())
{
return;
}
//输入
writer<<inFrame;
//释放
writer.release();
其中打开操作与构造函数相同,其参数如下:
(const string& filename, int fourcc, double fps,Size frameSize, bool isColor=true);
-
filename:输出视频文件名。
-
fourcc:四个字符用来表示压缩帧的codec例如:
-
- CV_FOURCC(‘P’,’I’,’M’,’1’) = MPEG-1 codec
- CV_FOURCC(‘M’,’J’,’P’,’G’) = motion-jpeg codec
- CV_FOURCC(‘M’, ‘P’, ‘4’, ‘2’) = MPEG-4.2 codec
- CV_FOURCC(‘D’, ‘I’, ‘V’, ‘3’) = MPEG-4.3 codec
- CV_FOURCC(‘D’, ‘I’, ‘V’, ‘X’) = MPEG-4 codec
- CV_FOURCC(‘U’, ‘2’, ‘6’, ‘3’) = H263 codec
- CV_FOURCC(‘I’, ‘2’, ‘6’, ‘3’) = H263I codec
- CV_FOURCC(‘F’, ‘L’, ‘V’, ‘1’) = FLV1 codec
- 若编码器代号为 -1,则运行时会弹出一个编码器选择框.
-
fps:被创建视频流的帧率。
-
frame_size:视频流的大小。
- is_color 如果非零,编 码器将希望得到彩色帧并进行编码;否则,是灰度帧(只有在Windows下支持这个标志)。