最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

C++ OpenCV繪制幾何圖形

 更新時(shí)間:2021年10月29日 16:38:43   作者:onlyloveyd  
這篇文章主要為大家詳細(xì)介紹了C++ OpenCV繪制幾何圖形,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下

本文實(shí)例為大家分享了C++ OpenCV繪制幾何圖形的具體代碼,供大家參考,具體內(nèi)容如下

繪制幾何圖形

  • 直線
  • 矩形
  • 多邊形
  • 圓形
  • 橢圓
  • 文字

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

上方函數(shù)通過(guò)兩點(diǎn)確定矩形的位置和大小,下方函數(shù)則是通過(guò)矩形對(duì)象 Rect 來(lái)確定。

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

官方示例二

#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;
}

以上就是本文的全部?jī)?nèi)容,希望對(duì)大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。

相關(guān)文章

  • 在C語(yǔ)言中比較兩個(gè)字符串是否相等的方法

    在C語(yǔ)言中比較兩個(gè)字符串是否相等的方法

    這篇文章主要介紹了在C語(yǔ)言中比較兩個(gè)字符串是否相等的方法,分別介紹了strcmp()函數(shù)和strcasecmp()函數(shù),注意功能區(qū)分,需要的朋友可以參考下
    2015-08-08
  • C語(yǔ)言 選擇排序算法詳解及實(shí)現(xiàn)代碼

    C語(yǔ)言 選擇排序算法詳解及實(shí)現(xiàn)代碼

    本文主要介紹C語(yǔ)言 選擇排序算法,這里對(duì)排序算法做了詳細(xì)說(shuō)明,并附代碼示例,有需要的小伙伴可以參考下
    2016-08-08
  • C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中樹(shù)與森林專項(xiàng)詳解

    C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中樹(shù)與森林專項(xiàng)詳解

    這篇文章主要介紹了C語(yǔ)言數(shù)據(jù)結(jié)構(gòu)中樹(shù)與森林,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)吧
    2022-11-11
  • C++實(shí)現(xiàn)LeetCode(114.將二叉樹(shù)展開(kāi)成鏈表)

    C++實(shí)現(xiàn)LeetCode(114.將二叉樹(shù)展開(kāi)成鏈表)

    這篇文章主要介紹了C++實(shí)現(xiàn)LeetCode(114.將二叉樹(shù)展開(kāi)成鏈表),本篇文章通過(guò)簡(jiǎn)要的案例,講解了該項(xiàng)技術(shù)的了解與使用,以下就是詳細(xì)內(nèi)容,需要的朋友可以參考下
    2021-07-07
  • 關(guān)于STL中l(wèi)ist容器的一些總結(jié)

    關(guān)于STL中l(wèi)ist容器的一些總結(jié)

    list就是數(shù)據(jù)結(jié)構(gòu)中的雙向鏈表(根據(jù)sgi stl源代碼),因此它的內(nèi)存空間是不連續(xù)的,通過(guò)指針來(lái)進(jìn)行數(shù)據(jù)的訪問(wèn),這個(gè)特點(diǎn)使得它的隨即存取變的非常沒(méi)有效率,因此它沒(méi)有提供[]操作符的重載
    2013-09-09
  • C++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)詳解

    C++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)詳解

    下面小編就為大家?guī)?lái)一篇C++類的靜態(tài)成員變量與靜態(tài)成員函數(shù)的文章。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2021-11-11
  • C語(yǔ)言文件打開(kāi)的模式

    C語(yǔ)言文件打開(kāi)的模式

    這篇文章主要介紹了C語(yǔ)言文件打開(kāi)的模式,以及相關(guān)的原理和知識(shí)點(diǎn)做了分享,有興趣的朋友參考學(xué)習(xí)下。
    2018-03-03
  • C#中?MessageBox的使用技巧

    C#中?MessageBox的使用技巧

    這篇文章主要介紹了C#中?MessageBox的使用技巧,在C#中MessageBox消息對(duì)話框位于System.Windows.Forms命名空間中,更多詳細(xì)的內(nèi)容需要的朋友可以參考一下
    2022-08-08
  • C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解

    C語(yǔ)言中結(jié)構(gòu)體的內(nèi)存對(duì)齊規(guī)則講解

    C 數(shù)組允許定義可存儲(chǔ)相同類型數(shù)據(jù)項(xiàng)的變量,結(jié)構(gòu)是 C 編程中另一種用戶自定義的可用的數(shù)據(jù)類型,它允許你存儲(chǔ)不同類型的數(shù)據(jù)項(xiàng),本篇讓我們來(lái)了解C 的結(jié)構(gòu)體內(nèi)存對(duì)齊
    2022-05-05
  • 詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景

    詳解C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景

    這篇文章主要介紹C++ 參數(shù)的三種傳遞方式和應(yīng)用場(chǎng)景,C++ 參數(shù)的三種傳遞方式分別是值傳遞、指針傳遞和引用傳遞,感興趣的同學(xué)可以參考閱讀下
    2023-06-06

最新評(píng)論

沙河市| 兰西县| 库尔勒市| 绥江县| 星子县| 内乡县| 绍兴市| 岑巩县| 师宗县| 伊金霍洛旗| 遂昌县| 兰溪市| 日照市| 三江| 黄浦区| 进贤县| 江城| 夏津县| 波密县| 阿鲁科尔沁旗| 连城县| 普宁市| 都江堰市| 关岭| 专栏| 和静县| 吴旗县| 五台县| 含山县| 诸暨市| 鄯善县| 阿拉善右旗| 贵德县| 留坝县| 新泰市| 东至县| 清河县| 营山县| 颍上县| 广东省| 太湖县|