注意:
①cv::Point类型
②C++ STL中 vector的data()函数 :
std::vector::data() 是 C++ 中的 STL,它返回一个指向内存数组的直接指针,该内存数组由向量内部用于存储其拥有的元素。
vector_name.data()
参数:该函数不接受任何参数。
返回值:该函数返回一个指向数组中第一个元素的指针,该指针在向量内部使用。
// C++ program to demonstrate the // vector::date() function #include using namespace std; int main() { // initialising vector vector<int> vec = { 10, 20, 30, 40, 50 }; // memory pointer pointing to the // first element int* pos = vec.data(); // prints the vector cout << "The vector elements are: "; for (int i = 0; i < vec.size(); ++i) cout << *pos++ << " "; return 0; }③注意画多边形的时候,传入的是点集,简单版的可以直接传入vector
类型。 复杂版本的,需要 const Point**类型--->vector的data方法,构造一个数组。
- void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);
- //线的样式
- enum LineTypes
- {
- FILLED = -1,
- LINE_4 = 4, //!< 4-connected line
- LINE_8 = 8, //!< 8-connected line
- LINE_AA = 16 //!< antialiased line
- };
- /*******************************************************************
- * img: 绘制在那个图像上
- * pt1: 起点
- * pt2: 终点
- * color: 颜色
- * thickness: 厚度(宽度)
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- *********************************************************************/
- void circle(InputOutputArray img, Point center, int radius,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
- //线的样式
- enum LineTypes {
- FILLED = -1,
- LINE_4 = 4, //!< 4-connected line
- LINE_8 = 8, //!< 8-connected line
- LINE_AA = 16 //!< antialiased line
- };
- /*******************************************************************
- * img: 绘制在那个图像上
- * center: 圆心坐标
- * radius: 半径
- * color: 颜色
- * thickness: 厚度(宽度)
- * -1: 填充圆
- * 其他值: 空心
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- *********************************************************************/
- void rectangle(InputOutputArray img, Rect rec,const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
- /*******************************************************************
- * img: 绘制在那个图像上
- * rec: 矩形大小 Rect(x,y,w,h);
- * x,y: 起始坐标
- * w,h: 宽度和高度
- * color: 颜色
- * thickness: 厚度(宽度)
- * -1: 填充矩形
- * 其他值: 空心矩形
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- *********************************************************************/
- void ellipse(InputOutputArray img, Point center, Size axes,double angle, double startAngle, double endAngle,
- const Scalar& color, int thickness = 1,int lineType = LINE_8, int shift = 0);
- /*******************************************************************
- * img: 绘制在那个图像上
- * center: 椭圆圆心
- * axes: 矩形内置椭圆
- * angle: 倾斜角
- * startAngle: 扩展的弧度 0
- * endAngle: 扩展的弧度 360
- * color: 颜色
- * thickness: 线宽度
- * -1: 填充矩形
- * 其他值: 空心矩形
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- *********************************************************************/
- void polylines(InputOutputArray img, InputArrayOfArrays pts,bool isClosed, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0 );
- /*******************************************************************
- * img: 绘制在那个图像上
- * pts: 点集
- * isClosed: 是否封闭
- * color: 颜色
- * thickness: 厚度(宽度)
- * -1: 引发中断
- * 其他值: 空心矩形
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- *********************************************************************/
- void polylines(InputOutputArray img, const Point* const* pts, const int* npts,int ncontours, bool isClosed, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0 );
- /*******************************************************************
- * img: 绘制在那个图像上
- * pts: 点集
- * npts: 点数目
- * ncontours: 待绘制折线数
- * isClosed: 是否封闭
- * color: 颜色
- * thickness: 厚度(宽度)
- * -1: 应发中断
- * 其他值: 空心形状
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- *********************************************************************/
- void fillPoly(InputOutputArray img, InputArrayOfArrays pts,const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point() );
- /*******************************************************************
- * img: 绘制在那个图像上
- * pts: 点集
- * color: 颜色
- * thickness: 厚度(宽度)
- * -1: 引发中断
- * 其他值: 空心矩形
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- * offset: 忽略
- *********************************************************************/
- void fillPoly(InputOutputArray img, const Point** pts,const int* npts, int ncontours,const Scalar& color, int lineType = LINE_8, int shift = 0,Point offset = Point() );
- /*******************************************************************
- * img: 绘制在那个图像上
- * pts: 点集
- * npts: 点数
- * color: 颜色
- * ncontours: 待绘制折线数
- * thickness: 厚度(宽度)
- * -1: 引发中断
- * 其他值: 空心矩形
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * shift: 坐标点小数点位数(可忽略不写)
- * offset:
- *********************************************************************/
目前字体中只支持英文。
- void putText( InputOutputArray img, const String& text, Point org,int fontFace, double fontScale, Scalar color,int thickness = 1, int lineType = LINE_8,bool bottomLeftOrigin = false );
- /*******************************************************************
- * img: 绘制在那个图像上
- * text: 绘制文字
- * org: 文本框左下角
- * fontFace: 字体
- * fontScale: 缩放
- * color: 颜色
- * thickness 线宽度
- * lineType: 线的样式
- * FILLED: 线填充的
- * LINE_4: 4邻接连接线
- * LINE_8: 8邻接连接线
- * LINE_AA:反锯齿连接线(高斯滤波)
- * bottomLeftOrigin: 起点位置
- * true: 左上角 反转倒立显示
- * false: 左下角 正常显示
- *********************************************************************/
- //opencv 不识别汉字
- //fontFace: 字体
- enum HersheyFonts {
- FONT_HERSHEY_SIMPLEX = 0, //!< normal size sans-serif font //灯芯体
- FONT_HERSHEY_PLAIN = 1, //!< small size sans-serif font
- FONT_HERSHEY_DUPLEX = 2, //!< normal size sans-serif font (more complex than FONT_HERSHEY_SIMPLEX)
- FONT_HERSHEY_COMPLEX = 3, //!< normal size serif font
- FONT_HERSHEY_TRIPLEX = 4, //!< normal size serif font (more complex than FONT_HERSHEY_COMPLEX)
- FONT_HERSHEY_COMPLEX_SMALL = 5, //!< smaller version of FONT_HERSHEY_COMPLEX
- FONT_HERSHEY_SCRIPT_SIMPLEX = 6, //!< hand-writing style font
- FONT_HERSHEY_SCRIPT_COMPLEX = 7, //!< more complex variant of FONT_HERSHEY_SCRIPT_SIMPLEX
- FONT_ITALIC = 16 //!< flag for italic font
- };
- #include
- #include
- #include
- #include
- #include
- using namespace std;
- using namespace cv;
- class Shape
- {
- public:
- Shape() :mat(imread("mm.jpg")) {}
- void DrawLine(int x = 0, int y = 0, int xx = 600, int yy = 460)
- {
- line(mat, Point(x, y), Point(xx, yy), Scalar(0, 0, 255), 2, LINE_AA);
- }
- void DrawCircle(int x = 300, int y = 230, int r = 10)
- {
- circle(mat, Point(x, y), r, Scalar(0, 255, 0), -1, FILLED); //填充圆
- circle(mat, Point(x, y), r+2, Scalar(0, 0, 255), 2, FILLED); //空心圆
- }
- void DrawRectangle(int x = 100, int y = 100, int w = 40, int h = 40)
- {
- rectangle(mat, Rect(x, y, w, h), Scalar(255, 0, 0), -1, LINE_4);
- rectangle(mat, Rect(x - 1, y - 1, w + 2, h + 2), Scalar(0, 255, 0));
- }
- void DrawEllipse(int x = 400, int y = 200, Size size = { 100,200 })
- {
- ellipse(mat, Point(x, y), size, 180, 0, 360, Scalar(255, 0, 0),1);
- ellipse(mat, Point(x, y), size, 90, 0, 360, Scalar(255, 0, 0),-1);
- }
- void DrawText()
- {
- putText(mat, "opencv test draw shape", Point(50, 50), FONT_ITALIC, 1.0, Scalar(0, 0, 255),
- 2,LINE_AA,false);
- }
- void Show(string wName = "shape")
- {
- imshow(wName, mat);
- waitKey(0);
- }
- void DrawPolygon()
- {
- vector
pixel; - for (int i = 0; i < 5; i++)
- {
- pixel.push_back(Point(rand() % 600, rand() % 460));
- }
- //简单版本
- polylines(mat, pixel, true, Scalar(0, 0, 255), 2);
- fillPoly(mat, pixel, Scalar(0, 255, 0), 1);
-
- //复杂版本
- //int size = 5;
- //auto p = pixel.data();
- //polylines(mat, &p, &size, 1, true, Scalar(0, 0, 255),1);
- //const Point** pts = const_cast
(&p); - //fillPoly(mat, pts, &size, 1, Scalar(255, 0, 255),1);
- }
- protected:
- Mat mat;
- };
- int main()
- {
- srand((unsigned int)time(nullptr));
- Shape* pshape = new Shape;
- pshape->DrawLine();
- pshape->DrawCircle();
- pshape->DrawRectangle();
- pshape->DrawEllipse();
- pshape->DrawText();
- pshape->DrawPolygon();
-
- pshape->Show();
- delete pshape;
- return 0;
- }