• 【OpenCV】图像基本操作


    😏★,°:.☆( ̄▽ ̄)/$:.°★ 😏
    这篇文章主要介绍OpenCV图像基本操作。
    学其所用,用其所学。——梁启超
    欢迎来到我的博客,一起学习,共同进步。
    喜欢的朋友可以关注一下,下次更新不迷路🥞

    😏1. 图像读取与显示

    常用的几个函数:

    imread:图像读取(路径+图像属性)
    imshow:图像显示(窗口名+图像对象)
    namedWindow:定义窗口属性(窗口名+窗口类型)
    
    • 1
    • 2
    • 3

    示例:

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22

    😊2. 图像色彩空间转换

    常用函数:

    cvtColor:色彩空间转换函数(灰度、彩色、HSV)
    imwrite:图像保存函数(保存路径,图像对象)
    
    • 1
    • 2

    示例:

    #include 
    #include 
    
    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);
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36

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

    常用函数:

    Mat::zeros:空白图像(大小+通道数)
    Scalar:赋值(BGR)
    
    • 1
    • 2

    示例:

    #include 
    #include 
    
    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);	//以上就创建了一个纯蓝色图像
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29

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

    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53

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

    在这里插入图片描述

    😆5. YAML读取与写入

    #include 
    #include 
    
    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;
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56

    结果如下:

    %YAML:1.0
    ---
    intValue: 5
    floatValue: 3.1400001049041748e+00
    stringValue: "Hello, World!"
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    在这里插入图片描述

    以上。

  • 相关阅读:
    JAVA_JDBC
    E2-AEN: End-to-End Incremental Learning with Adaptively Expandable Network
    蒋鑫鸿:黄金1726已短期见顶正将逐步打压,油破底延续
    产品说明丨如何使用MobPush快速创建应用
    在云服务器上打开ftp服务-踩坑及心得
    springMVC02,restful风格,请求转发和重定向
    1.数据校验-拦截器-全局异常-json数据处理
    OFDM系统各种调制阶数的QAM误码率(Symbol Error Rate)与 误比特率(Bit Error Rate)仿真结果
    【附代码】使用Shapely计算多边形外扩与收缩
    lv6 嵌入式开发-Flappy bird项目
  • 原文地址:https://blog.csdn.net/qq_40344790/article/details/127573047