OpenCV(八)—————图形绘制与填充(C++)

 

点、线、矩形、圆形、椭圆、多边形、绘制与填充、文字;

随机绘制:随机函数RNG,绘制随机形状

比较详细的API中参数的介绍:学习OpenCV2——绘制基本图形及文字

 

 

 

  • 线

利用line()API。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  相关绘制API演示
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

结果:

                             

  • 矩形

利用rect()和rectangle()API。

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  相关绘制API演示
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);
    //  绘制矩形
    //  定义矩形大小(左上角的点,宽,高)
    Rect rect(100,100,200,200);
    //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
    rectangle(canvas,rect,Scalar(255,0,0),1,8);
    imshow("resulit",canvas);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

结果:

                            

利用circle()API

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  相关绘制API演示
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);
    //  绘制矩形
    //  定义矩形大小(左上角的点,宽,高)
    Rect rect(100,100,200,200);
    //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
    rectangle(canvas,rect,Scalar(255,0,0),1,8);
    imshow("resulit",canvas);
    //  绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
    circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);
    imshow("resulit",canvas);
    waitKey(0);
    destroyAllWindows();
    return 0;
}

结果:

                             

  • 椭圆

利用RotatedRect制作旋转图形以及ellipse()椭圆生成API来生成椭圆.

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  绘制线
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);

    //  绘制矩形
    //  定义矩形大小(左上角的点,宽,高)
    Rect rect(100,100,200,200);
    //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
    rectangle(canvas,rect,Scalar(255,0,0),1,8);
    imshow("resulit",canvas);

    //  绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
    circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);

    //  绘制椭圆
    RotatedRect rrt;
    //  圆心
    rrt.center = Point2f(256,256);
    //  角度
    rrt.angle = 45.0;
    //  尺寸
    rrt.size = Size(100,200);
    //  绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
    //  若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
    ellipse(canvas,rrt,Scalar(0,255,255),2,8);
    imshow("resulit",canvas);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

结果:

    

  • 绘制随机线条

利用RNG函数.

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  绘制线
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);

    //  绘制矩形
    //  定义矩形大小(左上角的点,宽,高)
    Rect rect(100,100,200,200);
    //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
    rectangle(canvas,rect,Scalar(255,0,0),1,8);
    imshow("resulit",canvas);

    //  绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
    circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);

    //  绘制椭圆
    RotatedRect rrt;
    //  圆心
    rrt.center = Point2f(256,256);
    //  角度
    rrt.angle = 45.0;
    //  尺寸
    rrt.size = Size(100,200);
    //  绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
    //  若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
    ellipse(canvas,rrt,Scalar(0,255,255),2,8);
    imshow("resulit",canvas);

    //  丰富绘制
    //  绘制线条
    Mat image = Mat::zeros(Size(512,512),CV_8UC3);
    int x1 = 0,y1 = 0;
    int x2 = 0,y2 = 0;
    //  随机
    RNG rng(12345);
    while(true)
    {
        //  定义随机的起始坐标和终点坐标
        x1 = (int)rng.uniform(0,512);
        x2 = (int)rng.uniform(0,512);
        y1 = (int)rng.uniform(0,512);
        y2 = (int)rng.uniform(0,512);
        //  线(所在画布:image,随机起点,随机终点,随机颜色,线宽,渲染方式);
        line(image,Point(x1,y1),Point(y1,y2),Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,LINE_8);
        imshow("image",image);
        //  waitKey按任意键返回(停顿10ms)
        char c = waitKey(10);
        //  按Esc键暂停
        if(c == 27)
            break;
    }

    imwrite("../result.jpg",image);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

