OpenCV学习_ios平台(三):基本绘图

demo地址:
https://github.com/GoldenRocking/OpenCV_iOS
一.直线:

void cvLine{
     CvArr*           array,              //一般为一个图像类型的指针IplImage*
     CvPoint           pt1,               //起始点坐标
     CvPoint           pt2,               //结束点坐标
     CvScalar         color,              //颜色
     int            thickness  = 1,         //  线的粗细(像素)
     int            connectivity  = 8      //反走样模式         
}

二.矩形:

void cvRectangle{
     CvArr*           array,            
     CvPoint           pt1,               //顶点坐标1
     CvPoint           pt2,               //顶点坐标2
     CvScalar         color,              //颜色
     int            thickness  = 1,       //  线的粗细(像素)      
}

三.圆:

void cvCircle{
     CvArr*           array,            
     CvPoint           center,             //圆心
     int               radius,             //半径
     CvScalar          color,              //颜色
     int            thickness  = 1,        //线的粗细(像素) 
     int            connectivity  = 8      //反走样模式         
}

四.椭圆:

void cvEllipse{
     CvArr*             array,            
     CvPoint            center,              //圆心
     CVSize              axes,               //椭圆的长短半轴长度
     double              angle,              //偏离主轴的角度
     double             start_angle,         //弧度开始位置的角度
     double             end_angle,           //弧度结束位置的角度
     CvScalar            color,              //颜色
     int               thickness  = 1,       //线的粗细(像素) 
     int               connectivity  = 8      //反走样模式         
}

五.椭圆(外接矩形):

void cvEllipse{
     CvArr*             array,            
    CvBox2D             box,
     CvScalar           color,              //颜色
     int               thickness  = 1,       //线的粗细(像素) 
     int               connectivity  = 8,      //反走样模式  
     int               shift = 0       
}

//CvBox2D的数据结构:
tydef struct {
      CvPoint2D32f       center;
      CvSize2D32f         size;
      float               angle;
}  CvBox2D

六.多边形

void cvFillPoly{
      CvArr*               img,
      CvPoint**            pst,
      int*                 npts,
      int                 contours,
      CvScallar            color,
      int                 line_type  =  8
}

void cvFillConvexPoly{
      CvArr*               img,
      CvPoint*             pst,
      int                  npts,
      CvScallar            color,
      int                 line_type  =  8
}

void cvPolyLine{
      CvArr*                img,
      CvPoint**             pst,
      int*                  npts,
      int                   contours,
      int                   is_closed, 
      CvScallar             color,
      int                   thickness = 1,
      int                   line_type  =  8
}

下面我们根据基本绘图函数,来绘制两张图像。

先创建一个绘图的工具:

#ifndef drawTool_hpp
#define drawTool_hpp

#include <stdio.h>
using namespace cv;
void MyEllipse(Mat img,double angle,int w);
void MyFilledCircle(Mat img,cv::Point center);
void MyPolygon( Mat img,int w);
void MyLine( Mat img, cv::Point start, cv::Point end );

#endif /* drawTool_hpp */

#include "drawTool.hpp"


void MyEllipse(Mat img,double angle,int w)
{
    int thickness = 2;
    int lineType = 8;
    
    ellipse(img,
            cv::Point(w/2.0,w/2.0),
            cv::Size(w/4.0,w/16.0),
            angle,
            0,
            360,
            Scalar(255,0,0),
            thickness,
            lineType
            );
}

void MyFilledCircle(Mat img,cv::Point center)
{
    int thickness = -1;
    int lineType = 8;
    
    cv::circle( img,
               center,
               300/32.0,
               cv:: Scalar( 0, 0, 255 ),
               thickness,
               lineType );
}

