OpenCV:基本画图操作

OpenCV有绘图函数,可以把想要的图形直接画到图像,分别为line()画直线、arrowedLine()带形状直线、rectangle()画矩形、circle()画圆、ellipse()画椭圆、fillConvexPoly()填充多边形drawContours()画轮廓、putText()显示文字。

下面介绍这些函数的简单用法
----------------------------------------------------------------------------------------------------

1  画直线 line 

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,int thickness = 1, int lineType = LINE_8, int shift = 0);
img:输入图像,直线画在该图像上
pt1:直线的起点
pt2:直线的终点
color:直线的颜色
thickness:直线的大小
lineType:直线类型
shift:直线的偏移量

2 画带箭头的直线 arrowedLine

void arrowedLine(InputOutputArray img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int line_type=8, int shift=0, double tipLength=0.1);

img:输入图像,直线画在该图像上
pt1:直线的起点
pt2:直线的终点
color:直线的颜色
thickness:直线的大小
lineType:直线类型
shift:直线的偏移量
tipLength:箭头占线段的比例

3 画矩形

void rectangle(CV_IN_OUT Mat& img, Rect rec, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);

img:输入图像,矩形画在该图像上
rec:矩形
color:矩形的颜色
thickness:矩形边的大小
lineType:矩形类型
shift:直线的偏移量

4  画圆形

void circle(InputOutputArray img, Point center, int radius, const Scalar& color, int thickness = 1, int lineType = LINE_8, int shift = 0);
img:输入图像,圆形画在该图像上
center:圆心
color:圆形的颜色
thickness:圆形边的大小
lineType:圆形类型
shift:圆形的偏移量

5  画椭圆

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:输入图像,椭圆画在该图像上
box:椭圆中心
axes:椭圆的尺寸
angle:椭圆的角度
startAngle:画椭圆的开始角度
endAngle:画椭圆的结束角度 
color:画椭的颜色
thickness:画椭边的大小
lineType:画椭类型
shift:画椭的偏移量

6  填充多边形

void fillConvexPoly(Mat& img, const Point* pts, int npts, const Scalar& color, int lineType = LINE_8, int shift = 0);
img:输入图像,多边形填充在该图上
pts:多边形的顶点集合
npts:多边形的顶点个数
color:填充多边形的颜色
lineType:填充多边的画笔类型
shift:多边形的偏移量

7  画轮廓点

void drawContours(InputOutputArray image, InputArrayOfArrays contours, int contourIdx, const Scalar& color, int thickness = 1, int lineType = LINE_8, InputArray hierarchy = noArray(), int maxLevel = INT_MAX, Point offset = Point() );
image:要绘制轮廓的图像
contours:所有输入的轮廓,每个轮廓被保存成一个point向量
contourIdx:指定要绘制轮廓的编号,如果是负数,则绘制所有的轮廓
color:绘制轮廓所用的颜色
thickness:绘制轮廓的线的粗细,如果是负数,则轮廓内部被填充
lineType:绘制轮廓的线的连通性
hierarchy:关于层级的可选参数,只有绘制部分轮廓时才会用到
maxLeve:绘制轮廓的最高级别,这个参数只有hierarchy有效的时候才有效
        maxLevel=0,绘制与输入轮廓属于同一等级的所有轮廓即输入轮廓和与其相邻的轮廓
        maxLevel=1, 绘制与输入轮廓同一等级的所有轮廓与其子节点。
        maxLevel=2,绘制与输入轮廓同一等级的所有轮廓与其子节点以及子节点的子节点
offset:轮廓点偏移量

8  显示文字

void putText(Mat& img, const string& text, Point org, int fontFace, double fontScale, Scalar color, int thickness=1, int lineType=8, bool bottomLeftOrigin=false);
img:输入图像,字显示在图上
text:输出到图像的文字
org:文字左下角位置。
fontFace:字体样式
fontScale:字体大小
color:字体颜色
thickness:构成字体的线条宽度
lineType:线条类型

以下是代码演示和结果显示

#include <stdio.h>
#include <vector>

#include <cv.h>
#include <highgui.h>
#include <cvblob.h>
#include <opencv2/opencv.hpp>

using namespace cv;
using namespace std;

int main()
{
    //创建一张白色大小为800x800的图片,所有绘图多在这图上实现
    Mat matSrc(800, 800, CV_8UC3, Scalar(255, 255, 255));
    Mat matClone = matSrc.clone();

    //画普通直线
    line(matSrc, Point(100, 50), Point(600, 50), Scalar(0, 0, 255), 1, LINE_8, 0);

    //画带箭头直线
    arrowedLine(matSrc, Point(100, 100), Point(600, 100), Scalar(0, 0, 255), 1, LINE_8, 0, 0.1);

    //画矩形
    rectangle(matSrc, Rect(100, 150, 500, 50), Scalar(0, 255, 0), 1, LINE_8, 0);

    //画圆
    circle(matSrc, Point(300, 300), 100, Scalar(0, 255, 0), 1, LINE_8, 0);

    //画椭圆
    ellipse(matSrc, Point(400, 400), Size(100, 60), -45, 0, 360, Scalar(0, 255, 0), 1, LINE_8, 0);

    //填充多边形
    Point pts[5];
    pts[0] = Point(500, 500);
    pts[1] = Point(700, 500);
    pts[2] = Point(750, 750);
    pts[3] = Point(450, 750);
    pts[4] = Point(500, 500);
    fillConvexPoly(matSrc, pts, 5, Scalar(0, 255, 0), LINE_8, 0);

    //画轮廓点
    vector<vector<Point> > vContours;
    vector<Vec4i> hierarchy;
    Mat matGray;
    cvtColor(matSrc, matGray, CV_BGR2GRAY);
    Mat matBinary(matSrc.rows, matSrc.cols, CV_8UC1);
    threshold(matGray, matBinary, 200, 255, THRESH_BINARY);
    findContours(matBinary, vContours, hierarchy, RETR_LIST, CHAIN_APPROX_NONE, Point(0, 0));
    drawContours(matClone, vContours, -1, Scalar(255, 0, 255));

    //显示文字
    putText(matSrc, string("opencv is open source"), Point(50, 650), 0, 1, Scalar(0, 128, 255), 1);

    //显示图像
    namedWindow("draw");
    namedWindow("Contours");
    imshow("draw", matSrc);
    imshow("Contours", matClone);
    cvWaitKey();

    return 0;
}

结果显示如下

参考文章:

1. https://blog.csdn.net/cwj066/article/details/84526331

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值