opencv3学习笔记(四)------opencv数据结构与基本绘图(上)


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(蓝绿红)

猜你喜欢

转载自blog.csdn.net/qq_37894023/article/details/84474609