文章目录
- 一、颜色:Scalar类
-
- 1.三个值
- 2.全部相同all()
- 3.作用
-
- (1)用作颜色
- (2)用作图像
- 二、Vec< T,n >类
-
- 1.关系
- 2.例子
- 三、二维点Point_<_Tp>类
-
- 1.Point、Point2i、Point2f、Point2d
- 2.属性
- 3.例子
- 四、三维点Point3_<_Tp>类
- 五、尺寸Size_< _Tp >类
-
- 1.Size、Size2i、Size2f
- 2.属性
- 六、矩形Rect_< _Tp >类
-
- 1.Rect、Rect2i、Rect2f、Rect2d
- 2.属性
- 3.运算
- 七、RotatedRect
- 八、Ptr
一、颜色:Scalar类
Scalar类用来设定像素的通道值
1.三个值
Scalar(int blue,int green,int red)
每个值的范围是[0,255],负数就是0,超过255就是255。
如:
Scalar color=Scalar(193,0,0);
//对应rgb=(0,0,193),蓝色
2.全部相同all()
Scalar::all(value)
如:
Scalar color=Scalar::all(255);
//纯白
PS:0
Scalar()
即0
3.作用
(1)用作颜色
#include<opencv2/opencv.hpp>
using namespace cv;int main()
{
Mat dstImage=Mat::zeros(300,400,CV_8UC3);line(dstImage,Point(100,200),Point(250,100),Scalar(255,102,0));imshow("dstImage",dstImage);waitKey();return 0;
}
(2)用作图像
image=Scalar(100,200,150);
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace std;
using namespace cv;int main()
{
//全白的图像Mat image=Mat::ones(300,400,CV_8UC3);imshow("origin",image);//整个图像设定一种新的颜色image=Scalar(100,200,150);imshow("image",image);waitKey();return 0;
}
PS:颜色表:
http://tool.oschina.net/commons?type=3
二、Vec< T,n >类
1.关系
Vex<T,n>
:n个T类型的值
存储为列向量的形式。
2.例子
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main()
{
Vec3i v(1,2,3);cout<<v<<endl;//[1, 2, 3]cout<<v.rows<<endl;//3cout<<v.cols<<endl;//1cout<<v.row(0)<<endl;//[1]cout<<v.col(0)<<endl;/*[1;2;3]*/return 0;
}
三、二维点Point_<_Tp>类
1.Point、Point2i、Point2f、Point2d
Point_<_Tp>是模板类,衍生有
Point
(Point2i
):其实就是Point_<int>
Point2f
:其实就是Point_<float>
Point2d
:其实就是Point_<double>
2.属性
Point<_Tp>
类的成员变量:
_Tp x
:横_Tp y
:纵
构造函数:
-
Point_ ()
default constructor More… -
Point_ (_Tp _x, _Tp _y)
-
Point_ (const Point_ &pt)
-
Point_ (const Size_< _Tp > &sz)
-
Point_ (const Vec< _Tp, 2 > &v)
Point<_Tp>
类的成员函数:
dot()
dot product
点乘
template<typename _Tp> inline
_Tp Point_<_Tp>::dot(const Point_& pt) const
{
return saturate_cast<_Tp>(x*pt.x + y*pt.y);
}
ddot()
dot product computed in double-precision arithmetics
double运算形式的点乘
template<typename _Tp> inline
double Point_<_Tp>::ddot(const Point_& pt) const
{
return (double)x*pt.x + (double)y*pt.y;
}
cross()
cross-product
交叉相乘
template<typename _Tp> inline
double Point_<_Tp>::cross(const Point_& pt) const
{
return (double)x*pt.y - (double)y*pt.x;
}
inside()
checks whether the point is inside the specified rectangle
是否在矩形内部(在边上就不是)
template<typename _Tp> inline bool
Point_<_Tp>::inside( const Rect_<_Tp>& r ) const
{
return r.contains(*this);
}
例子
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main()
{
Point p1(100,200), p2(300,400);cout<< p1.x<<' '<<p1.y<<endl;//100 200cout<< p1.dot(p2) <<endl;//110000//100*300+200*400=30000+80000=110000cout<< p1.ddot(p2) <<endl;//110000cout<< p1.cross(p2) <<endl;//-20000//(double)x1*y2 - (double)y1*x2//100*400-200*300=40000-6000=-20000cout<< p1.inside(Rect(0,0,300,300)) <<endl;//1cout<< p1.inside(Rect(0,0,200,200)) <<endl;//0return 0;
}
3.例子
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main()
{
Point p1(100,200), p2(300,400);cout<< p1+p2<<endl;//[400, 600]cout<< p1*10 <<endl;//[1000, 2000]cout<< p1/9 <<endl;//[11, 22]cout<< (p1==p2) <<endl;//0cout<< (p1!=p2) <<endl;//1return 0;
}
四、三维点Point3_<_Tp>类
typedef Point3_<int> Point3i;
typedef Point3_<float> Point3f;
typedef Point3_<double> Point3d;
就只是多了个成员变量_Tp z
三维浮点
Point3f p1(5.4,6,7.4);
cout<<p1.x<<' '<<p1.y<<' '<<p1.z<<endl;
//5.4 6 7.4
cout<<p1<<endl;
//[5.4, 6, 7.4]
五、尺寸Size_< _Tp >类
1.Size、Size2i、Size2f
衍生有
Size
(Size2i
):其实就是Size_<int>
Size2f
:其实就是Size_<float>
2.属性
Size_<_Tp>
类的成员变量:
_Tp width
:宽_Tp height
:高
构造函数:
-
Size_ ()
default constructor More… -
Size_ (_Tp _width, _Tp _height)
-
Size_ (const Size_ &sz)
-
Size_ (const Point_< _Tp > &pt)
Size_<_Tp>
的成员函数
_Tp area () const
the area (width*height)。 面积(宽×高)的结果
如:
#include<opencv2/opencv.hpp>
#include<iostream>
using namespace cv;
using namespace std;int main()
{
Size s=Size(5,6);cout<<s.width<<' '<<s.height<<endl;//5 6cout<<s.area()<<endl;//30return 0;
}
六、矩形Rect_< _Tp >类
1.Rect、Rect2i、Rect2f、Rect2d
Rect_< _Tp >是模板类,衍生有
Rect
(Rect2i
):其实就是Rect_<int>
Rect2f
:其实就是Rect_<float>
Rect2d
:其实就是Rect_<double>
这些衍生物当然具有和Rect_<_Tp>
一样的属性
2.属性
Rect_<_Tp>
类的成员变量:
_Tp x
:左上角的横,可以是负数_Tp y
:左上角的纵,可以是负数_Tp width
:宽。正右负左_Tp height
:高。正下负上。
构造函数:
-
Rect_ ()
default constructor More… -
Rect_ (_Tp _x, _Tp _y, _Tp _width, _Tp _height)
左上的横,左上的纵,宽,高 -
Rect_ (const Rect_ &r)
-
Rect_ (const Point_< _Tp > &org, const Size_< _Tp > &sz)
左上点和右下点 -
Rect_ (const Point_< _Tp > &pt1, const Point_< _Tp > &pt2)
Rect_<_Tp>
类的成员函数:
Point_< _Tp > tl()
:以Size类的形式返回左上角的坐标(top-left)Point_< _Tp > br()
:以Size类的形式返回右下角的坐标(bottom-right)Size_< _Tp > size()
:长x宽,[width x height]_Tp area()
:面积bool contains(Point)
:判断一个点是否包含在矩形区域内
这里拿Rect来做例子
Rect r=Rect(0,0,200,200);
cout<<r.x<<endl; //0
cout<<r.tl()<<endl; //[0, 0]
cout<<r.br()<<endl; //[200, 200]
cout<<r.size()<<endl; //[200 x 200]
cout<<r.area()<<endl; //40000
cout<<r.contains(Point(50,50))<<endl; //1
3.运算
- rect += point, rect -= point, rect += size, rect -= size (augmenting operations):
增加左上角点的坐标 - rect = rect1 & rect2 (rectangle intersection)
两个矩形区域之间重叠的部分。如果不重叠的话,不会报错,也会返回矩形,[0 x 0 from (0, 0)]
例如:可以用于只取图片内的部分,可能有图片外界的部分的Rect & Rect(0,0,图片宽,图片高)
,这样就在图片内了。注意,检测是否不重叠,返回[0 x 0 from (0, 0)]
。 - rect = rect1 | rect2 (minimum area rectangle containing rect1 and rect2 )
一个能包含住两个矩形区域的最小的矩形 - rect == rect1, rect != rect1 (rectangle comparison)
矩形区域是否是同一块
#include<iostream>
#include<opencv2/opencv.hpp>
using namespace std;
using namespace cv;int main()
{
Rect r1(Point(100,100),Point(300,300));Point p1(10,20);r1+=p1;cout<<r1<<endl;//[200 x 200 from (110, 120)]r1-=p1;cout<<r1<<endl;//[200 x 200 from (100, 100)]Rect r2(Point(50,120),Point(350,280));cout<< (r1 & r2) <<endl;//[200 x 160 from (100, 120)]cout<< (r1 | r2) <<endl;//[300 x 200 from (50, 100)]cout<< (r1 == r2) <<endl;//0cout<< (r1 != r2) <<endl;//1return 0;
}
七、RotatedRect
OpenCV之RotatedRect基本用法和角度探究
八、Ptr
万能指针,自动匹配任意类型,自动释放
Ptr <T>
比如:原来的int *b=&a;
可以写成Ptr<int> b=&a