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 }
原文地址:https://www.cnblogs.com/lnlin/p/13724779.html