前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >【C++】OpenCV:图像视频读取基础操作

【C++】OpenCV:图像视频读取基础操作

作者头像
DevFrank
发布2024-07-24 15:04:03
1030
发布2024-07-24 15:04:03
举报
文章被收录于专栏:C++开发学习交流

😏1. 图像读取与显示

常用的几个函数:

代码语言:javascript
复制
imread:图像读取(路径+图像属性)
imshow:图像显示(窗口名+图像对象)
namedWindow:定义窗口属性(窗口名+窗口类型)

示例:

代码语言:javascript
复制
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

int main()
{
	//Mat src = imread("./data/test-fisheye.png",IMREAD_GRAYSCALE);	// 灰度
	Mat src = imread("./data/test.png");	// 彩色
	// 判断图像是否存在
	if (src.empty())
	{
		printf("could not load image!");
		return -1;
	}
	namedWindow("Display", WINDOW_FREERATIO);	// 创建窗口
	imshow("Display", src);	// 显示
	waitKey(0);	// 等待任意按键
	destroyAllWindows();	// 销毁
	return 0;
}

😊2. 图像色彩空间转换

常用函数:

代码语言:javascript
复制
cvtColor:色彩空间转换函数(灰度、彩色、HSV)
imwrite:图像保存函数(保存路径,图像对象)

示例:

代码语言:javascript
复制
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void colorSpace_Demo(Mat &image);

int main()
{
	//Mat src = imread("./data/test-fisheye.png",IMREAD_GRAYSCALE);
	Mat src = imread("./data/test.png");
	// 判断图像是否存在
	if (src.empty())
	{
		printf("could not load image!");
		return -1;
	}
	//namedWindow("Display", WINDOW_FREERATIO);
	imshow("Display", src);
	colorSpace_Demo(src);	//转换hsv和gray
	waitKey(0);
	destroyAllWindows();
	return 0;
}

void colorSpace_Demo(Mat &image) 
{
	Mat gray, hsv;
	cvtColor(image, hsv, COLOR_BGR2HSV);	//H 0~180,S V 0~255 颜色和亮度
	cvtColor(image, gray, COLOR_BGR2GRAY);
	imshow("HSV", hsv);
	imshow("GRAY", gray);
	imwrite("./hsv.png", hsv);
	imwrite("./gray.png", gray);
}

😆3. 创建空白图像并赋值

常用函数:

代码语言:javascript
复制
Mat::zeros:空白图像(大小+通道数)
Scalar:赋值(BGR)

示例:

代码语言:javascript
复制
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void mat_creation_demo() ;

int main()
{
	mat_creation_demo();
	waitKey(0);
	destroyAllWindows();
	return 0;
}

void mat_creation_demo() 
{
	//void mat_creation_demo(Mat &image) 
	//Mat m1, m2;
	//m1 = image.clone();	//拷贝1
	//image.copyTo(m2);	//拷贝2

	// 创建空白图像
	Mat m3 = Mat::zeros(Size(400,400), CV_8UC3);	//8uc1无符号8位,通道1
	m3 = Scalar(255, 0, 0);	// 赋值 B G R
	std::cout << m3 << std::endl;
	imshow("m3图像", m3);	//以上就创建了一个纯蓝色图像
}

😆4. 视频读取与写入示例

代码语言:javascript
复制
#include <opencv2/opencv.hpp>

using namespace cv;

int main()
{
    // 打开视频文件
    VideoCapture capture("input.mkv");

    // 检查视频是否成功打开
    if (!capture.isOpened())
    {
        std::cout << "无法打开输入视频文件!" << std::endl;
        return -1;
    }

    // 获取视频的帧率、宽度和高度
    double fps = capture.get(CAP_PROP_FPS);
    int width = capture.get(CAP_PROP_FRAME_WIDTH);
    int height = capture.get(CAP_PROP_FRAME_HEIGHT);

    // 创建输出视频文件
    VideoWriter writer("output.mp4", VideoWriter::fourcc('M', 'J', 'P', 'G'), fps, Size(width, height));

    // 检查视频文件是否成功创建
    if (!writer.isOpened())
    {
        std::cout << "无法创建输出视频文件!" << std::endl;
        return -1;
    }

    // 读取和写入每一帧
    Mat frame;
    while (capture.read(frame))
    {
        // 在每一帧上进行图像处理操作
        // 这里省略了图像处理部分,你可以根据需要添加

        // 写入处理后的帧到输出视频文件
        writer.write(frame);

        // 显示当前帧
        imshow("Video", frame);
        if (waitKey(30) == 'q')
            break;
    }

    // 释放资源
    capture.release();
    writer.release();

    return 0;
}

这里使用VideoCapture类打开输入视频文件,使用VideoWriter类创建输出视频文件(甚至可以进行格式转换)。

在这里插入图片描述
在这里插入图片描述

😆5. YAML读取与写入

代码语言:javascript
复制
#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;

int main()
{
    // 创建一个YAML文件节点
    FileStorage fs("data.yaml", FileStorage::WRITE);

    // 检查文件是否成功打开
    if (!fs.isOpened())
    {
        std::cout << "无法打开数据文件!" << std::endl;
        return -1;
    }

    // 写入数据到YAML文件
    int intValue = 5;
    float floatValue = 3.14;
    std::string stringValue = "Hello, World!";
    fs << "intValue" << intValue;
    fs << "floatValue" << floatValue;
    fs << "stringValue" << stringValue;

    // 关闭YAML文件
    fs.release();

    // 重新打开YAML文件进行读取
    FileStorage fs2("data.yaml", FileStorage::READ);

    // 检查文件是否成功打开
    if (!fs2.isOpened())
    {
        std::cout << "无法打开数据文件!" << std::endl;
        return -1;
    }

    // 读取数据从YAML文件
    int readIntValue;
    float readFloatValue;
    std::string readStringValue;
    fs2["intValue"] >> readIntValue;
    fs2["floatValue"] >> readFloatValue;
    fs2["stringValue"] >> readStringValue;

    // 输出读取的数据
    std::cout << "intValue: " << readIntValue << std::endl;
    std::cout << "floatValue: " << readFloatValue << std::endl;
    std::cout << "stringValue: " << readStringValue << std::endl;

    // 关闭YAML文件
    fs2.release();

    return 0;
}

结果如下:

代码语言:javascript
复制
%YAML:1.0
---
intValue: 5
floatValue: 3.1400001049041748e+00
stringValue: "Hello, World!"
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2024-01-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 😏1. 图像读取与显示
  • 😊2. 图像色彩空间转换
  • 😆3. 创建空白图像并赋值
  • 😆4. 视频读取与写入示例
  • 😆5. YAML读取与写入
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档