1、基础图像容器Mat:内存分配是自动进行的;
不用担心内存的释放问题;
赋值运算和拷贝函数只复制信息头;
clone()或copyTo()来复制一幅图像的矩阵
2、像素值的存储方法:存储像素值需要指定颜色空间和数据类型。
显式创建Mat对象的七种方法:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
/*//-------方法一:使用Mat()构造函数("<<"只对二维矩阵有效)-------
Mat M(2,2,CV_8UC3,Scalar(0,0,255));
//参数:行数,列数,数据类型,每个矩阵点的通道数。
//CV_8UC3:表示使用8位的unsigned char型,每个像素由三个元素组成三通道
//scalar:是个short型的向量
cout << "M=" << endl << " " << M << endl << endl;
system("pause");
//-------方法二:c\c++中通过构造函数进行初始化------
int sz[3] = {2,2,2};
Mat L(3,sz,CV_8UC3,Scalar::all(0));
//参数:维数,数组指针(包含每个维度的尺寸), ,
//-------方法三:为已存在的IplImage指针创建信息头------
IplImage* img = cvLoadImage("1.jpg",1);
Mat mtx(img);//转换IplImage*->Mat
//-------方法四:利用Create()函数------
//Mat类中的Create()成员函数进行Mat类的初始化操作
M.create(4,4,CV_8UC(2));
cout << "M=" << endl << " " << M << endl << endl;
//-------方法五:采用Matlab式的初始化方式------
Mat E = Mat::eye(4,4,CV_64F);
cout<<"E=" << endl << " " <<E<< endl << endl;
Mat O = Mat::ones(2,2,CV_32F);
cout << "O=" << endl << " " << O << endl << endl;
Mat Z = Mat::zeros(3,3,CV_8UC1);
cout << "Z=" << endl << " " << Z << endl << endl;
*/
//-------方法六:对小矩阵使用逗号分隔式初始化函数------
Mat C = (Mat_<double>(3,3) << 0, -1, 0, -1, 5, -1, 0, -1, 0);
cout << "C=" << endl << " " << C<< endl << endl;
//-------方法七:为已存在的对象创建信息头------
Mat RowClone = C.row(1).clone();
cout << "RowClone=" << endl << " " << RowClone << endl << endl;
system("pause");
}
运行结果:
OpenCV中的格式化输出方法:
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Mat r = Mat(10,3,CV_8UC3);
randu(r,Scalar::all(0),Scalar::all(255));//randu()函数产生随机值来填充矩阵
//cout << "r(opencv默认风格)= \n" << r << ";" << endl << endl;
//cout << "r(python风格)= \n"<< format(r,"python") <<";"<<endl <<endl;
//cout << "r(逗号分隔风格)= \n" << format(r,Formatter::FMT_CSV) << ";" << endl << endl;
//cout << "r(Numpy风格)= \n" << format(r, Formatter::FMT_NUMPY) << ";" << endl << endl;
cout << "r(C语言风格)= \n" << format(r, Formatter::FMT_C) << ";" << endl << endl;
system("pause");
}
结果如下:
输出和定义二维点、三维点:
//-------输出和定义二维点、三维点--------
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
Point2f p(6, 2);
cout << "【二维点】p=" << p <<";\n"<< endl << endl;
Point3f p3f(8,2,0);
cout << "【三维点】p3f=" << p3f << ";\n" << endl << endl;
system("pause");
}
结果如下:
定义输出基于Mat::vector
//---------定义输出基于Mat的std::vector------
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main() {
//vector<float> v;
//v.push_back(3);
//v.push_back(5);
//v.push_back(7);
//cout << "【基于Mat的vector】shortvec=" << Mat(v) << ";\n"<< endl;
vector<Point2f> points(20);
for (size_t i= 0; i < points.size(); ++i)
points[i] = Point2f((float)(i*5),(float)(i%7));
cout << "【二维点向量】points= \n" << points << ";\n"<<endl<<endl;
system("pause");
}
结果如下:
常用数据结构和函数:
1.点的表示:Point类 Point point=Point(x,y);只能表示二维坐标等价于Point2f
2.颜色的表示:Scalar类 Scalar(a,b,c);
RGB:red-------c;green------b;blue-------a.
3.尺寸的表示:Size类
Size(xxx.width,xxx.height);------构造的Size宽度和高度都为5(Size(5,5);)
4.矩形的表示:Rect类 Rect rect(x,y,width,height); (x , y---左上角点的坐标;width , height ---矩形的宽和高)
成员函数:Size();area();contains(Point)----判断点是否在矩阵内;
inside(Rect)---判断矩阵是否在矩阵内;
tl()------返回左上角点坐标;br()-----返回右下角点坐标;
5、颜色空间的转换:cvColor()函数
void cvtColor(InputArray src,OutputArray dst,int code,int detCn=0);
参数一:输入图像
参数二:输出图像
参数三:颜色空间转换的标识符
参数四:目标图像的通道数(0表示取原通道数)
cvtColor(srcImage,dstImage,COLOR_GRAY2BGR);//转换为灰度图
注:opencv默认的图片通道存储顺序是BGR(蓝绿红)