欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

C++ OpenCV绘制几何图形

程序员文章站 2022-03-15 11:41:42
本文实例为大家分享了c++ opencv绘制几何图形的具体代码,供大家参考,具体内容如下绘制几何图形 直线 矩形 多边形 圆形 椭圆 文字 api直线cv_e...

本文实例为大家分享了c++ opencv绘制几何图形的具体代码,供大家参考,具体内容如下

绘制几何图形

  • 直线
  • 矩形
  • 多边形
  • 圆形
  • 椭圆
  • 文字

api

直线

cv_exports_w void line(inputoutputarray img, point pt1, point pt2, const scalar& color,
                     int thickness = 1, int linetype = line_8, int shift = 0);

矩形

cv_exports_w void rectangle(inputoutputarray img, point pt1, point pt2,
                          const scalar& color, int thickness = 1,
                          int linetype = line_8, int shift = 0);

上方函数通过两点确定矩形的位置和大小,下方函数则是通过矩形对象 rect 来确定。

cv_exports_w void rectangle(inputoutputarray img, rect rec,
                          const scalar& color, int thickness = 1,
                          int linetype = line_8, int shift = 0);

多边形

cv_exports 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 );
cv_exports_w void polylines(inputoutputarray img, inputarrayofarrays pts,
                            bool isclosed, const scalar& color,
                            int thickness = 1, int linetype = line_8, int shift = 0 );

圆形

cv_exports_w void circle(inputoutputarray img, point center, int radius,
                       const scalar& color, int thickness = 1,
                       int linetype = line_8, int shift = 0);

椭圆

cv_exports_w void ellipse(inputoutputarray img, const rotatedrect& box, const scalar& color,
                        int thickness = 1, int linetype = line_8);
cv_exports_w 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);

文字

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

示例

官方示例一

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#define w 400
using namespace cv;
void myellipse( mat img, double angle );
void myfilledcircle( mat img, point center );
void mypolygon( mat img );
void myline( mat img, point start, point end );
int main( void ){
    char atom_window[] = "drawing 1: atom";
    char rook_window[] = "drawing 2: rook";
    mat atom_image = mat::zeros( w, w, cv_8uc3 );
    mat rook_image = mat::zeros( w, w, cv_8uc3 );
    myellipse( atom_image, 90 );
    myellipse( atom_image, 0 );
    myellipse( atom_image, 45 );
    myellipse( atom_image, -45 );
    myfilledcircle( atom_image, point( w/2, w/2) );
    mypolygon( rook_image );
    rectangle( rook_image,
               point( 0, 7*w/8 ),
               point( w, w),
               scalar( 0, 255, 255 ),
               filled,
               line_8 );
    myline( rook_image, point( 0, 15*w/16 ), point( w, 15*w/16 ) );
    myline( rook_image, point( w/4, 7*w/8 ), point( w/4, w ) );
    myline( rook_image, point( w/2, 7*w/8 ), point( w/2, w ) );
    myline( rook_image, point( 3*w/4, 7*w/8 ), point( 3*w/4, w ) );
    imshow( atom_window, atom_image );
    movewindow( atom_window, 0, 200 );
    imshow( rook_window, rook_image );
    movewindow( rook_window, w, 200 );
    waitkey( 0 );
    return(0);
}
void myellipse( mat img, double angle )
{
    int thickness = 2;
    int linetype = 8;
    ellipse( img,
             point( w/2, w/2 ),
             size( w/4, w/16 ),
             angle,
             0,
             360,
             scalar( 255, 0, 0 ),
             thickness,
             linetype );
}
void myfilledcircle( mat img, point center )
{
    circle( img,
            center,
            w/32,
            scalar( 0, 0, 255 ),
            filled,
            line_8 );
}
void mypolygon( mat img )
{
    int linetype = line_8;
    point rook_points[1][20];
    rook_points[0][0]  = point(    w/4,   7*w/8 );
    rook_points[0][1]  = point(  3*w/4,   7*w/8 );
    rook_points[0][2]  = point(  3*w/4,  13*w/16 );
    rook_points[0][3]  = point( 11*w/16, 13*w/16 );
    rook_points[0][4]  = point( 19*w/32,  3*w/8 );
    rook_points[0][5]  = point(  3*w/4,   3*w/8 );
    rook_points[0][6]  = point(  3*w/4,     w/8 );
    rook_points[0][7]  = point( 26*w/40,    w/8 );
    rook_points[0][8]  = point( 26*w/40,    w/4 );
    rook_points[0][9]  = point( 22*w/40,    w/4 );
    rook_points[0][10] = point( 22*w/40,    w/8 );
    rook_points[0][11] = point( 18*w/40,    w/8 );
    rook_points[0][12] = point( 18*w/40,    w/4 );
    rook_points[0][13] = point( 14*w/40,    w/4 );
    rook_points[0][14] = point( 14*w/40,    w/8 );
    rook_points[0][15] = point(    w/4,     w/8 );
    rook_points[0][16] = point(    w/4,   3*w/8 );
    rook_points[0][17] = point( 13*w/32,  3*w/8 );
    rook_points[0][18] = point(  5*w/16, 13*w/16 );
    rook_points[0][19] = point(    w/4,  13*w/16 );
    const point* ppt[1] = { rook_points[0] };
    int npt[] = { 20 };
    fillpoly( img,
              ppt,
              npt,
              1,
              scalar( 255, 255, 255 ),
              linetype );
}
void myline( mat img, point start, point end )
{
    int thickness = 2;
    int linetype = line_8;
    line( img,
          start,
          end,
          scalar( 0, 0, 0 ),
          thickness,
          linetype );
}

