OpenCV7---绘制形状文字

七、绘制形状和文字
1、在图片中绘制一条线
Point表示2D平面上的一个点,可用以下两个方式定义

Point p;
p1.x = 10; p1.y = 8;//第一种
p = Point(10, 8);//第二种

画线用到函数line( );

void MyLines() {//划线函数定义
    Point p1 = Point(20, 30);//定义线的起始点
    Point p2 = Point(300, 300);//定义线的终点
    //p2.x = 300;
    //p2.y = 300;
    Scalar color = Scalar(0, 0, 255);//定义线的颜色
    line(image, p1, p2, color, 1, LINE_8);//在图片src中生成一条线,从点p1到点p2,颜色为color, 线的宽度为1,类型为LINE_8
    //line(src, p1, p2, color, 1, LINE_AA);//类型为LINE_AA,反锯齿类型,生成的线更平滑
}

显示效果:
在这里插入图片描述
2、绘制长方形框

绘制长方形框用到函数rectangle( );

void MyRectangle() {//画长方形框函数定义
    Rect rect = Rect(20, 30, 300, 300);//定义长方形框的起点(20,30),长宽分别为300和300
    Scalar color = Scalar(255, 0, 0);//定义长方形框的颜色
    rectangle(src, rect, color, 2, LINE_8);在图片src中生成一个长方形框,参数为rect,颜色为color,线宽为2,类型为LINE_8
}

显示效果:
在这里插入图片描述
3、绘制椭圆
绘制椭圆用函数ellipse( ),可以通过调节倾斜度数得到不同朝向的椭圆,可以通过调节显示范围得到弧形。

void MyEllipse() {//画椭圆函数定义
    Scalar color = Scalar(0, 255, 0);//定义椭圆颜色
    ellipse(src, Point(src.cols / 2, src.rows / 2), Size(src.cols / 4, src.rows / 8), 90, 0, 360, color, 2, LINE_8);//在图片src中生成一个椭圆框,中心点为Point,长短轴参数在Size中,倾斜角度为90°,显示范围为0-360°,颜色为color,线长为2,类型为LINE_8
}

显示效果:
在这里插入图片描述
4、绘制圆形
绘制圆形用函数circle( );

void MyCircle() {//画圆函数定义
    Scalar color = Scalar(0, 255, 255);//定义圆的颜色
    Point center = Point(src.cols / 2, src.rows / 2);//定义圆的圆心
    circle(src, center, 150, color, 2, 8);//在图片src中生成一个圆,圆心坐标为Point,半径为150,颜色为color,线宽为2,类型为LINE_8
}

显示效果:
在这里插入图片描述
5、绘制填充图形
填充图形用函数fillPoly( );

void MyPolygon() {//填充函数定义
    Point pts[2][5];//声明填充范围轮廓点的坐标,为一个2维数组,第一维代表有几个填充范围,第二维代表该范围的边界点,最终应传出指向某一个填充范围的指针
    pts[0][0] = Point(100, 100);    
    pts[0][1] = Point(100, 200);
    pts[0][2] = Point(200, 200);
    pts[0][3] = Point(200, 100);
    pts[0][4] = Point(100, 100);

    pts[1][0] = Point(300, 300);
    pts[1][1] = Point(300, 400);
    pts[1][2] = Point(400, 400);
    pts[1][3] = Point(400, 300);
    pts[1][4] = Point(300, 300);

    const Point* ppts[] = { pts[0], pts[1] };//指向第0个轮廓的指针
    int npt[] = { 5, 5 };//数组中存放每一个轮廓的轮廓点数
    Scalar color = Scalar(255, 12, 255);//定义轮廓颜色

    fillPoly(src, ppts, npt, 2, color, 8);//在图片src中填充一个范围,ppts中存放着这个轮廓信息的位置,npt代表该轮廓有几个轮廓点,2代表填充的轮廓数目
}

显示效果:
在这里插入图片描述
6、打印文字
打印文字用到函数putText( );

putText(src, "Hello OpenCV", Point(100, 200), FONT_HERSHEY_COMPLEX, 1.0, Scalar(12, 255, 200), 2, 8);//在屏幕上点Point处打印文字"Hello OpenCV",字体类型为FONT_HERSHEY_COMPLEX,放缩程度为1.0,后3个参数为颜色,线宽,类型

显示效果:
在这里插入图片描述
7、生成随机线
随机数生成cv::RNG

  • 随机数生成器RNG rng(12345);
  • 生成正态分布随机数uniform(int a, int b),随机生成啊[a, b)之间的数
