marquee文字起始位置_OpenCV图像处理|1.8 绘制形状与文字

323fd666235e62ddad1add88bb03b71a.png

1.8 绘制形状与文字

点Point()、颜色Scalar()、线line()、矩形rectangle()、椭圆ellipse()、圆circle()、多边形fillPoly()、随机数RNG、加文字putText()

1.8.1 使用点cv::Point与颜色cv::Scalar

(1)Point(点)表示二维2D平面上一个点(x, y),左上角为原点,x轴向左,y轴向下:

Point p;

p.x = 10;

p.y = 8;

Point p = Point(10,8);

Point p1 = Point(0, 30); //左上角为原点,x轴向左,y轴向下
Point p2;
p2.x = 720;
p2.y = 380;

(2)Scalar(颜色)表示四个元素的向量,通道颜色:

Scalar(a, b, c); // a = blue, b = green, c = red表示RGB三个通道(不声明也可以)

Scalar color = Scalar(0, 0, 255); //红色

1.8.2 绘制线、矩形、园、椭圆等基本几何形状

(1)画线 cv::line() 线类型 LINE_4LINE_8LINE_AA反锯齿(要渲染)

/*绘制直线实现函数*/
void MyLines() { //函数实现
 Point p1 = Point(0, 30); //左上角为原点,x轴向左,y轴向下
 Point p2;
        p2.x = 720;
        p2.y = 380;
 Scalar color = Scalar(0, 0, 255);     //红
 line(bgImage, p1, p2, color, 1, LINE_AA); //原图,点1,点2,线颜色,线宽(值越大越宽),线类型
}

(2)画矩形 cv::rectangle()

/*绘制矩形实现函数 */
void MyRectangle() {
 Rect rect = Rect(200, 100, 300, 300); //矩形范围,起始位置xy,宽,高
 Scalar color = Scalar(255, 0, 255);   //粉红
 rectangle(bgImage, rect, color, 2, LINE_8); //原图,矩阵范围,线颜色,线宽,线类型
}

(3)画椭圆(弧) cv::ellipse()

/*绘制椭圆(弧)实现函数 */
void MyEllipse() {
 Scalar color = Scalar(255, 255, 0);   //青
 ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows/ 8),80 ,0 ,270 ,color, 2, LINE_8);
 //原图,椭圆中心,椭圆半径(长轴和短轴),倾斜角度,开始角度,结束角度,线颜色,线宽,线类型
}

(4)画圆 cv::circle()

/*绘制圆实现函数 */
void MyCircle() {
 Scalar color = Scalar(0,255, 255);    //黄
 Point center = Point(bgImage.cols / 2, bgImage.rows / 2); //圆心
 circle(bgImage, center, 50, color, 3, 8); //原图,圆心,半径长度,线颜色,thickness(正值代表圆线宽,负值代表填充圆),线类型
}

(5)画多边形填充 cv::fillPoly()

/*多边形填充实现函数 */
void MyPolygon() {
 Point pts[1][6]; //多个点,二维数组
        pts[0][0] = Point(100, 100); //5边形,6个点,能形成封闭区域
        pts[0][1] = Point(100, 200);
        pts[0][2] = Point(150, 250);
        pts[0][3] = Point(200, 200);
        pts[0][4] = Point(200, 100);
        pts[0][5] = Point(100, 100);
 const Point* ppts[] = { pts[0] }; //指针
 int npt[] = { 6 }; //多少个
 Scalar color = Scalar(255, 0, 0);     //白
 fillPoly(bgImage, ppts, npt, 1, color, 8); //原图,多个点指针,几个点连线,线宽,线颜色,线类型
}

1.8.3 随机数生成cv::RNG

生成高斯随机数gaussian (double sigma)

生成均匀分布随机数uniform (int a, int b)

画随机线:

/*绘制随机线*/
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); //点随机规格,生成正态分布随机数,不超过范围
               pt2.x = rng.uniform(0, bgImage.cols);
               pt1.y = 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) {  //等待x ms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则没有按键返回 -1
 break; // 跳出for循环
               }
        line(bg, pt1, pt2, color, 1, 8); // 划线
        imshow("random line demo",bg);
        }       
}

