OpenCV中Mat的一些常用操作(网络资料整理)
来源:互联网 发布:php 取小数点后两位 编辑:程序博客网 时间:2024/06/01 08:20
1、定义
Mat curr_img0(test_pir_sz.cy, test_pir_sz.cx, CV_8UC3);Mat mat1 = Mat::ones(1, 5, CV_32F);
float K[3][3] = {fc[0], 0, cc[0], 0, fc[1], cc[1], 0, 0, 1}; //摄像机内参数矩阵K
cv::Mat mK = cv::Mat(3,3,CV_32FC1,K);
------------------------------------------------------------------------------------------------------------------------
2、复制
curr_img1.copyTo(curr_img0);
Mat类的两个拷贝函数,copyTo()和clone(),都是进行深复制,也就是会另外开辟一个内存存储被复制的数据区域,
对复制得到的新矩阵进行释放releas()不会影响原矩阵的数据(有其他方式会影响,后面遇到再讲)。这里的copyTo()和
clone()区别在于,copyTo()可选一个参数掩膜mask,根据mask的值选择复制区域。
------------------------------------------------------------------------------------------------------------------------
3、释放
Mat mat1 = Mat::ones(1, 5, CV_32F);
Mat mat2 = mat1; // 仅创建一个mat2信息头, mat1,mat2 数据区的地址相同
Mat mat3 = Mat::zeros(1, 4, CV_32F);
mat2.release(); // 因为mat2是对mat1的引用,这里的mat2.release()只会清除mat2的信息头和数据指针
mat1.release(); // mat1的数据区都会被释放,但是mat信息头数据还会保存(也就是还能继续被赋值)
------------------------------------------------------------------------------------------------------------------------
4、遍历
at:
image.at<cv::Vec3b>(j,i);
ptr指针:
void colorReduce1(cv::Mat &image, int div=64) {
int nr= image.rows; // number of rows
int nc= image.cols * image.channels(); // total number of elements per line
for (int j=0; j<nr; j++) {
uchar* data= image.ptr<uchar>(j);
for (int i=0; i<nc; i++) {
*data++= *data/div*div + div/2;
} // end of row
}
}
指针:
void colorReduce4(cv::Mat &image, int div=64) {
int nr= image.rows;
int nc= image.cols * image.channels();
int step= image.step;
uchar *data= image.data;
for (int j=0; j<nr; j++) {
for (int i=0; i<nc; i++) {
*(data+i)= 2;
} // end of row
data+= step; // next line
}
}
iterator:
void colorReduce8(cv::Mat &image, int div=64) {
// get iterators
cv::Mat_<cv::Vec3b>::iterator it= image.begin<cv::Vec3b>();
cv::Mat_<cv::Vec3b>::iterator itend= image.end<cv::Vec3b>();
for ( ; it!= itend; ++it) {
(*it)[0]= (*it)[0]/div*div + div/2;
(*it)[1]= (*it)[1]/div*div + div/2;
(*it)[2]= (*it)[2]/div*div + div/2;
}
}
------------------------------------------------------------------------------------------------------------------------
5、
Mat::setTo
将阵列中所有的或部分的元素设置为指定的值。
C++: Mat& Mat::setTo(const Scalar& s, InputArray mask=noArray())
Mat::rowRange
为指定的行span创建一个新的矩阵头。
C++: Mat Mat::rowRange(int startrow, int endrow) const
C++: Mat Mat::rowRange(const Range& r) const
Mat::colRange
为指定的行span创建一个矩阵头。
C++: Mat Mat::colRange(int startcol, int endcol) const
C++: Mat Mat::colRange(const Range& r) const
------------------------------------------------------------------------------------------------------------------------
6、其他
对于数学计算还有一些基本的构造函数,如Mat::eye()对角阵(当行、列不同时,主对角线为1)、Mat::ones()单位阵、Mat::zeros()零
矩阵等。用一个矩阵的一行复制到另外一行,不能通过直接复制,必须通过运算才行(运算的结果会返回一个实际的矩阵)。如矩阵mat的
第1行复制到第2行,代码为 mat.row(1)=mat.row(0) 无效,但是 mat.row(1)=mat.row(0)+0; 或者 mat.row(1)=mat.row(0)+mat.row(2);
都是有效的。
------------------------------------------------------------------------------------------------------------------------
阅读全文
0 0
- OpenCV中Mat的一些常用操作(网络资料整理)
- 【OpenCv】Mat中常用的一些
- opencv中Mat的一些常见操作
- opencv 中Mat的一些操作
- opencv mat相关资料整理
- opencv Mat常用操作
- OpenCV Mat常用操作
- opencv笔记(矩阵Mat的常用操作)
- Opencv中Mat对于像素的操作
- Opencv 中 Mat类的基本操作
- opencv中Mat的各种相关操作
- opencv的mat操作
- 关于TTSERVER的一些网络资料整理
- Opencv Mat矩阵操作(整理借鉴+个人总结)
- openCV整理的资料
- opencv中关于Mat类的一些问题
- 一些学习资料的整理(持续更新中)
- opencv Mat 的基本操作
- 【技术贴收集】在线预览下载PDF文件
- Codeforces 842 B Gleb And Pizza
- 框架:提供一定能力的小段程序
- JSP页面写入中文到数据库乱码问题
- 事件分发(EventDispatcher)模式
- OpenCV中Mat的一些常用操作(网络资料整理)
- Java Arrays用法简介
- nginx中location配置说明
- python opencv入门 使用 GrabCut 交互式提取前景(30)
- [笔记分享] [Display] MSM8x60 MIPI-DSI
- rocketMq
- Thinkphp PHPExcel批量导入数据到数据库
- 手风琴菜单,且隐藏滚动条保留滚动功能
- 文档的发布