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