opencv裁剪图片_OpenCV 学习:5 基本图形绘制(椭圆、圆、多边形、直线、矩形)...

cfc051efec6cef5b042328a04d02a420.png

1 画一条直线

  • 直线API
void line(Mat& img, Point pt1, Point pt2, const Scalar& color, int thickness=1, int lineType=8, int shift=0)

【参数】:
img: 要绘制线段的图像。
pt1: 线段的起点。
pt2: 线段的终点。
color: 线段的颜色,通过一个Scalar对象定义。
thickness: 线条的宽度。
lineType: 线段的类型。可以取值8, 4, 和CV_AA, 分别代表8邻接连接线,4邻接连接线和反锯齿连接线。默认值为8邻接。为了获得更好地效果可以选用CV_AA(采用了高斯滤波)。
shift: 坐标点小数点位数

2 画一个圆

  • 圆API
cvCircle(CvArr* img, CvPoint center, int radius, CvScalar color, int thickness=1, int lineType=8, int shift=0)

【参数】:
img    : 为源图像指针
center : 为画圆的圆心坐标
radius : 为圆的半径
color  : 为设定圆的颜色,规则根据B(蓝)G(绿)R(红)
thickness : 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充
line_type : 线条的类型。默认是8
shift     : 圆心坐标点和半径值的小数点位数

3 画一个椭圆

  • 椭圆API
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);
【参数】:
img 图像。
center 圆心坐标。
radius 圆形的半径。
color 线条的颜色。
thickness 如果是正数,表示组成圆的线条的粗细程度。否则,表示圆是否被填充。
line_type 线条的类型。见 cvLine 的描述
shift 圆心坐标点和半径值的小数点位数。
函数cvCircle绘制或填充一个给定圆心和半径的圆。圆被感兴趣矩形所裁剪。 若指定圆的颜色,可以使用宏 CV_RGB ( r, g, b )。

4 画一个矩形

  • 矩形API
rectangle( CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color,int thickness=1, int line_type=8, int shift=0 );

【参数】:
img 图像.
pt1 矩形的一个顶点。
pt2 矩形对角线上的另一个顶点
color 线条颜色 (RGB) 或亮度(灰度图像 )(grayscale image)。
thickness 组成矩形的线条的粗细程度。取负值时(如 CV_FILLED)函数绘制填充了色彩的矩形。
line_type 线条的类型。见cvLine的描述
shift 坐标点的小数点位数。

5 显示文字

  • 文字API
void cv::putText(
		cv::Mat& img,       // 待绘制的图像
		const string& text, // 待绘制的文字
		cv::Point origin,   // 文本框的左下角
		int fontFace,       // 字体 (如cv::FONT_HERSHEY_PLAIN)
		double fontScale,   // 尺寸因子,值越大文字越大
		cv::Scalar color,   // 线条的颜色(RGB)
		int thickness = 1,  // 线条宽度
		int lineType = 8,   // 线型(4邻域或8邻域,默认8邻域)
		bool bottomLeftOrigin = false // true='origin at lower left'
	);

6 多边形

  • 多边形API
void cvFillPoly( CvArr* img, CvPoint** pts, int* npts, int contours,
                 CvScalar color, int line_type=8, int shift=0 );

【参数】:
img 图像。
pts 指向多边形的数组指针。
npts 多边形的顶点个数的数组。
contours 组成填充区域的线段的数量。
color 多边形的颜色。
line_type 组成多边形的线条的类型。
shift 顶点坐标的小数点位数。
函数cvFillPoly用于一个单独被多边形轮廓所限定的区域内进行填充。函数可以填充复杂的区域,例如,有漏洞的区域和有交叉点的区域等等。

7 C++ 代码


//
// Created by cc on 2020/3/19.
//

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

using namespace std;
using namespace cv;

Mat bgImage;
const char* drawdemo_win = "draw shapes and text demo";

void MyLines();
void MyRectangle();
void MyEllipse();
void MyCircle();
void MyPolygon();
void RandomLineDemo();

int main(int argc, char ** argv)
{
    // 修改自己的路径和对应的图片
    bgImage = imread("/Users/cc/Desktop/OpenCV/demo/MyOpenCvDemo/MyDemo/swk.jpeg");
    if (!bgImage.data)
    {
        cout << "Could not load image ... " << endl;
        return -1;
    }

    MyLines();
    MyRectangle();
    MyEllipse();
    MyCircle();
    MyPolygon();

    imshow("random line demo", bgImage);
//    RandomLineDemo();
    waitKey(0);
    return 0;
}

void MyLines()
{
    Point p1 = Point(20, 30);
    Point p2;
    p2.x = 400;
    p2.y = 400;

    Scalar color = Scalar(0, 0, 255);
    line(bgImage, p1, p2, color, 10, LINE_AA);
}


void MyRectangle()
{
    Rect rect = Rect(200, 100, 300, 300);
    Scalar color = Scalar(255, 0, 0);
    rectangle(bgImage, rect, color, 2, LINE_8);
}


void MyEllipse()
{
    Scalar color = Scalar(0, 255, 0);
    ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2),
            Size(bgImage.cols/4, bgImage.rows/8), 90, 0, 360, color, 2, LINE_8);
}

void MyCircle()
{
    Scalar color = Scalar(0, 255, 255);
    Point center = Point(bgImage.cols/2, bgImage.rows/2);
    circle(bgImage, center, 150, color, 2, 8);
}


void MyPolygon()
{
    Point pts[1][5];
    pts[0][0] = Point(100, 100);
    pts[0][1] = Point(100, 200);
    pts[0][2] = Point(200, 200);
    pts[0][3] = Point(200, 100);
    pts[0][4] = Point(100, 100);

    const Point* ppts[] = {pts[0]};
    int npt[] = { 5 };
    Scalar color = Scalar(255, 12, 255);

    fillPoly(bgImage, ppts, npt, 1, color, 8);

}


void RandomLineDemo()
{
    RNG rng(12345);
    Point pt1;
    Point pt2;
    Mat bg = Mat::zeros(bgImage.size(), bgImage.type());

    for (int i = 0; i < 100000; i++)
    {
        pt1.x = rng.uniform(0, bgImage.cols);
        pt1.y = rng.uniform(0, bgImage.cols);
        pt2.x = rng.uniform(0, bgImage.rows);
        pt2.y = rng.uniform(0, bgImage.rows);
        Scalar color = Scalar(rng.uniform(0, 255), rng.uniform(0, 255), rng.uniform(0, 255));
        if (waitKey(50) > 0)
            break;

        line(bg, pt1, pt2, color, 1, 8);
        imshow("random line demo", bg);
    }
}

8 运行结果

70726ff651beb411a75a2f28058e8879.png
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值