opencv和cv::Mat常用属性和函数

本文详细介绍了OpenCV中的cv::Mat类,包括头文件、初始化方式、属性、常用函数以及如何赋RGB值。内容涵盖自定义初始化、从图像初始化、cv::Point2f、cv::Rect、cv::Size、cv::Mat与Eigen::Matrix转换、矩阵求和以及图像处理和特征提取的相关操作。
摘要由CSDN通过智能技术生成

opencv的安装请参考:ubuntu16.04(14.04)(重)安装OpenCV3.3.0与opencv_contrib3.3.0
 

这篇文章包括:

1. opencv常用头文件及作用
2. cv::Mat常见初始化
  - 初始化:自定义初始化、从已有结构初始化、从图像初始化
  - 访问和块操作
  - 常用类:cv::Point2f、 cv::Vec3b、 cv::Rect 、cv::Size
  - cv::Mat转Eigen::Matrix
  - 从深度图读取深度信息
3. cv::Mat常见属性
4. cv::Mat常见函数
  - clone()和copyTo()的区别
5.cv::Mat的RGB赋值(改颜色)
6.sum()函数,mat矩阵求和
7.opencv图像处理链接
8.mat与特征相关的函数
 


1. opencv常用头文件:

1.1 最常用头文件:

#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>

1.2 基本头文件及功能

//包含所有opencv头文件
#include <opencv2/opencv.hpp>

/* OpenCV基本数据结构, 动态数据结构, 绘图函数, 数组操作相关函数,
辅助功能与系统函数和宏, 与OpenGL的互操作*/
#include <opencv2/core/core.hpp>

/* 图像显示(cv::Mat, cv::imread(), cv::imshow(), cv::waitKey()等 ),
 滑块, 鼠标交互, I/O */
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/highgui/highgui_c.hpp>

/* 特征检测, 目标检测等内容, 线性和非线性的图像滤波, 图像的几何变换,
 其它(Miscellaneous)图像转换, 直方图相关*/
#include <opencv2/imgproc/imgproc.hpp>

//照片处理, 照片恢复
#include <opencv2/video/photo.hpp>

/*特征检测和描述, 特征检测器(Feature Detectors)通用接口, 描述符提取器(Descriptor Extractors)通用接口,
 描述符匹配器(Descriptor Matchers)通用接口, 通用描述符(Generic Descriptor)匹配器通用接口,
 关键点绘制函数和匹配功能绘制函数*/
#include <opencv2/features2d/features2d.hpp>

//快速近似最近邻搜索, 聚类
#include <opencv2/flann/miniflann.hpp>

//视频跟踪和背景分割
#include <opencv2/video/video.hpp>

//校准和立体
#include <opencv2/calib3d/calib3d.hpp>

//机器学习,图像识别
#include <opencv2/ml/ml.hpp>

 

2. cv::Mat初始化:

2.1 自定义赋值初始化

//m为3*5的矩阵,float型的单通道,把每个点都初始化为1
cv::Mat m(3,5,CV_32FC1,1);
//或者
cv::Mat m(3, 5, CV_32FC1, cv::Scalar(1));

cv::Mat m2 = (cv::Mat_<float>(2,2) << 1,2,3,4);

int data[] = {
   1,2,3,4,5,6};
cv::Mat m3(2,3,CV_32SC1,data);

//用cv::Size定义大小
cv::Mat img = cv::Mat(cv::Size(480,640),CV_8UC3);//注意宽和高的定义,这个(480,640)才是我们常说的640*480图像
//m为:
[1, 1, 1, 1, 1;
  1, 1, 1, 1, 1;
  1, 1, 1, 1, 1]
using namespace cv;
//m为3*5的矩阵,float型的2通道,把每个点都初始化为1 2
Mat m(3, 5, CV_32FC2, Scalar(1, 2));
//m为:
[1, 2, 1, 2, 1, 2, 1, 2, 1, 2;
  1, 2, 1, 2, 1, 2, 1, 2, 1, 2;
  1, 2, 1, 2, 1, 2, 1, 2, 1, 2]

2.2 从已有的数据结构初始化

double *data = new double[15];
for (int i = 0; i < 15; i++)
{
   
   data[i] = 1.2;
}
Mat m(3, 5, CV_32FC1, data);
//m为:
[1.2, 1.2, 1.2, 1.2, 1.2;
  1.2, 1.2, 1.2, 1.2, 1.2;
  1.2, 1.2, 1.2, 1.2, 1.2]

注意,这里是对data数据的浅拷贝,data所占内存数据改变,则m也会改变,例如:

delete [] data;
[-1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144;
  -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144;
  -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144, -1.456815990147463e+144]

可见,删除data之后,m就开始乱码了
 

2.3 从图像初始化

Mat m = imread("1.jpg", CV_LOAD_IMAGE_GRAYSCALE);

2.4 cv::Mat块访问和常用操作

cv::Mat m = (cv::Mat_<float>(4,4) << 1,2,3,4, 5,6,7,8,  9,10,11,12, 13,14,15,16);

/*m is:
[1, 2, 3, 4;
 5, 6, 7, 8;
 9, 10, 11, 12;
 13, 14, 15, 16]*/
 
//访问(i,j)位置的元素
float f_ij = m
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值