• OpenCV学习(1)--图像的读取、写入、输出、ROI的选取、Mat介绍


    此分类用于记录OpenCV的学习,目前随笔中给出的代码都是用C++写的,后面可能会用上Python。

    另外学习过程的记录会放在代码块的注释中。

    学习资料 OpenCV官方文档

    OpenCV读取图像数据并输出

    对于OpenCV中的图像,以左上角为(0, 0)点,横轴为x,纵轴为y,即对于图像来说,y表示有多少rows,x表示有多少cols

     1 void readAndShow(string path) {
     2     string imageName(path);
     3     cv::Mat image;
     4     // cv::Mat 包括一个矩阵头和一个指向存储像素值区域的指针
     5     // Mat的复制 只复制矩阵头和指针 图像数据不会复制成第二份 
     6     // 类似于 Type *A = B 此时改变B也会改变A 浅拷贝
     7 
     8     // 要复制图像数据时 需要使用一下两种方式
     9     // cv::Mat image2 = image.clone();
    10     // A.copyTo(image2)
    11 
    12     //image = imread(imageName, cv::IMREAD_COLOR);  // 读取图像文件
    13     //image = imread(imageName, cv::IMREAD_GRAYSCALE);
    14     image = cv::imread(imageName, cv::IMREAD_COLOR);
    15 
    16     // imread() 第一个参数为图像文件所在路径 第二个参数指定我们所需的图像格式
    17     // IMREAD_COLOR (<0)按原样加载图像
    18     // IMREAD_GRAYSCALE (0) 加载灰度图像
    19     // IMREAD_COLOR (>0) 以RGB格式加载图像
    20 
    21 
    22     if (image.empty()) {   // 读取未成功
    23         cout << "Failed read!" << std::endl;
    24         return;
    25     }
    26 
    27     cv::namedWindow("Display window", cv::WINDOW_AUTOSIZE);   // 创建window 参数"Display window"指定窗口名称
    28     cv::imshow("Display window", image);  // 在窗口显示图片
    29     cv::waitKey(0);  // 等待一个键盘输入
    30     return;
    31 }

    将读入的彩色图片转化为灰度图片并写入磁盘

     1 void showCvtColorAndImwrite(string path) {
     2     cv::Mat image;
     3     image = cv::imread(path, cv::IMREAD_COLOR);  // 读取RGB格式彩色图片
     4 
     5     if (image.empty()) {
     6         cout << "Failed read!" << endl;
     7         return;
     8     }
     9 
    10     cv::namedWindow("RGBColor", cv::WINDOW_AUTOSIZE);
    11     cv::imshow("RGBColor", image);
    12     cv::waitKey(0);
    13 
    14     // 转换为灰度图片
    15     cv::Mat grayImage;
    16     cv::cvtColor(image, grayImage, cv::COLOR_BGR2GRAY);  
    17     // 将彩色图片转化为灰度图片 image为原彩色图片数据 grayImage为转化后存储灰色图片数据的地方 cv::COLOR_BGR2GRAY指示执行怎么样的转换
    18 
    19     cv::namedWindow("grayColor", cv::WINDOW_AUTOSIZE);
    20     cv::imshow("grayColor", grayImage);
    21 
    22     cv::imwrite("first_gray.jpg", grayImage);   
    23     // 将garyImage存储的图片数据写入磁盘 新写入的图片文件名为first_gray.jpg
    24     cv::waitKey(0);
    25 }

    在图像中创建感兴趣区域 ROI

     1 int selectROIExample(void) {
     2     // 在原读取的图像文件中选取了一个990*990大小的矩阵ROI 并输出
     3     cv::Mat image;
     4     image = cv::imread("first.jpg", cv::IMREAD_COLOR);
     5 
     6     if (image.empty()) {   // 读取未成功
     7         cout << "Failed read!" << std::endl;
     8         return 0;
     9     }
    10 
    11     cv::Mat D(image, cv::Rect(10, 10, 1000, 1000));
    12     // 选取image中左上角为(10, 10)长宽为(1000, 1000)的矩形包含的图像
    13     // 即在图像中创建感兴趣区域 ROI
    14 
    15     cv::namedWindow("Test Window!", cv::WINDOW_AUTOSIZE);
    16     cv::imshow("Test Window!", image);
    17     cv::waitKey(0);
    18     cv::imshow("Test Window!", D);
    19     cv::waitKey(0);
    20     return 0;
    21 }

    Mat的创建

     1 void howToCreateMatSubject() {
     2     // Mat的初始化构造
     3 
     4     cv::Mat image(100, 100, CV_8UC3, cv::Scalar(0, 0, 255));
     5     // 通过给定图像大小100*100 
     6     // 指定存储元素的数据类型和每个矩阵点的通道数CV_8UC3即8位无符号char类型3通道
     7     // 通过Scalar将图像设置为单一灰度Scalar(num)或颜色Scalar(n1, n2, n3)
     8 
     9     int size[3] = { 200, 200, 200 };
    10     cv::Mat image2(3, size, CV_8UC(1), cv::Scalar::all(0));
    11     // 创建一个2维已上的矩阵
    12     // 参数3指定维度
    13     // size 指定每个维度的大小
    14 
    15     /*
    16     MATLAB样式的初始化器
    17     cv::Mat::zeros()
    18     cv::Mat::ones()
    19     cv::Mat::eye()
    20     */
    21 
    22     // cv::randu() 获取随机值
    23 
    24     // cv::format()控制输出格式 cv::Formatter::FMT_NUMPY表示以numpy形式
    25     // std::cout << "控制输出格式" << std::endl << cv::format(image, cv::Formatter::FMT_NUMPY) << std::endl;
    26 
    27     cv::Point2f P(5, 1);
    28     //
    29 }
  • 相关阅读:
    [置顶] cAdvisor、InfluxDB、Grafana搭建Docker1.12性能监控平台
    15 个 Docker 技巧和提示
    Docker资源管理探秘:Docker背后的内核Cgroups机制
    SVN通过域名连不上服务器地址(svn: E175002: OPTIONS request failed on '/svn/yx-SVN-Server' Connection refused: connect)
    图片点击放大功能
    jquery-选择checkbox的多种策略
    HTML-input标签需设置的属性
    MyBatis-配置缓存
    SpringMVC redirect乱码问题
    Mysql-左连接查询条件失效的解决办法
  • 原文地址:https://www.cnblogs.com/lnlin/p/13724779.html
Copyright © 2020-2023  润新知