C++ OpenCV绘制几何图形

官方示例二

#include <opencv2/core.hpp>
#include <opencv2/imgproc.hpp>
#include <opencv2/highgui.hpp>
#include <iostream>
#include <stdio.h>
using namespace cv;
const int number = 100;
const int delay = 5;
const int window_width = 900;
const int window_height = 600;
int x_1 = -window_width/2;
int x_2 = window_width*3/2;
int y_1 = -window_width/2;
int y_2 = window_width*3/2;
static scalar randomcolor( rng& rng );
int drawing_random_lines( mat image, char* window_name, rng rng );
int drawing_random_rectangles( mat image, char* window_name, rng rng );
int drawing_random_ellipses( mat image, char* window_name, rng rng );
int drawing_random_polylines( mat image, char* window_name, rng rng );
int drawing_random_filled_polygons( mat image, char* window_name, rng rng );
int drawing_random_circles( mat image, char* window_name, rng rng );
int displaying_random_text( mat image, char* window_name, rng rng );
int displaying_big_end( mat image, char* window_name, rng rng );
int main( void )
{
    int c;
    char window_name[] = "drawing_2 tutorial";
    rng rng( 0xffffffff );
    mat image = mat::zeros( window_height, window_width, cv_8uc3 );
    imshow( window_name, image );
    waitkey( delay );
    c = drawing_random_lines(image, window_name, rng);
    if( c != 0 ) return 0;
    c = drawing_random_rectangles(image, window_name, rng);
    if( c != 0 ) return 0;
    c = drawing_random_ellipses( image, window_name, rng );
    if( c != 0 ) return 0;
    c = drawing_random_polylines( image, window_name, rng );
    if( c != 0 ) return 0;
    c = drawing_random_filled_polygons( image, window_name, rng );
    if( c != 0 ) return 0;
    c = drawing_random_circles( image, window_name, rng );
    if( c != 0 ) return 0;
    c = displaying_random_text( image, window_name, rng );
    if( c != 0 ) return 0;
    c = displaying_big_end( image, window_name, rng );
    if( c != 0 ) return 0;
    waitkey(0);
    return 0;
}
static scalar randomcolor( rng& rng )
{
    int icolor = (unsigned) rng;
    return scalar( icolor&255, (icolor>>8)&255, (icolor>>16)&255 );
}
int drawing_random_lines( mat image, char* window_name, rng rng )
{
    point pt1, pt2;
    for( int i = 0; i < number; i++ )
    {
        pt1.x = rng.uniform( x_1, x_2 );
        pt1.y = rng.uniform( y_1, y_2 );
        pt2.x = rng.uniform( x_1, x_2 );
        pt2.y = rng.uniform( y_1, y_2 );
        line( image, pt1, pt2, randomcolor(rng), rng.uniform(1, 10), 8 );
        imshow( window_name, image );
        if( waitkey( delay ) >= 0 )
        { return -1; }
    }
    return 0;
}
int drawing_random_rectangles( mat image, char* window_name, rng rng )
{
    point pt1, pt2;
    int linetype = 8;
    int thickness = rng.uniform( -3, 10 );
    for( int i = 0; i < number; i++ )
    {
        pt1.x = rng.uniform( x_1, x_2 );
        pt1.y = rng.uniform( y_1, y_2 );
        pt2.x = rng.uniform( x_1, x_2 );
        pt2.y = rng.uniform( y_1, y_2 );
        rectangle( image, pt1, pt2, randomcolor(rng), max( thickness, -1 ), linetype );
        imshow( window_name, image );
        if( waitkey( delay ) >= 0 )
        { return -1; }
    }
    return 0;
}
int drawing_random_ellipses( mat image, char* window_name, rng rng )
{
    int linetype = 8;
    for ( int i = 0; i < number; i++ )
    {
        point center;
        center.x = rng.uniform(x_1, x_2);
        center.y = rng.uniform(y_1, y_2);
        size axes;
        axes.width = rng.uniform(0, 200);
        axes.height = rng.uniform(0, 200);
        double angle = rng.uniform(0, 180);
        ellipse( image, center, axes, angle, angle - 100, angle + 200,
                 randomcolor(rng), rng.uniform(-1,9), linetype );
        imshow( window_name, image );
        if( waitkey(delay) >= 0 )
        { return -1; }
    }
    return 0;
}
int drawing_random_polylines( mat image, char* window_name, rng rng )
{
    int linetype = 8;
    for( int i = 0; i< number; i++ )
    {
        point pt[2][3];
        pt[0][0].x = rng.uniform(x_1, x_2);
        pt[0][0].y = rng.uniform(y_1, y_2);
        pt[0][1].x = rng.uniform(x_1, x_2);
        pt[0][1].y = rng.uniform(y_1, y_2);
        pt[0][2].x = rng.uniform(x_1, x_2);
        pt[0][2].y = rng.uniform(y_1, y_2);
        pt[1][0].x = rng.uniform(x_1, x_2);
        pt[1][0].y = rng.uniform(y_1, y_2);
        pt[1][1].x = rng.uniform(x_1, x_2);
        pt[1][1].y = rng.uniform(y_1, y_2);
        pt[1][2].x = rng.uniform(x_1, x_2);
        pt[1][2].y = rng.uniform(y_1, y_2);
        const point* ppt[2] = {pt[0], pt[1]};
        int npt[] = {3, 3};
        polylines(image, ppt, npt, 2, true, randomcolor(rng), rng.uniform(1,10), linetype);
        imshow( window_name, image );
        if( waitkey(delay) >= 0 )
        { return -1; }
    }
    return 0;
}
int drawing_random_filled_polygons( mat image, char* window_name, rng rng )
{
    int linetype = 8;
    for ( int i = 0; i < number; i++ )
    {
        point pt[2][3];
        pt[0][0].x = rng.uniform(x_1, x_2);
        pt[0][0].y = rng.uniform(y_1, y_2);
        pt[0][1].x = rng.uniform(x_1, x_2);
        pt[0][1].y = rng.uniform(y_1, y_2);
        pt[0][2].x = rng.uniform(x_1, x_2);
        pt[0][2].y = rng.uniform(y_1, y_2);
        pt[1][0].x = rng.uniform(x_1, x_2);
        pt[1][0].y = rng.uniform(y_1, y_2);
        pt[1][1].x = rng.uniform(x_1, x_2);
        pt[1][1].y = rng.uniform(y_1, y_2);
        pt[1][2].x = rng.uniform(x_1, x_2);
        pt[1][2].y = rng.uniform(y_1, y_2);
        const point* ppt[2] = {pt[0], pt[1]};
        int npt[] = {3, 3};
        fillpoly( image, ppt, npt, 2, randomcolor(rng), linetype );
        imshow( window_name, image );
        if( waitkey(delay) >= 0 )
        { return -1; }
    }
    return 0;
}
int drawing_random_circles( mat image, char* window_name, rng rng )
{
    int linetype = 8;
    for (int i = 0; i < number; i++)
    {
        point center;
        center.x = rng.uniform(x_1, x_2);
        center.y = rng.uniform(y_1, y_2);
        circle( image, center, rng.uniform(0, 300), randomcolor(rng),
                rng.uniform(-1, 9), linetype );
        imshow( window_name, image );
        if( waitkey(delay) >= 0 )
        { return -1; }
    }
    return 0;
}
int displaying_random_text( mat image, char* window_name, rng rng )
{
    int linetype = 8;
    for ( int i = 1; i < number; i++ )
    {
        point org;
        org.x = rng.uniform(x_1, x_2);
        org.y = rng.uniform(y_1, y_2);
        puttext( image, "testing text rendering", org, rng.uniform(0,8),
                 rng.uniform(0,100)*0.05+0.1, randomcolor(rng), rng.uniform(1, 10), linetype);
        imshow( window_name, image );
        if( waitkey(delay) >= 0 )
        { return -1; }
    }
    return 0;
}
int displaying_big_end( mat image, char* window_name, rng )
{
    size textsize = gettextsize("opencv forever!", font_hershey_complex, 3, 5, 0);
    point org((window_width - textsize.width)/2, (window_height - textsize.height)/2);
    int linetype = 8;
    mat image2;
    for( int i = 0; i < 255; i += 2 )
    {
        image2 = image - scalar::all(i);
        puttext( image2, "opencv forever!", org, font_hershey_complex, 3,
                 scalar(i, i, 255), 5, linetype );
        imshow( window_name, image2 );
        if( waitkey(delay) >= 0 )
        { return -1; }
    }
    return 0;
}

C++ OpenCV绘制几何图形

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。