图像的加载与显示

图像加载函数

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;

}

```

接下来需要安装image Watch

是一个拿来调试的插件,不装也行其实

按了F5之后可以打开imageWatch实时查看逐语句的对应的图像

目前只能逐语句,不能下一语句,不知道为啥:(

自己参考


摄像头与视频

视频加载与摄像头调用

视频加载/摄像头调用

如果调用摄像头的话第一个参数的类型是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;

}

```