OpenCV 学习笔记 ----图像的基本操作(二)

图像的区域选取

Mat 类提供了多种方便的方法来选择图像的局部区域。使用这些方法时需要

注意,这些方法并不进行内存的复制操作。如果将局部区域赋值给新的 Mat 对
象,新对象与原始对象共用相同的数据区域,不新申请内存,因此这些方法的执
行速度都比较快。
3.6.1 单行或单列选择
提取矩阵的一行或者一列可以使用函数 row()或 col()。函数的声明如下:
Mat Mat::row(int i) const
Mat Mat::col(int j) const
参数 i 和 j 分别是行标和列标。例如取出 A 矩阵的第 i 行可以使用如下代码:
Mat line = A.row(i);
例如取出 A 矩阵的第 i 行,将这一行的所有元素都乘以 2,然后赋值给第 j
32行,可以这样写:

A.row(j) = A.row(i)*2;

-------------------------------------------------------------------------------------------------------------------------

用 Range 选择多行或多列
Range 是 OpenCV 中新增的类,该类有两个关键变量 star 和 end。Range 对
象可以用来表示矩阵的多个连续的行或者多个连续的列。其表示的范围为从 start
到 end,包含 start,但不包含 end。Range 类的定义如下:
class Range
{
public:
...
int start, end;
};
Range 类还提供了一个静态方法 all(),这个方法的作用如同 Matlab 中的“:”,
表示所有的行或者所有的列。
//创建一个单位阵
Mat A = Mat::eye(10, 10, CV_32S);
//提取第 1 到 3 列(不包括 3)
Mat B = A(Range::all(), Range(1, 3));
//提取 B 的第 5 至 9 行(不包括 9)
//其实等价于 C = A(Range(5, 9), Range(1, 3))
Mat C = B(Range(5, 9), Range::all());


从图像中提取感兴趣区域(Region of interest)有两种方法,一种是使用构造
函数,如下例所示:
//创建宽度为 320,高度为 240 的 3 通道图像
Mat img(Size(320,240),CV_8UC3);
//roi 是表示 img 中 Rect(10,10,100,100)区域的对象
Mat roi(img, Rect(10,10,100,100));
除了使用构造函数,还可以使用括号运算符,如下:
Mat roi2 = img(Rect(10,10,100,100));
当然也可以使用 Range 对象来定义感兴趣区域,如下:
//使用括号运算符
Mat roi3 = img(Range(10,100),Range(10,100));
33//使用构造函数
Mat roi4(img, Range(10,100),Range(10,100));


矩阵的对角线元素可以使用 Mat 类的 diag()函数获取,该函数的定义如下:
Mat Mat::diag(int d) const
参数 d=0 时,表示取主对角线;当参数 d>0 是,表示取主对角线下方的次对
角线,如 d=1 时,表示取主对角线下方,且紧贴主多角线的元素;当参数 d<0 时,
表示取主对角线上方的次对角线。
如同 row()和 col()函数, diag()函数也不进行内存复制操作,其复杂度也是 O(1)。


------------------------------------------------------------------------------------------------------------------------------------------

利用 C++中的运算符重载,OpenCV 2 中引入了 Mat 运算表达式。这一新特
点使得使用 C++进行编程时,就如同写 Matlab 脚本,代码变得简洁易懂,也便于
维护。
如果矩阵 A 和 B 大小相同,则可以使用如下表达式:
C = A + B + 1;
其执行结果是 A 和 B 的对应元素相加,然后再加 1,并将生成的矩阵赋给 C
变量。
下面给出 Mat 表达式所支持的运算。下面的列表中使用 A 和 B 表示 Mat 类
型的对象,使用 s 表示 Scalar 对象,alpha 表示 double 值。
 加法,减法,取负:A+B,A-B,A+s,A-s,s+A,s-A,-A
 缩放取值范围:A*alpha
 矩阵对应元素的乘法和除法: A.mul(B),A/B,alpha/A
 矩阵乘法:A*B (注意此处是矩阵乘法,而不是矩阵对应元素相乘)
 矩阵转置:A.t()
 矩阵求逆和求伪逆:A.inv()
 矩阵比较运算:A cmpop B,A cmpop alpha,alpha cmpop A。此处 cmpop
可以是>,>=,==,!=,<=,<。如果条件成立,则结果矩阵(8U 类型矩
阵)的对应元素被置为 255;否则置 0。
 矩阵位逻辑运算:A logicop B,A logicop s,s logicop A,~A,此处 logicop
可以是&,|和^。
34 矩阵对应元素的最大值和最小值:min(A, B),min(A, alpha),max(A, B),
max(A, alpha)。
 矩阵中元素的绝对值:abs(A)
 叉积和点积:A.cross(B),A.dot(B)
下面例程展示了 Mat 表达式的使用方法,例程的输出结果如图 3.8 所示。
#include <iostream>
#include "opencv2/opencv.hpp"
using namespace std;
using namespace cv;
int main(int argc, char* argv[])
{
Mat A = Mat::eye(4,4,CV_32SC1);
Mat B = A * 3 + 1;
Mat C = B.diag(0) + B.col(1);
cout << "A = " << A << endl << endl;
cout << "B = " << B << endl << endl;
cout << "C = " << C << endl << endl;
cout << "C .* diag(B) = " << C.dot(B.diag(0)) << endl;
return 0;
}



  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值