结果:

  • 绘制随机矩形

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  绘制线
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);

    //  绘制矩形
    //  定义矩形大小(左上角的点,宽,高)
    Rect rect(100,100,200,200);
    //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
    rectangle(canvas,rect,Scalar(255,0,0),1,8);
    imshow("resulit",canvas);

    //  绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
    circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);

    //  绘制椭圆
    RotatedRect rrt;
    //  圆心
    rrt.center = Point2f(256,256);
    //  角度
    rrt.angle = 45.0;
    //  尺寸
    rrt.size = Size(100,200);
    //  绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
    //  若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
    ellipse(canvas,rrt,Scalar(0,255,255),2,8);
    imshow("resulit",canvas);

    //  丰富绘制
    //  绘制线条
    Mat image = Mat::zeros(Size(800,800),CV_8UC3);
    int x1 = 0,y1 = 0;
    int x2 = 0,y2 = 0;
    //  随机
    RNG rng(12345);
    while(true)
    {
        //  定义随机的左上角坐标和左下角坐标
        x1 = (int)rng.uniform(0,512);
        x2 = (int)rng.uniform(0,512);
        y1 = (int)rng.uniform(0,512);
        y2 = (int)rng.uniform(0,512);
        //  确定宽和高
        int w = abs(x2-x1);
        int h = abs(y2-y1);
        rect.x = x1;
        rect.y = y1;
        rect.width = w;
        rect.height = h;
        //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
        rectangle(image,rect,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,8);
        imshow("image",image);
        //  waitKey按任意键返回(停顿10ms)
        char c = waitKey(10);
        //  按Esc键暂停
        if(c == 27)
            break;
    }

    imwrite("../result.jpg",image);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

结果:

如果只想要每次出现只出现一个矩形,可以在前面加上:

        //  只出现一个矩形
        image = Scalar(0,0,0);

完整代码为:

#include <opencv2/opencv.hpp>
#include <iostream>

using namespace cv;
using namespace std;


int main(int argc,char** argv)
{
    Mat canvas = Mat::zeros(Size(512,512),CV_8UC3);
    //namedWindow("input",WINDOW_AUTOSIZE);
    //imshow("input", canvas);

    //  绘制线
    //  绘制所在画布,线段的第一个点,线段结束的点,颜色,线宽,线段渲染方式,
    line(canvas,Point(10,10),Point(400,400),Scalar(0,0,255),1,LINE_8);
    imshow("resulit",canvas);

    //  绘制矩形
    //  定义矩形大小(左上角的点,宽,高)
    Rect rect(100,100,200,200);
    //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
    rectangle(canvas,rect,Scalar(255,0,0),1,8);
    imshow("resulit",canvas);

    //  绘制圆(绘制所在画布,圆心,半径,颜色,线宽,渲染方式)
    circle(canvas,Point(256,256),100,Scalar(0,255,0),1,8);

    //  绘制椭圆
    RotatedRect rrt;
    //  圆心
    rrt.center = Point2f(256,256);
    //  角度
    rrt.angle = 45.0;
    //  尺寸
    rrt.size = Size(100,200);
    //  绘制(所在花布,旋转的rectangle,颜色,线宽,渲染方式)
    //  若将线宽变成-1(<时0),将会变成填充的形式;线宽>0时是绘制的方式
    ellipse(canvas,rrt,Scalar(0,255,255),2,8);
    imshow("resulit",canvas);

    //  丰富绘制
    //  绘制线条
    Mat image = Mat::zeros(Size(512,512),CV_8UC3);
    int x1 = 0,y1 = 0;
    int x2 = 0,y2 = 0;
    //  随机
    RNG rng(12345);
    while(true)
    {
        //  定义随机的左上角坐标和左下角坐标
        x1 = (int)rng.uniform(0,512);
        x2 = (int)rng.uniform(0,512);
        y1 = (int)rng.uniform(0,512);
        y2 = (int)rng.uniform(0,512);
        //  确定宽和高
        int w = abs(x2-x1);
        int h = abs(y2-y1);
        rect.x = x1;
        rect.y = y1;
        rect.width = w;
        rect.height = h;
        //  只出现一个矩形
        image = Scalar(0,0,0);
        //  绘制(绘制所在画布,矩形位置和大小,颜色,线宽,渲染方式)
        rectangle(image,rect,Scalar(rng.uniform(0,255),rng.uniform(0,255),rng.uniform(0,255)),1,8);
        imshow("image",image);
        //  waitKey按任意键返回(停顿10ms)
        char c = waitKey(10);
        //  按Esc键暂停
        if(c == 27)
            break;
    }

    imwrite("../result.jpg",image);

    waitKey(0);
    destroyAllWindows();
    return 0;
}

出现结果非常酷:

实际上,在运行窗口中,这些随机矩形出现消失的非常快.整体看起来很酷.

  • 文字

//  文字(所在画布,打印文字,位置,字体类型,字体大小,字体颜色,加粗,渲染通道)
putText(canvas,"hello opencv!",Point(100,50),FONT_HERSHEY_SIMPLEX,1.0,Scalar(255,0,255),2,8);
imwrite("../result.jpg",canvas);

结果:

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值