网站建设后期服务收费标准,WordPress的好处,wordpress 主题更新,做外贸网站费用文章目录 一、OPNECV元素1.CvPoint2、模板类Size模版类Rect模版类RotatedRect模版类 二、MAT1.使用(nrows, ncols, type)#xff0c;初始化2维矩阵如果需要深拷贝#xff0c;则使用clone方法。 三、Vec类 一、OPNECV元素
1.CvPoint 为了方便使用#xff0c;opencv又对常用的… 文章目录 一、OPNECV元素1.CvPoint2、模板类Size模版类Rect模版类RotatedRect模版类 二、MAT1.使用(nrows, ncols, type)初始化2维矩阵如果需要深拷贝则使用clone方法。 三、Vec类 一、OPNECV元素
1.CvPoint 为了方便使用opencv又对常用的类型进行了定义 typedef Point_int Point2i;
typedef Point2i Point;
typedef Point_float Point2f;
typedef Point_double Point2d;同理还有Point3_只不过它是一个3维点(x,y,z)而已。它的常用类型是 typedef Point3_int Point3i;
typedef Point3_float Point3f;
typedef Point3_double Point3d;2、模板类
Size模版类 能够访问的成员变量是height和width。还定义了area函数来求面积。其他的操作基本都是类型转化函数。 typedef Size_int Size2i;
typedef Size2i Size;
typedef Size_float Size2fRect模版类
。它是由左上角点和长度、宽度定义的。在opecv中一般定义为左开右闭区间。 有意思的是这个类竟然也提供了一个RectPoint的函数作用是对矩形的偏移还有一个Rect Size的函数在左上角不变的情况下重新调整矩形的大小。其他的操作还有与和|是求两个矩形的交集和并集 RotatedRect模版类
除了基本的矩形之外opecv还提供了一个可以旋转的矩形RotatedRect它是由中心、变长、旋转角度决定的。你可以访问它的这三个成员也可以使用points函数返回它的4个顶点使用boundingRect求出它的外接矩形非旋转下面是一个例子
int main(void)
{Mat bg(200,200,CV_8UC3,Scalar(0));imshow(,bg);RotatedRect rRect(Point2f(100,100),Size(100,100),40); Point2f vertices[4];rRect.points(vertices);for(int i 0; i 4;i)line(bg,vertices[i],vertices[(i1)%4],Scalar(0,255,0));Rect brect rRect.boundingRect();rectangle(bg,brect,Scalar(255,0,0));imshow(,bg);waitKey();}二、MAT Mat。Mat是opencv中的一种非常重要的数据结构当刚开始使用时我仅仅把它当做一个储存图像的数据结构后来才慢慢理解它不仅可以储存二维矩阵也可以储存高维矩阵这在模式识别、机器学习中是非常常用的。对于这类问题我们就没有必要自己手动分配内存了直接使用它们就可以了。这个类的内容很多但opencv的帮助手册很好的帮我们理清的其中的内容。 typedef Matxfloat, 1, 2 Matx12f;
typedef Matxdouble, 1, 2 Matx12d;
...
typedef Matxfloat, 1, 6 Matx16f;
typedef Matxdouble, 1, 6 Matx16d;
typedef Matxfloat, 2, 1 Matx21f;
typedef Matxdouble, 2, 1 Matx21d;
...
typedef Matxfloat, 6, 1 Matx61f;
typedef Matxdouble, 6, 1 Matx61d;
typedef Matxfloat, 2, 2 Matx22f;
typedef Matxdouble, 2, 2 Matx22d;
...
typedef Matxfloat, 6, 6 Matx66f;
typedef Matxdouble, 6, 6 Matx66d;如果要使用灵活的矩形还是用Mat
int main(void)
{int sz[]{4,5,6};Mat img(3,sz,CV_8U);//3维数组coutimg.dimsendl;coutimg.size[0]endl;coutimg.size[1]endl;coutimg.size[2]endl;coutimg.step[0]endl;coutimg.step[1]endl;coutimg.step[2]endl;//遍历每个元素for(int i 0; i 4;i){for(int j 0; j 5;j){for(int k 0; k 6;k){cout(int)*(B.data B.step[0]*i B.step[1]*j B.step[2]*k)endl;}}}return 0;
}下面我们主要是看看Mat提供的函数。 首先是构造函数光构造函数就有很多种这里介绍几种常用的方式
1.使用(nrows, ncols, type)初始化2维矩阵
// 创建一个7*7的2通道浮点矩阵通常这样的矩阵用来表示复矩阵
Mat M(7,7,CV_32FC2,Scalar(1,3));
//改变为100*60的15通道uchar矩阵原先的数据将会被释放
M.create(100,60,CV_8UC(15));
创建高维矩阵
//创建100*100*100的3维矩阵
int sz[] {100, 100, 100};
Mat bigCube(3, sz, CV_8U, Scalar::all(0));
下面是一些简单的对整行、整列的操作
// 第5行*3 第3行这样的操作在线性代数中很常见
M.row(3) M.row(3) M.row(5)*3;// 把第7列拷贝到第1列
// M.col(1) M.col(7); // 不能这样写
Mat M1 M.col(1);
M.col(7).copyTo(M1);
用源图像的一部分创建新图像
// 创建一个320*240的图像
Mat img(Size(320,240),CV_8UC3);
// 选择感兴趣区域
Mat roi(img, Rect(10,10,100,100));
// 将区域改为绿色原图像也会发生修改
roi Scalar(0,255,0);int main(void)
{Mat A Mat::eye(5,5,CV_8U);Mat B A(Range::all(),Range(1,3));B.setTo(100);for(int i 0; i 5;i){for(int j 0; j 5;j){cout(int)A.atuchar(i,j)endl;}}return 0;
}如果需要深拷贝则使用clone方法。 对于初始化Mat还有其他的一些方法 比如Matlab风格的 zeros(), ones(), eye() M Mat::eye(M.rows, M.cols, CV_64F); Mat M (Mat_(3,3) 1, 0, 0, 0, 1, 0, 0, 0, 1); 如果是处理“外来”的数据那么则在构造函数中加上data则会非常方便的将外来数据转化为Mat结构 void process_video_frame(const unsigned char* pixels,int width, int height, int step)
{Mat img(height, width, CV_8UC3, pixels, step);GaussianBlur(img, img, Size(7,7), 1.5, 1.5);
}double m[3][3] {{a, b, c}, {d, e, f}, {g, h, i}};
Mat M Mat(3, 3, CV_64F, m).inv();特别的对于与opencv1.X中的IplImage结构的交互
IplImage* img cvLoadImage(greatwave.jpg, 1);
Mat mtx(img); // convert IplImage* - Mat
CvMat oldmat mtx; // convert Mat - CvMat读入图片image将image于result关联起来。OpenCV中一个重要的特点就是你不必事先指定图像的长、宽、像素深度等信息库函数会自动帮你完成。然后对image图像进行滤波显示滤波以后result图像的结果注意不是image的结果。 对于图像result程序中提供3种方式与图像image关联第一种是是用“”第二种是用copyTo第三种使用clone。运行代码可以发现当使用“”时对image的滤波会导致result的图像改变而使用clone或者copyTo不会引起result的改变。 原因是什么呢因为使用“”时并没有复制新的数据而只是让result指向image。它们指向的是内存中的同一份数据。等号操作以后image的引用计数1而已。这就是所谓的“浅拷贝”。而copyTo则是把矩阵的每个元素都重新拷贝给了result。copyTo不仅拷贝了矩阵元素值还复制了矩阵的一些其他信息。它们是所谓的“深拷贝”。 三、Vec类
下面介绍Vec类它其实是元素较少的向量。
typedef Vecuchar, 2 Vec2b;
typedef Vecuchar, 3 Vec3b;
typedef Vecuchar, 4 Vec4b;
typedef Vecshort, 2 Vec2s;
typedef Vecshort, 3 Vec3s;
typedef Vecshort, 4 Vec4s;
typedef Vecint, 2 Vec2i;
typedef Vecint, 3 Vec3i;
typedef Vecint, 4 Vec4i;
typedef Vecfloat, 2 Vec2f;
typedef Vecfloat, 3 Vec3f;
typedef Vecfloat, 4 Vec4f;
typedef Vecfloat, 6 Vec6f;
typedef Vecdouble, 2 Vec2d;
typedef Vecdouble, 3 Vec3d;
typedef Vecdouble, 4 Vec4d;
typedef Vecdouble, 6 Vec6d;它支持加、减、数乘、相等、不等、求范数等运算。 Scalar_类其实是用Vectp,4派生下来的也就是说它是一个4元组 typedef Scalar_Scalar; 他通常用来传递像素。 Range类用来指定连续的子序列。比如矩阵的一部分比较简单我们直接看定义 class CV_EXPORTS Range
{
public:Range();Range(int _start, int _end);Range(const CvSlice slice);int size() const;bool empty() const;static Range all();operator CvSlice() const;int start, end;};