opencv 画图

learning opencv 第6章第1题解决方案

前言

opencv提供了丰富的函数用以图形绘制,包括矩形,线条,椭圆和多边形等,本篇文章对opencv的基本绘图函数做了一些介绍和说明。

椭圆绘制

绘制椭圆的函数说明和参数说明如下:

 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);
@param InputOutputArray img  防止椭圆的图像
@param Point center 椭圆的中心
@param Szie axes 椭圆长短轴的尺寸
@param double angle 椭圆的角度(一个完整的椭圆应该有360度)
@param double startAngle 椭圆的的起始角度(第一象限按照逆时针开始计算)
@param double endAngle 椭圆的结束角度
@param const Scalar& color 椭圆的颜色(BGR表示)
@param int thickness 椭圆边框的粗细程度
@param int lineType 椭圆边框的连接类型,默认为8领域连接
@param int shift 中心坐标和轴的小数位数,一般是0

绘制一个椭圆的代码如下所示:

ellipse(img, Point(455,120),
                Size(126, 80), 360.0, 0.0, 360.0, Scalar(0, 0, 255), 1, 8, 0);

绘制单个多边形

opencv绘制多边形的函数说明如下,其基本参数与绘制椭圆的参数相似,需要注意的是,表述多边形顶点的参数,是一个Point 类型的数组

void fillConvexPoly(InputOutputArray img, const Point* pts, int npts,
                               const Scalar& color, int lineType = LINE_8,
                               int shift = 0);

绘制多个多边形

opencv 也提供了绘制多个多边形的函数,其说明如下,其基本参数与其他绘图函数的参数基本相同,不过,在表述多边形顶点的参数用到了二维数组和一维数组,如下:

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() );
@param const Point ** pts, 表示多个多边形顶点坐标的二维数组,如m个多边形,每个多边形有n个顶点
@param const int* npts, 多边形顶点数组成的一维数组
@param int ncontours,绘制多边形的个数
@param offset=Point(), 轮廓所有点可选偏移,一般保持默认即可 

绘制两个六边形的一个实例如下代码所示:

Point pt[2][6] = { {Point(100,100),Point(80,150),Point(100,200),
                Point(150,200),Point(170,150),Point(150,100)},
                {Point(300,300),Point(250,350),Point(300,400),Point(400,400),
                Point(450,350),Point(400,300)} };
int n[] = { 6,6 };
const Point* pp[] = { pt[0],pt[1] };
            
fillPoly(img, pp,n,2,Scalar(150, 186, 205), 8, 0);

以上代码绘制的多边形是填充后的多边形,opencv也提供了不带填充的多边形绘制函数,如下所示:

 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 );

绘制线段

opencv提供了绘制线段的函数,其实现比较简单,由两个起点坐标和终点坐标两个参数决定:

void line(InputOutputArray img, Point pt1, Point pt2, const Scalar& color,
                     int thickness = 1, int lineType = LINE_8, int shift = 0);

总结

综上,回顾了opencv中几个基本的绘图函数,由以上几个示例,完成的一个opencv绘图的基本示例如下代码所示:

首先,未绘制任何图像的图像如下图所示:


总体实现代码如下:

#include<iostream>
#include<opencv2/opencv.hpp>
/* (1) Load or create and display a color image
*  (2) Draw one example of every shape and line that opencv can draw
*
*/
using namespace cv;
int main()
{
    Mat img = imread("daminggong.PNG");
    int s = 0;
    int width = img.rows;
    int height = img.cols;
    std::cout << "\r\t在图像上绘制图形" << std::endl;
    std::cout << "\r\t输入0,绘制椭圆" << std::endl;
    std::cout << "\r\t输入1,绘制多边形" << std::endl;
    std::cout << "\r\t输入2,绘制多个填充多边形" << std::endl;
    std::cout << "\r\t输入3,绘制线段" << std::endl;
    std::cout << "\r\t输入4,绘制无填充多边形" << std::endl;
    std::cout << "\r\t输入99,结束绘制" << std::endl;
    while (std::cin >> s)
    { 
        // 画个椭圆
        if (s == 0)
        {
            ellipse(img, Point(455,120),
                Size(126, 80), 360.0, 0.0, 360.0, Scalar(0, 0, 255), 1, 8, 0);
        }
        //绘制多边形
        else if (s == 1)
        {
            //多个顶点的坐标
            Point PointArray[4] = {Point(50,50),Point(50,100),Point(100,100),Point(100,50) };
            
            fillConvexPoly(img,PointArray,4,Scalar(34,180,238),8,0);
        }//绘制两个多边形
        else if (s == 2)
        {
            Point pt[2][6] = { {Point(100,100),Point(80,150),Point(100,200),
                Point(150,200),Point(170,150),Point(150,100)},
                {Point(300,300),Point(250,350),Point(300,400),Point(400,400),
                Point(450,350),Point(400,300)} };
            int n[] = { 6,6 };
            const Point* pp[] = { pt[0],pt[1] };
            
            fillPoly(img, pp,n,2,Scalar(150, 186, 205), 8, 0);
        }
        //绘制线
        else if (s == 3)
        {
            line(img, Point(720,100), Point(720, 400), Scalar(255, 255, 0),2, 8, 0);
        }
        else if (s == 4)
        {
            Point pt_line[1][5] = { {Point(650,250),Point(600,300),Point(630,350),
                Point(680,350),Point(700,300)} };
                
            int count[] = {5};
            const Point *p_line[] = {pt_line[0]};
            polylines(img, p_line,count,1,1,Scalar(0, 255, 160), 2, 8, 0);
        }
        else if(s==99)
        {
            break;
        }
        else
        {
            std::cerr << "输入错误,请输入0-4之间的整数" << std::endl;
            continue;
        }
    }
    imshow("img_ed", img);
    imwrite("img_ed.PNG", img);
    waitKey(0);
    return 0;
}

实现所有代码后,其效果如下:


最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 213,558评论 6 492
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,002评论 3 387
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 159,036评论 0 349
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,024评论 1 285
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,144评论 6 385
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,255评论 1 292
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,295评论 3 412
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,068评论 0 268
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,478评论 1 305
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 36,789评论 2 327
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 38,965评论 1 341
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,649评论 4 336
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,267评论 3 318
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 30,982评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,223评论 1 267
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 46,800评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 43,847评论 2 351

推荐阅读更多精彩内容