刚开始接触opencv3,发现函数的用法太多,本身C++学的也不是很好,打算随手把学过的记录下来,方便以后查看
1.读取图像:Mat imread(const string& filename, int flags);
返回值为Mat对象
Mat类型需要记录图像的数据:
1).图像是灰度或彩色(这里姑且只考虑这两种)
2).图像数据的大小(图像的宽与高)
3).一个数据体:二维数组或是一维数组。
●Mat类:是用于保存图像以及其他矩阵数据的数据结构。默认情况下,其 尺寸为0,也可以指定初始尺寸,比如定义一个Mat类对象,就要写cv::Mat pic(320,640,cv::Scalar(100));
2.显示图像:void imshow(const string& winname, InputArray mat);
第一个参数,const string&类型的winname,填需要显示的窗口标识名称。
3.将输出图像保存为文件:
bool imwrite(const string& filename,InputArray img, const vector& params=vector() );
第一个参数:保存后的文件名
第二个参数:要保存的Mat类型的图像数据
第三个参数:特定格式保存的参数编码,它有默认值vector(),所以一般情况下不需要填写
4**.截取图像中的一部分:Reat类 Reat rect(a,b,c,d);**
a,b 表示截取图片的左上角在原图的坐标。
c,d分别代表图片的长宽。
下面的代码是练习代码
5 VideoCapture 类 视频读取
VideoCapture::VideoCapture (const string& filename/int device)
filename/device:打开的视频文件/设备ID
方法:
1.isOpende():判断视频或摄像头调用是否成功
2.read(Mat frame) / capture >> frame :捕获、解码和返回下一个视频帧
3.get(int id):获取视频属性,如帧率、总帧数、尺寸等
4.set(int id,double value):设置视频属性
5.VideoWriter类 视频写操作
cv::VideoWriter out(
const string& filename, // 输入文件名
int fourcc, // 编码形式,使用 CV_FOURCC()宏
double fps, // 输出视频帧率
cv::Size frame_size, // 单帧图片的大小
bool is_color = true // 如果是false,可传入灰度图像
);
cv::VideoWriter out;
out.open(
"my_video.mpg", //输出文件名
CV_FOURCC('D','I','V','X'), // MPEG-4 编码
30.0, // 帧率 (FPS)
cv::Size( 640, 480 ), // 单帧图片分辨率为 640x480
true // 只输入彩色图
);
写入图像方法:
cv::VideoWriter::write(
const Mat& image // 写入图像作为下一帧
);
my_video_writer << my_frame;
/////////////////////////////////////
// 隔一分钟保存一帧 //
// 将连续帧保存为视频 //
////////////////////////////////////
#include
#include
using namespace std;
using namespace cv;
int video_picture(string filename);
void Image_To_Video(int m);
int main()
{
string video_name = "D://Libs//opencv310//opencv//sources//samples//data//768x576.avi";
int n;
n = video_picture(video_name); //截取帧
Image_To_Video(n); //图像整合成视频
return(0);
}
int video_picture(string filename)
{
int i = 0;
int j = 0;
//读入视频
VideoCapture capture(filename);
double rate = capture.get(CV_CAP_PROP_FPS); //获取视频帧率
//循环读取每一帧
while (1){
Mat frame; //Mat:存储每一帧的图像
capture >> frame; //读取当前帧
i++;
if (i == 6*rate){ //10fps/s 1min->600fps
i = 0;
j++;
//imshow("读取视频", frame); //显示当前帧
string name_1 = "D://video picture//";
string name_2 = to_string(j);
string name_3 = ".jpg";
name_1 += name_2;
name_1 += name_3; //图片存储路径及名字
if (!frame.empty()){
imwrite(name_1, frame);//截取当前帧并以图像的形式保存
waitKey(30); //延时30ms
}
if (frame.empty())
break;
}
}
return j;
}
void Image_To_Video(int p_num)
{
char image_name[40];
string s_image_name;
//初始化视频编写器
cv::VideoWriter writer;
int isColor = 1; //true
int frame_fps = 10;
int frame_width = 768;
int frame_height = 576;
using namespace cv;
string video_name = "D://video picture//hehe.avi"; //视频名字及路径
writer = VideoWriter(video_name, CV_FOURCC('X', 'V', 'I', 'D'), frame_fps, Size(frame_width, frame_height), isColor);
cv::namedWindow("image to video", CV_WINDOW_AUTOSIZE);
int i = 1;
Mat img;
while (i <= p_num)
{
sprintf(image_name, "%s%d%s", "D://video picture//", i++, ".jpg");
s_image_name = image_name;
img = imread(s_image_name);//读入图片
if (!img.data) //判断图片调入是否成功
{
cout << "Could not load image file...\n" << endl;
}
if (!img.empty()) //非空判断
imshow("image to video", img);
//写入
writer.write(img);
if (cv::waitKey(30) == 27 || i == 56) //ESC:ASCⅡ码27
{
cout << "按下ESC键" << endl;
break;
}
}
}