1.8.4 绘制添加文字

putText函数 中设置fontFace(cv::HersheyFonts),

- fontFace, CV_FONT_HERSHEY_PLAIN 字体

- fontScale , 1.0, 2.0~ 8.0 字号

putText(bgImage, "Hello OpenCV", Point(250, 300), CV_FONT_HERSHEY_COMPLEX, 1.5, Scalar(255, 255, 255), 2, LINE_AA);
 //原图,字符串,中心,字体,字号,线颜色,线宽,线类型

完整程序:

/*1.8 绘制形状与文字*/
#include <opencv2/opencv.hpp>
#include <iostream> 
using namespace cv;      //使用cv命名空间,下面的cv::line等的前缀可以不写
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) {    //argc 表示命令行输入参数的个数(以空白符分隔),argv中存储了所有的命令行参数
        bgImage = imread("E:/OpenCV/testimage/test5.jpg");
 if (bgImage.empty()) {
               printf("could not load image...n");
 return -1;
        }
        MyLines();     //函数调用
        MyRectangle();
        MyEllipse();
        MyCircle();
        MyPolygon();
        RandomLineDemo();
        putText(bgImage, "Hello OpenCV", Point(250, 300), CV_FONT_HERSHEY_COMPLEX, 1.5, Scalar(255, 255, 255), 2, LINE_AA);
 //原图,字符串,中心,字体,字号,线颜色,线宽,线类型
 
 
        namedWindow("test opencv setup", CV_WINDOW_AUTOSIZE);
        imshow("test opencv setup", bgImage);
        waitKey(0); //x=0无限等待下去,直到有按键按下
 return 0;
}
/*绘制直线*/
void MyLines() { //函数实现
 Point p1 = Point(0, 30); //左上角为原点,x轴向左,y轴向下
 Point p2;
        p2.x = 720;
        p2.y = 380;
 Scalar color = Scalar(0, 0, 255);     //红
        line(bgImage, p1, p2, color, 1, LINE_AA); //原图,点1,点2,线颜色,线宽(值越大越宽),线类型
}
/*绘制矩形*/
void MyRectangle() {
 Rect rect = Rect(200, 100, 300, 300); //矩形范围,起始位置xy,宽,高
 Scalar color = Scalar(255, 0, 255);   //粉红
        rectangle(bgImage, rect, color, 2, LINE_8); //原图,矩阵范围,线颜色,线宽,线类型
}
/*绘制椭圆(弧)*/
void MyEllipse() {
 Scalar color = Scalar(255, 255, 0);   //青
        ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows/ 8),80 ,0 ,270 ,color, 2, LINE_8);         //原图,椭圆中心,椭圆半径(长轴和短轴),倾斜角度,开始角度,结束角度,线颜色,线宽,线类型
}
/*绘制圆*/
void MyCircle() {
 Scalar color = Scalar(0,255, 255);    //黄
 Point center = Point(bgImage.cols / 2, bgImage.rows / 2); //圆心
        circle(bgImage, center, 50, color, 3, 8); //原图,圆心,半径长度,线颜色,线宽,线类型
}
/*多边形填充*/
void MyPolygon() {
 Point pts[1][6]; //多个点,二维数组
        pts[0][0] = Point(100, 100); //5边形,6个点,能形成封闭区域
        pts[0][1] = Point(100, 200);
        pts[0][2] = Point(150, 250);
        pts[0][3] = Point(200, 200);
        pts[0][4] = Point(200, 100);
        pts[0][5] = Point(100, 100);
 const Point* ppts[] = { pts[0] }; //指针
 int npt[] = { 6 }; //多少个
 Scalar color = Scalar(255, 0, 0);     //白
        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); //点随机规格,生成正态分布随机数,不超过范围
               pt2.x = rng.uniform(0, bgImage.cols);
               pt1.y = 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){ //等待xms,如果在此期间有按键按下,则立即结束并返回按下按键的ASCII码,否则没有按键返回-1
 break; // 跳出for循环
               }
        line(bg, pt1, pt2, color, 1, 8); // 划线
        imshow("random line demo",bg);
        }       
}

运行结果:

e1a84e417e5dc6f9d778d18a8bfdb6f0.png
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值