void MyPolygon( Mat img,int w )
{
    int lineType = 8;
    
    /** 创建一些点 */
    cv::Point rook_points[1][20];
    rook_points[0][0] = cv::Point( w/4.0, 7*w/8.0 );
    rook_points[0][1] = cv::Point( 3*w/4.0, 7*w/8.0 );
    rook_points[0][2] = cv::Point( 3*w/4.0, 13*w/16.0 );
    rook_points[0][3] = cv::Point( 11*w/16.0, 13*w/16.0 );
    rook_points[0][4] = cv::Point( 19*w/32.0, 3*w/8.0 );
    rook_points[0][5] = cv::Point( 3*w/4.0, 3*w/8.0 );
    rook_points[0][6] = cv::Point( 3*w/4.0, w/8.0 );
    rook_points[0][7] = cv::Point( 26*w/40.0, w/8.0 );
    rook_points[0][8] = cv::Point( 26*w/40.0, w/4.0 );
    rook_points[0][9] = cv::Point( 22*w/40.0, w/4.0 );
    rook_points[0][10] = cv::Point( 22*w/40.0, w/8.0 );
    rook_points[0][11] = cv::Point( 18*w/40.0, w/8.0 );
    rook_points[0][12] = cv::Point( 18*w/40.0, w/4.0 );
    rook_points[0][13] = cv::Point( 14*w/40.0, w/4.0 );
    rook_points[0][14] = cv::Point( 14*w/40.0, w/8.0 );
    rook_points[0][15] = cv::Point( w/4.0, w/8.0 );
    rook_points[0][16] = cv::Point( w/4.0, 3*w/8.0 );
    rook_points[0][17] = cv::Point( 13*w/32.0, 3*w/8.0 );
    rook_points[0][18] = cv::Point( 5*w/16.0, 13*w/16.0 );
    rook_points[0][19] = cv::Point( w/4.0, 13*w/16.0) ;
    
    const cv::Point* ppt[1] = { rook_points[0] };
    int npt[] = { 20 };
    
    fillPoly( img,
             ppt,
             npt,
             1,
             Scalar( 255, 255, 255 ),
             lineType );
}

void MyLine( Mat img, cv::Point start, cv::Point end )
{
    int thickness = 2;
    int lineType = 8;
    line( img,
         start,
         end,
         Scalar( 0, 0, 0 ),
         thickness,
         lineType );
}

首先,我们绘制一个基本的原子::


const int w = 300;
/// 创建空全黑像素的空图像
    Mat atom_image = Mat::zeros(w, w, CV_8UC3);

/// 1. 画一个简单的原子。

   
    /// 1.a. 创建椭圆
   MyEllipse(atom_image, 90,w);
    MyEllipse(atom_image, 0,w);
    MyEllipse(atom_image, 45,w);
    MyEllipse(atom_image, -45,w);

    /// 1.b. 创建圆
    MyFilledCircle( atom_image, cv::Point( w/2.0, w/2.0) );
    
    UIImageView *img = [[UIImageView alloc]init];
    img.frame = CGRectMake(10, 0, w, w);
    [img setImage:[cvprocess UIImageFromCVMat:atom_image ]];
    
    [self.view addSubview:img];
    

然后,我们再绘制一个赌棍:

调用:

/// 创建空全黑像素的空图像
 
    Mat rook_image = Mat::zeros(w, w, CV_8UC3);
   /// 2. 画一个赌棍
    
    /// 2.a. 创建一个凸多边形
    MyPolygon( rook_image ,w);
    
    /// 2.b. 创建矩形
    rectangle( rook_image,
              cv::Point( 0, 7*w/8.0 ),
              cv::Point( w, w),
              Scalar( 0, 255, 255 ),
              -1,
              8 );
    
    /// 2.c. 画几条直线
    MyLine( rook_image, cv::Point( 0, 15*w/16 ), cv::Point( w, 15*w/16 ) );
    MyLine( rook_image, cv::Point( w/4, 7*w/8 ), cv::Point( w/4, w ) );
    MyLine( rook_image, cv::Point( w/2, 7*w/8 ), cv::Point( w/2, w ) );
    MyLine( rook_image, cv::Point( 3*w/4, 7*w/8 ), cv::Point( 3*w/4, w ) );
    
    UIImageView *img2 = [[UIImageView alloc]init];
    img2.frame = CGRectMake(10, 320, w, w);
    [img2 setImage:[cvprocess UIImageFromCVMat:rook_image ]];
    
    [self.view addSubview:img2];

运行结果:

AA79CD99-C49D-4EB4-8540-913F225197A2.png

demo地址:
https://github.com/GoldenRocking/OpenCV_iOS

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

推荐阅读更多精彩内容

  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,988评论 25 707
  • 超市上班第六天,销售不是很好,站立习惯了,就是感觉累,忙也好点,但是生意不好,没办法,干站着,无所事事,快下班的时...
    憧憬幸福阅读 348评论 0 1
  • 我是一部手机。刚出生不久我就被运到了商店,在这里我和我的兄弟姐妹只需要躺在漂亮的展示柜里就可以领养一个仆人。 我们...
    小森之萤Iris阅读 445评论 0 0