OPENCV第二章-图像基本知识
图像的加载与显示
图像加载函数

flags默认IMREAD_COLOR 既读取彩色图像

图像显示


默认参数可能会出现图像很大导致屏幕只显示一部分图像
有几个版本在关闭窗口的时候不能自动释放窗口内存,但是咱们版本还挺新的,应该没必要
直接使imageshow也可以生成窗口,使namedWindow()的默认参数
图像保存

读取的对象和保存对象的格式可以不一样
params是用来压缩的,自己看文档

示例
```Cpp
#include <opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;
int main() {
Mat img;
img = imread("C:/opencv/lopencv/lena.png", IMREAD_COLOR);
Mat gray;
gray = imread("C:/opencv/lopencv/lena.png", IMREAD_GRAYSCALE);
namedWindow("img", WINDOW_AUTOSIZE);
namedWindow("gray", WINDOW_NORMAL);
imshow("img", img);
imshow("gray", gray);
waitKey(0);//在键盘输入的时候执行后续的程序
return 0;
}
```摄像头与视频
视频加载与摄像头调用
视频加载/摄像头调用

如果调用摄像头的话第一个参数的类型是int 内容是摄像头在电脑里面的id
videoCapture可以不使用任何参数,可以videoCapture video形式定义一个名video的空视频,通open()函数处理,输入的参数也是视频文件名称或者摄像头id
在videoCapture的类里面存.isOpened()方法来返回是否成功加载视频
videoCapture类里面gets()方法可以获得视频当前的属性
![[Pasted image 20240207171046.png]]
可以用>>运算把video里面的图像逐帧存到Mat里面
视频文件保存


示例
```Cpp
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace std;
using namespace cv;
int main()
{
system("color F0"); //更改输出界面颜色
VideoCapture video;//建立video类
video.open("C:/Users/photosynthesis/Desktop/全能录屏助手/20230910_202751.mp4");//open函数,把地址改成0可以打开你的摄像头
if (video.isOpened())//判断
{
cout << "视频中图像的宽度=" << video.get(CAP_PROP_FRAME_WIDTH) << endl;
cout << "视频中图像的高度=" << video.get(CAP_PROP_FRAME_HEIGHT) << endl;
cout << "视频帧率=" << video.get(CAP_PROP_FPS) << endl;
cout << "视频的总帧数=" << video.get(CAP_PROP_FRAME_COUNT);
}
else
{
cout << "请确认视频文件名称是否正确" << endl;
return -1;
}
while (1)//一直循环
{
Mat frame;//存储当前帧
video >> frame;//读取一帧图像储存进frame里面,视频流赋予
if (frame.empty())//当前帧是否为空
{
break;//退出循环
}
imshow("video", frame);//显示图片
waitKey(1000 / video.get(CAP_PROP_FPS));//等待,等待时间是1秒钟除以帧率,如果比这个数大就是慢放,反之就是快放
}
waitKey();
return 0;
}
```P.S.有些瑙谭摄像头不支持帧率查询,把循环时候的等待时间改为固定值比如1ms就行
视频的保存
```Cpp
#include <opencv2\opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat img;
VideoCapture video(0); //使用某个摄像头
if (!video.isOpened()) // 判断是否调用成功
{
cout << "打开摄像头失败,请确实摄像头是否安装成功";
return -1;
}
bool isColor = true; // 判断相机(视频)类型是否为彩色
VideoWriter writer;
int codec = VideoWriter::fourcc('M', 'J', 'P', 'G'); // 选择编码格式
double fps = 25.0; // 设置视频帧率
string filename = "live.avi"; // 保存的视频文件名称
writer.open(filename, codec, fps, Size(640, 480), isColor); // 创建保存视频文件的视频流
if (!writer.isOpened()) // 判断视频流是否创建成功
{
cout << "打开视频文件失败,请确实是否为合法输入" << endl;
return -1;
}
while (true)
{
// 获取图像
video >> img;
// 检测是否成功获取图像
if (img.empty()) // 判断有没有读取图像成功
{
cout << "没有获取到图像" << endl;
break;
}
writer.write(img); // 把图像写入视频流
imshow("Live", img); // 显示图像
char c = waitKey(50);
if (c == 27) // 按ESC键退出视频保存
{
break;
}
}
return 0;
}
```
本文是原创文章,采用 CC BY-NC-ND 4.0 协议,完整转载请注明来自 name1110
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果