opencv数据结构与基本绘图
1 #include <opencv2\core\core.hpp>//核心组件 2 #include <opencv2\opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等 3 #include <opencv2\highgui\highgui.hpp>//图像上处理 4 using namespace std; 5 using namespace cv;
图像容器Mat
不必再手动开辟空间;
不必再不需要时立即将空间释放。
Mat是一个类,有两个数据部分组成:矩阵头(矩阵尺寸,存储方法、存储地址等)和一个指向存储所有像素值得矩阵的指针。
opencv使用了引用计数机制,每个Mat对象有自己的信息头,共享一个矩阵。这通过让矩阵指向同一地址而实现。
拷贝构造函数值复制信息头和矩阵指针,不复制矩阵。
1 #include <opencv2\core\core.hpp>//核心组件 2 #include <opencv2\opencv.hpp>//GUI,包含媒体输入输出,视频捕捉、图形交互界面的接口等 3 #include <opencv2\highgui\highgui.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)表示全红
输出:
方法二:在C\C++中通过构造函数进行初始化
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_。