void RandomLineDemo() {//生成随机线函数定义
    RNG rng(12345);//生成高斯随机函数
    Point pt1;
    Point pt2;
    Mat dst = Mat::zeros(src.size(), src.type());//构造新的一张与图片src大小类型一致的黑图dst

    for (int i = 0; i < 100000; i++) {//执行100000次,不断生成随机线
        pt1.x = rng.uniform(0, src.cols);//第1个点x坐标生成正态分布随机数0到src.cols之间
        pt2.x = rng.uniform(0, src.cols);
        pt1.y = rng.uniform(0, src.rows);
        pt2.y = rng.uniform(0, src.rows);
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));//随机生成颜色值
        if (waitKey(50) > 0) {//直到有按键按下才会结束
            break;
        }
        
        line(dst, pt1, pt2, color, 1, 8);//随机划线
        imshow("random line demo", dst);
    }
}

显示效果:
在这里插入图片描述
示例代码(绘制图片文字综合):

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;

void MyLines();//划线函数声明
void MyRectangle();//画长方形框函数声明
void MyEllipse();//画椭圆函数声明
void MyCircle();//画圆函数声明
void MyPolygon();//填充函数声明
void RandomLineDemo();
Mat src;//定义一个全局的图片

int main(int argc, char** argv) {
    src = imread("C:/Users/26839/Pictures/测试.png");
    if (!src.data) {
        cout << "could not load image...\n" << endl;
        return -1;
    }
    imshow("yuantupian", src);

    MyLines();//调用划线函数
    MyRectangle();//调用长方形框函数
    MyEllipse();//调用画椭圆函数
    MyCircle();//调用画圆函数
    MyPolygon();//调用填充函数
    
    putText(src, "Hello OpenCV", Point(100, 200), FONT_HERSHEY_COMPLEX, 1.0,       Scalar(12, 255, 200), 2, 8);//在屏幕上点Point处打印文字"Hello OpenCV",字体类型为FONT_HERSHEY_COMPLEX,放缩程度为1.0,后3个参数为颜色,线宽,类型
    imshow("input", src);
     //RandomLineDemo();//声明生成随机线函数
     waitKey(0);
     destroyAllWindows();
     return 0;
}

void MyLines() {
    Point p1 = Point(20, 30);
    Point p2 = Point(300, 300);
    Scalar color = Scalar(0, 0, 255);
    line(src, p1, p2, color, 1, LINE_8);
}

void MyRectangle() {//画长方形框函数定义
    Rect rect = Rect(20, 30, 300, 300);//定义长方形框的起点(20,30),长宽分别为300和300
    Scalar color = Scalar(255, 0, 0);//定义长方形框的颜色
    rectangle(src, rect, color, 2, LINE_8);在图片src中生成一个长方形框,参数为rect,颜色为color,线宽为2,类型为LINE_8
}

void MyEllipse() {//画椭圆函数定义
    Scalar color = Scalar(0, 255, 0);//定义椭圆颜色
    ellipse(src, Point(src.cols / 2, src.rows / 2), Size(src.cols / 4, src.rows / 8), 90, 0, 360, color, 2, LINE_8);//在图片src中生成一个椭圆框,中心点为Point,长短轴参数在Size中,倾斜角度为90°,显示范围为0-360°,颜色为color,线长为2,类型为LINE_8
}

void MyCircle() {//画圆函数定义
    Scalar color = Scalar(0, 255, 255);//定义圆的颜色
    Point center = Point(src.cols / 2, src.rows / 2);//定义圆的圆心
    circle(src, center, 150, color, 2, 8);//在图片src中生成一个圆,圆心坐标为Point,半径为150,颜色为color,线宽为2,类型为LINE_8
}

void MyPolygon() {//填充函数定义
    Point pts[2][5];//声明填充范围轮廓点的坐标,为一个2维数组,第一维代表有几个填充范围,第二维代表该范围的边界点,最终应传出指向某一个填充范围的指针
    pts[0][0] = Point(100, 100);
    pts[0][1] = Point(100, 200);
    pts[0][2] = Point(200, 200);
    pts[0][3] = Point(200, 100);
    pts[0][4] = Point(100, 100);

    pts[1][0] = Point(300, 300);
    pts[1][1] = Point(300, 400);
    pts[1][2] = Point(400, 400);
    pts[1][3] = Point(400, 300);
    pts[1][4] = Point(300, 300);

    const Point* ppts[] = { pts[0], pts[1] };//指向第0个轮廓的指针
    int npt[] = { 5, 5 };//数组中存放每一个轮廓的轮廓点数
    Scalar color = Scalar(255, 12, 255);//定义轮廓颜色

    fillPoly(src, ppts, npt, 2, color, 8);//在图片src中填充一个范围,ppts中存放着这个轮廓信息的位置,npt代表该轮廓有几个轮廓点,2代表填充的轮廓数目
}

输出结果如下:
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值