OpenCV4入门系列教程8:Mat()

索引地址:系列教程索引地址

上一篇:OpenCV4入门系列教程7:RNG()

Mat对象

Mat对象是OpenCV中最常用的一种数据结构,它是一个容器,存储任何通道任何数值的图片数据。简单来说,它是放在内存中的JPG图片。

使用完成后,内存自动释放。

Mat()对象的六种创建方法和用法:

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
#include "opencv2/highgui/highgui.hpp"
#include <iostream>

int main() {
// 方法1:创建无初始化矩阵
cv::Mat image1;
// 方法2:创建6行6列类型为8位单通道矩阵
cv::Mat image2(6, 6, CV_8UC1);
// 方法3:创建大小为7x7类型为8位3通道矩阵
cv::Mat image3(cv::Size(7, 7), CV_8UC3);
// 方法4:创建一个用1+3j填充的 8x8 复矩阵
cv::Mat image4(8, 8, CV_32FC2, cv::Scalar(1, 3));
// 方法5:创建大小为 9x9 类型为8位3通道矩阵
cv::Mat image5(cv::Size(9, 9), CV_8UC3, cv::Scalar(1, 2, 3));
//方法6:创建以image2赋值给image6,共用数据对象
cv::Mat image6(image2);
// 输出矩阵结果
std::cout << image1 << std::endl;
std::cout << image2 << std::endl;
std::cout << image3 << std::endl;
std::cout << image4 << std::endl;
std::cout << image5 << std::endl;
std::cout << image6 << std::endl;

cv::Mat Image1(10, 8, CV_8UC1, cv::Scalar(5));
// 矩阵行列数获取
std::cout << "Image1 row: " << Image1.rows << std::endl;
std::cout << "Image1 col: " << Image1.cols << std::endl;
// 取指定行列元素
std::cout << Image1.rowRange(1, 3) << std::endl;
std::cout << Image1.colRange(2, 4) << std::endl;
// 创建 8X8 复数矩阵1+5j
cv::Mat Image2(8, 8, CV_32FC2, cv::Scalar(1, 5));
// 利用create方法重新创建 10X10的8位无符号3通道矩阵
Image2.create(10, 10, CV_8UC(3));
std::cout << "Image2 channels:" << Image2.channels() << std::endl;
// 矩阵类型转换
Image2.convertTo(Image2, CV_32F);
std::cout << "Image2 depth:" << Image2.depth() << std::endl;
// zeros 创建矩阵
cv::Mat Image3 = cv::Mat::zeros(Image2.rows, Image2.cols, CV_8UC1);
// srcImage1的第4行元素变换成srcImage1的第5行元素乘2
Image1.row(4) = Image1.row(5) * 2;
std::cout << Image1 << std::endl;
// 创建srcImage4矩阵赋值为srcImage1的第4列
cv::Mat Image4 = Image1.col(4);
std::cout << Image4 << std::endl;
// 创建srcImage1矩阵的第一列拷贝到srcImage4中
Image1.col(1).copyTo(Image4);
std::cout << Image4 << std::endl;

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
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
[]
[ 48, 48, 48, 48, 58, 48;
48, 47, 48, 48, 48, 48;
58, 48, 48, 58, 49, 53;
46, 48, 47, 48, 48, 48;
48, 58, 48, 51, 58, 48;
48, 46, 48, 47, 117, 115]
[ 83, 66, 95, 67, 76, 65, 83, 83, 95, 70, 82, 79, 77, 95, 68, 65, 84, 65, 66, 65, 83;
69, 61, 72, 117, 98, 0, 69, 0, 73, 68, 95, 85, 83, 66, 95, 80, 82, 79, 84, 79, 67;
79, 76, 95, 70, 82, 79, 77, 95, 68, 65, 84, 65, 66, 65, 83, 69, 61, 70, 117, 108, 108;
32, 115, 112, 101, 101, 100, 32, 40, 111, 114, 32, 114, 111, 111, 116, 41, 32, 104, 117, 98, 0;
69, 0, 73, 68, 95, 86, 69, 78, 68, 79, 82, 95, 70, 82, 79, 77, 95, 68, 65, 84, 65;
66, 65, 83, 69, 61, 76, 105, 110, 117, 120, 32, 70, 111, 117, 110, 100, 97, 116, 105, 111, 110;
0, 69, 0, 73, 68, 95, 77, 79, 68, 69, 76, 95, 70, 82, 79, 77, 95, 68, 65, 84, 65]
[1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3;
1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3, 1, 3]
[ 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3;
1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3, 1, 2, 3]
[ 48, 48, 48, 48, 58, 48;
48, 47, 48, 48, 48, 48;
58, 48, 48, 58, 49, 53;
46, 48, 47, 48, 48, 48;
48, 58, 48, 51, 58, 48;
48, 46, 48, 47, 117, 115]
Image1 row: 10
Image1 col: 8
[ 5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5]
[ 5, 5;
5, 5;
5, 5;
5, 5;
5, 5;
5, 5;
5, 5;
5, 5;
5, 5;
5, 5]
Image2 channels:3
Image2 depth:5
[ 5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5;
10, 10, 10, 10, 10, 10, 10, 10;
5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5;
5, 5, 5, 5, 5, 5, 5, 5]
[ 5;
5;
5;
5;
10;
5;
5;
5;
5;
5]
[ 5;
5;
5;
5;
10;
5;
5;
5;
5;
5]

感兴趣区域

ROI(region of interest),感兴趣区域。机器视觉、图像处理中,从被处理的图像以方框、圆、椭圆、不规则多边形等方式勾勒出需要处理的区域,称为感兴趣区域,ROI。在Halcon、OpenCV、Matlab等机器视觉软件上常用到各种算子(Operator)和函数来求得感兴趣区域ROI,并进行图像的下一步处理。

简单来说,我需要的就是ROI,可以是算法算出来的,也可以是我指定的一片区域。

测试代码

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
// 功能:代码 2-20 Rect 选择感兴趣区域
// 作者:朱伟 zhu1988wei@163.com
// 来源:《OpenCV图像处理编程实例》
// 博客:http://blog.csdn.net/zhuwei1988
// 更新:2016-8-1
// 说明:版权所有,引用或摘录请联系作者,并按照上面格式注明出处,谢谢。//
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/imgproc/imgproc.hpp>
// 全局变量源图像
cv::Mat srcImage;
// 方法1 利用Rect选择区域(100, 180, 150, 50)
void regionExtraction(int xRoi, int yRoi, int widthRoi, int heightRoi) {
// 指定坐标区域提取
cv::Mat roiImage(srcImage.rows, srcImage.cols, CV_8UC3);
std::cout << srcImage.rows << " " << srcImage.cols << std::endl;
// 将兴趣区域拷贝到目标图像
srcImage(cv::Rect(xRoi, yRoi, widthRoi, heightRoi)).copyTo(roiImage);
cv::imshow("roiImage", roiImage);
cv::waitKey(0);
}
int main() {
// 源图像载入及判断
srcImage = cv::imread("lena.jpg");
if (!srcImage.data)
return 1;
cv::imshow("ROIing", srcImage);
cv::waitKey(0);
// 方法1 利用Rect选择区域(100, 180, 150, 50)
int xRoi = 80;
int yRoi = 180;
int widthRoi = 150;
int heightRoi = 100;
regionExtraction(xRoi, yRoi, widthRoi, heightRoi);
return 0;
}

测试结果:

roi

下一篇:OpenCV4入门系列教程9:imread()/imshow()/imwrite()