> 文章列表 > 【opencv】图像数字化——认识OpenCV中的Mat类(8 获得Mat中某一区域的值)

【opencv】图像数字化——认识OpenCV中的Mat类(8 获得Mat中某一区域的值)

【opencv】图像数字化——认识OpenCV中的Mat类(8 获得Mat中某一区域的值)

8 获得Mat中某一区域的值

8.1使用成员函数row(i)或col(j)得到矩阵第i行或者第j列

#include <opencv2/core/core.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main(){Mat mat = (Mat_<int>(3, 3) << 1,2,3,4,5,6,7,8,9);Mat mr = mat.row(1);Mat mc = mat.col(1);cout << mat << endl;cout << mr << endl;cout << mc << endl;return 0;
}

在这里插入图片描述

8.2使用成员函数rowRange(_start,_end)或colRange(_start,_end)得到矩阵的连续行或者连续列

  • Range类,用于构造连续的整数序列,Range(int_start,int_end);
  • 左闭右开[_start,_end)
Mat mr = mat.rowRange(Range(2,4));
// Mat mr = mat.rowRange(2,4);
  • 取2、3行
Mat mr = mat.rowRange(Range(2,4));
#include <opencv2/core/core.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main(){Mat mat = (Mat_<int>(5, 5) << 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);Mat mr = mat.rowRange(Range(2,4));cout << mat << endl;cout << mr << endl;return 0;
}

在这里插入图片描述

  • 取2、3列
Mat mr = mat.colRange(2,4);//Mat mr = mat.colRange(Range(2,4));
#include <opencv2/core/core.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main(){Mat mat = (Mat_<int>(5, 5) << 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);Mat mr = mat.colRange(2,4);//Mat mr = mat.colRange(Range(2,4));cout << mat << endl;cout << mr << endl;return 0;
}

在这里插入图片描述

8.3改变某行某列的值

mat.at<int>(0,0)=1000;
#include <opencv2/core/core.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main(){Mat mat = (Mat_<int>(5, 5) << 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);cout << mat << endl;mat.at<int>(2,4)=1000;//Mat mr = mat.colRange(Range(2,4));cout << mat << endl;return 0;
}

在这里插入图片描述

8.4使用成员函数clone和copyTo

  • 将矩阵克隆或者复制一份
//克隆矩阵
Mat r = mat.rowRange(1,2).clone();
//复制矩阵
Mat c;
mat.colRange(2, 4).copyTo(c);
#include <opencv2/core/core.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main(){Mat mat = (Mat_<int>(5, 5) << 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);cout << mat << endl;Mat r = mat.rowRange(1,2).clone();Mat c;mat.colRange(2, 4).copyTo(c);cout << r << endl;cout << c << endl;return 0;
}

在这里插入图片描述

8.5 使用Rect类

  • Rect:矩阵
 Mat b = mat(Rect(Point(2,1),Point(4,3)));//左上角坐标、右下角坐标Mat c=mat(Rect(2,1,2,2));//x,y,宽,高Mat d = mat(Rect(Point(2, 1), Size(2, 2)));//左上角坐标,尺寸
#include <opencv2/core/core.hpp>  
#include<iostream>  
using namespace std;
using namespace cv;
int main(){Mat mat = (Mat_<int>(5, 5) << 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);cout << mat << endl;Mat b = mat(Rect(Point(2,1),Point(4,3)));//左上角坐标、右下角坐标Mat c=mat(Rect(2,1,2,2));//x,y,宽,高Mat d = mat(Rect(Point(2, 1), Size(2, 2)));//左上角坐标,尺寸cout << b << endl;cout << c << endl;cout << d << endl;return 0;
}

在这里插入图片描述