opencv数据结构与基本绘图

1 #include <opencv2corecore.hpp>//核心组件
2 #include <opencv2opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等
3 #include <opencv2highguihighgui.hpp>//图像上处理
4 using namespace std;
5 using namespace cv;

图像容器Mat

不必再手动开辟空间;

不必再不需要时立即将空间释放。

Mat是一个类,有两个数据部分组成:矩阵头(矩阵尺寸,存储方法、存储地址等)和一个指向存储所有像素值得矩阵的指针。

opencv使用了引用计数机制,每个Mat对象有自己的信息头,共享一个矩阵。这通过让矩阵指向同一地址而实现。

拷贝构造函数值复制信息头和矩阵指针,不复制矩阵。

 1 #include <opencv2corecore.hpp>//核心组件
 2 #include <opencv2opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等
 3 #include <opencv2highguihighgui.hpp>//图像上处理
 4 using namespace std;
 5 using namespace cv;
 6 
 7 int main(int argc, char** argv){//int argc, char* argv[]
 8     Mat A, C;//仅创建信息头部分
 9     A = imread("test.jpg");//为矩阵开辟内存空间
10     Mat B(A);//使用拷贝构造函数
11     C = A;//赋值运算符
12 }

创建ROI,只需要创建包含边界信息的信息头:

1 Mat D(A, Rect(10, 10, 100, 100));//使用矩形界定
2 Mat E = A(Range::all(), Range(1, 3));//使用行和列界定

复制矩阵本身,使用clone()函数或copyTo函数:

Mat F = A.clone();
Mat G;
A.copyTo(G);

创建Mat对象

Mat运算符<<只对二维矩阵有效。

方法一:Mat()构造函数

Mat M(2, 2, CV_8UC3, Scalar(0, 0, 255));
cout << "M=" << endl << M << endl;

(1)2行2列;

(2)存储元素的数据类型及每个矩阵点的通道数;CV_8UC3表示使用8位的unsigned char型,每个像素由三个元素组成三通道。预先定义的通道数可以多达四个。

CV_[位数][带符号与否][类型前缀]C[通道数],大部分设备都是用无符号8位整数CV_8U表示像素亮度。

如果需要更多通道数,可以把通道数放在小括号内,如:Mat M(3,2,CV_8UC(5)),通道数为5

(3)Scalar是个short型向量,指定值初始化矩阵,还可以用于表示颜色。

BGR:(0,0,255)表示全红

输出:

方法二:在CC++中通过构造函数进行初始化

1 int main(int argc, char** argv){//int argc, char* argv[]
2     int sz[3] = { 2, 2, 2 };//每个维度的尺寸
3     Mat L(3, sz, CV_8UC, Scalar::all(0));
4     system("PAUSE");
5     return EXIT_SUCCESS;
6 }

 方法三:为已存在的IPlIMAGE指针创建信息头

1 IPlImage* img = cvLoadImage("1.jpg",1);
2 Mat mtx(img);//转换IPlImage* -> Mat

方法四:Create()函数

1 M.create(4,4,CV_8UC(2));

若create函数指定的参数与之前的参数相同,则不进行实质的内存申请,否则就申请。

方法五:Matlab形式

1 Mat E = Mat::eye(4,4,CV_64F);//单位阵
2 Mat O = Mat::ones(2,2,CV_32F);//全1矩阵
3 Mat Z = Mat::zeros(3,3CV_8UC1);//0矩阵

方法六:对小矩阵使用逗号分隔式初始化函数

1 Mat C = (Mat_<double>(3,3) << 0,-1,0,-1,5,-1,0,-1,0);
2 cout << C << endl;

方法七:为已存在的对象创新信息头

clone函数和copyTo函数。

1 int main(int argc, char** argv){//int argc, char* argv[]
2     Mat C = (Mat_<double>(3, 3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
3     Mat rowclone = C.row(1).clone();//把C的第一行赋值给了rowclone这个新的
4     system("PAUSE");
5     return EXIT_SUCCESS;
6 }

格式化输出方法

Mat r = Mat(10,3,CV_8UC3);
randu(r,Scalar::all(0), Scalar::all(255));//randu产生随机值填充矩阵,给定上下限

cout << r << endl;//opencv默认风格

cout << foramt(r,Formatter::FMT_PYTHON) << endl;//python

cout << format(r,Formatter::FMT_CSV) << endl;//逗号分隔风格

cout << format(r,Formatter::FMT_NUMPY) << endl;//numpy风格

cout << format(r,Formatter::FMT_FMT_C) << endl;//c风格

常用数据结构

点:Point类

1 Point point;
2 point.x = 10;
3 point.y = 6;
4 
5 //方法二
6 Point point = Point(10,6);

Point_<int> == Point2i == Point

Point_<float> == Point2f

颜色表示:Scalar类

Scalar表示具有4个元素的数组,BGR,如果用不到第四个参数,就不需要写出来。

Scalar(a,b,c)

尺寸:Size类

Size(width, height);

矩形:Rect类

Rect rect = Rect(x,y,width,height);//左上角点坐标,宽,高

rect.Size();//返回size
rect.area();//返回矩形面积
rect.contains(Point);//判断点是否在矩形内
rect.inside(Rect);//判断矩形是否在该矩形内

Rect newrect1 = rect1 & rect2;//交集
Rect newrect2 = rect1 | rect2;//并集

Rect newrect3 = rect + point;//平移操作
Rect newrect4 = rect + size;//放缩操作

颜色空间转换:cvtColor函数

void cvtColor(InputArray src, OutputArray dst, int code, int dstCn=0);

(1)输入图像;

(2)输出图像

(3)颜色空间转换标识符;

(4)目标图像通道数,默认值0,0表示目标图像取源图像的通道数;

opencv3中的COLOR_式的宏命名前缀取代了opencv2的CV_。

原文地址:https://www.cnblogs.com/pacino12134/p/10980049.html