文章目录

  • CV::Point以及CV::Scalar
  • 画直线cv::line()
  • 画椭圆cv::elipse()
  • 画矩形cv::rectangle()
  • 画圆cv::circle()
  • 画填充多边形cv::fillpoly()
  • 绘制文字cv::putText()
  • 完整程序和运行结果

CV::Point以及CV::Scalar

Point表示的是2D平面上的一个点(x, y),使用方式如下:
第一种

Point p1;
p1.x = 100;
p1.y = 50;

p1表示的就是坐标为(100,50)的点。
第二种

Point p2 = Point(100, 80);

p2表示的是坐标为(100,80)的点。同样 Point(100,80)也可直接表示坐标为(100,80)的点。

Scalar表示的是一个四个元素的向量,使用方式为:Scalar(b, g, r);
b表示的是blue;
g表示的是green;
r表示的是red。
可以用来表示图像对应个数通道对应的值。
Scalar()参数的个数可以是一个、两个、三个或四个(图像几个通道就有几个参数)。

画直线cv::line()

void Mylines(int x, int y)
{Point p1 = Point(20, 20);//直线起点Point p2;//直线终点p2.x = x;p2.y = y;Scalar color = Scalar(255, 0, 0);//直线颜色为蓝色line(bgImage, p1, p2, color, 1, LINE_AA);//在图像bgImage上画一条从p1到p2,颜色为color,粗细为1的反锯齿类型直线
}
Line(CvArr* img, CvPoint pt1, CvPoint pt2, CvScalar color, int thickness=1, int line_type=8, int shift=0 )

第一个参数img表示需要画线的图片
第二个参数pt1表示的是直线起点坐标
第三个参数pt2表示的是直线终点坐标
第四个参数color表示的是直线的颜色,用Scalar来表示颜色值
第五个参数thickness表示线条粗细
第六个参数line_type表示直线类型,有LINE_4、LINE_8、LINE_AA

LINE_4是4联通直线
LINE_8是8联通直线
LINE_AA是反锯齿直线
如果对直线没有要求 ,一般使用LINE_8,其算法最简单,所用时间最少,如果想要直线更清晰漂亮,可以使用反锯齿LINE_AA,但是其相应的运算时间也最长。

画椭圆cv::elipse()

void MyElipes()
{Scalar color = Scalar(0,255,0);ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 120, color, 2, LINE_8);
}
ellipse(img, center, axes, angle, startAngle, endAngle, color, thickness, lineType, shift)

img:要在上面画椭圆的图像
center:椭圆的中心——Point类型
axes:椭圆的轴长,格式为 Size (长轴长度的一半, 短轴长度的一半)
angle:椭圆沿水平方向逆时针旋转的角度
startAngle:沿长轴顺时针方向开始显示的角度
endAngle:沿长轴顺时针结束显示的角度
color:表示的是线条的颜色
thickness:椭圆边框的粗细,cv.FILLED 表示绘制实心椭圆
lineType:椭圆边框的类型
shift:坐标精确到小数点后第几位,默认为0

画矩形cv::rectangle()

void MyRectangle()
{Rect rect = Rect(20, 20, 50, 50);Scalar color = Scalar(255,20,50);rectangle(bgImage, rect, color, 2, LINE_8);
}
void rectangle(Mat& img, Point pt1,Point pt2,const Scalar& color, int thickness=1, int lineType=8, int shift=0)

和直线类似,这里的pt1和pt2分别表示的是矩形左上角坐标和右下脚坐标。

画圆cv::circle()

void MyCircle()
{Scalar color = Scalar(100, 200, 50);Point center = Point(bgImage.cols / 2, bgImage.rows / 2);circle(bgImage,center, 100, color, 2, LINE_8);
}
circle(img, center, radius, color, thickness, lineType, shift);

img:要在上面画圆的图像
center:圆的圆心
radius:圆的半径
color:圆的颜色
thickness:圆边框的粗细,cv.FILLED 表示绘制实心圆
lineType:圆边框的类型
shift:坐标精确到小数点后几位,默认为0

画填充多边形cv::fillpoly()

void MyPlygon()
{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, 255, 0);fillPoly(bgImage, ppts, npt, 1, color, LINE_8);
}

绘制多边形的函数中需要用到一个二维数组,这个二维数组中每一行存储的是一个多边形的所有顶点,一个二维数组中可以存储多个多边形的顶点。

在使用的时候需要创建一个指针数组,数组中每一个指针指向存储多边形顶点的二维数组中的一行。

fillPoly(Mat& img, const Point** ppts, const int* npts, int ncontours, const Scalar& color, int lineType=8);
  • img是要在上面画图的图像
  • ppts是一个指向多边形数组的指针,必须用const来修饰,上面的程序中pts是一个二维数组,ppts是指向这个数组的指针
  • npts是多边形顶点个数的数组名
  • ncontours是绘制多边形的个数
  • color是填充的颜色
    如果想要绘制多个多边形,可以这样:
void MyPlygon()
{Point pts[2][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);pts[1][0] = Point(200, 200);pts[1][1] = Point(200, 300);pts[1][2] = Point(300, 300);pts[1][3] = Point(200, 200);const Point* ppts[] = { pts[0], pts[1] };int npt[] = { 5, 4 };Scalar color = Scalar(0, 255, 255);fillPoly(bgImage, ppts, npt, 2, color, LINE_8);//ppts包含两个存储多边形坐标的数组,npt对应存储两个对应多边形的顶点个数,2表示绘制两个多边形
}

绘制文字cv::putText()

putText(bgImage, "Hello openCV", Point(50, 100), CV_FONT_HERSHEY_COMPLEX, 0.7, Scalar(12, 255, 80), 1, 8);
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'
);

具体的详细解释可以看这篇博客

完整程序和运行结果

// Project9.cpp : 此文件包含 "main" 函数。程序执行将在此处开始并结束。
//#include <iostream>
#include <opencv2/opencv.hpp>using namespace std;
using namespace cv;Mat bgImage;
const char* drawdemo_win = "draw shape and text demo";void Mylines(int x, int y)
{Point p1 = Point(20, 20);Point p2;p2.x = x;p2.y = y;Scalar color = Scalar(255, 0, 0);line(bgImage, p1, p2, color, 1, LINE_AA);
}void MyRectangle()
{Rect rect = Rect(20, 20, 50, 50);Scalar color = Scalar(0,0,255);rectangle(bgImage, rect, color, 2, LINE_8);
}void MyElipes()
{Scalar color = Scalar(0,255,0);ellipse(bgImage, Point(bgImage.cols / 2, bgImage.rows / 2), Size(bgImage.cols / 4, bgImage.rows / 8), 90, 0, 270, color, 2, LINE_8);
}void MyCircle()
{Scalar color = Scalar(255, 255, 0);Point center = Point(bgImage.cols / 2, bgImage.rows / 2);circle(bgImage,center, 100, color, 2, LINE_8);
}void MyPlygon()
{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(0, 255, 255);fillPoly(bgImage, ppts, npt, 1, color, LINE_8);
}int main()
{std::cout << "Hello World!\n";bgImage = imread("A:/opencvproject/002.jpg");if (!bgImage.data){cout << "image is empty" << endl;return -1;}Mylines(bgImage.rows, bgImage.cols);MyRectangle();MyElipes();MyCircle();MyPlygon();putText(bgImage, "Hello openCV", Point(50, 100), CV_FONT_HERSHEY_COMPLEX, 0.7, Scalar(12, 255, 80), 1, 8);namedWindow(drawdemo_win, CV_WINDOW_AUTOSIZE);imshow(drawdemo_win, bgImage);waitKey(0);return 0;
}

opencv学习笔记(八)-- 在图像上绘制形状和文字相关推荐

  1. 【opencv学习笔记八】创建TrackBar轨迹条

    createTrackbar这个函数我们以后会经常用到,它创建一个可以调整数值的轨迹条,并将轨迹条附加到指定的窗口上,使用起来很方便.首先大家要记住,它往往会和一个回调函数配合起来使用.先看下他的函数 ...

  2. opencv学习笔记八--答题卡识别

    opencv学习笔记八--答题卡识别 导入工具包 定义函数 扫描 自适应阈值处理 检测每一个选项的轮廓 对轮廓进行排序以获取序号 打印结果 参考 导入工具包 #导入工具包 import numpy a ...

  3. Opencv学习笔记(八) -- 图像色彩空间转换

    1.常见图像色彩空间 RGB RGB色彩模式是工业界的一种颜色标准,是通过对红(R).绿(G).蓝(B)三个颜色通道的变化以及它们相互之间的叠加来得到各式各样的颜色的,RGB即是代表红.绿.蓝三个通道 ...

  4. opencv学习笔记20:图像轮廓

    图像轮廓 Contours:轮廓 轮廓是将没有连着一起的边缘连着一起. 边缘检测检测出边缘,边缘有些未连接在一起. 注意问题 1.对象为二值图像,首先进行阈值分割或者边缘检测. 2.查找轮廓需要更改原 ...

  5. opencv学习笔记14:图像礼帽,图像黑帽

    python + OpenCV 图像礼帽 图像礼帽 也叫图像顶帽 礼帽图像=原始图像-开运算图像 得到噪声图像 开运算:先腐蚀再膨胀 使用对象:二值图像 使用方法:morphologyEx cv2.M ...

  6. opencv学习笔记7:图像加法与图像融合

    图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进制表示范围是0到255. 二进制相加 1.不超过255的,如100+58=158 2.两数相加 ...

  7. [转载] opencv学习笔记7:图像加法与图像融合

    参考链接: python opencv 基础 4: addWeighted() 融合两张图像 图像加法 1.使用Numpy加法 运算方式:结果=图像1+图像2 原理:图像数据格式为unit8 8位二进 ...

  8. opencv 手选roi区域_【opencv学习笔记六】图像的ROI区域选择与复制

    图像的数据量还是比较大的,对整张图片进行处理会影响我们的处理效率,因此常常只对图像中我们需要的部分进行处理,也就是感兴趣区域ROI.今天我们来看一下如何设置图像的感兴趣区域ROI.以及对ROI区域图像 ...

  9. opencv学习笔记19:图像金字塔和图像拉普拉斯金字塔 (用于图像放大和缩小)

    图像金字塔原理 图像金字塔:只不同分辨率,不同尺寸子图构成的集合. 取样 向下取样:有一个图像G0,对它重新采样,得到分辨率小些的G1,以此类推. 向上取样:有一个图像G3,然后变成像素更多的G2,以 ...

最新文章

  1. python指定位置写入文件_Python从文件中读取指定的行以及在文件指定位置写入
  2. IE下get传中文乱码的问题完美解决方案
  3. 基于.NET Socket API 通信的综合应用
  4. 虚拟桌面显示未注册的情况,可以检查一下几点
  5. ajax的url怎么将后缀补上_球形门锁怎么拆装?球形门锁安装的方法都包括哪些?
  6. dem数据(dem数据格式)
  7. 西门子step7安装注册表删除_西门子step7及软件包的完全卸载方法
  8. 【LeetCode01】找到字符串中最长的回文字串
  9. 微波雷达感应技术,在民用领域的发展应用,低功耗雷达传感模块
  10. 菜鸟笔记——html整理
  11. 这年代,你需要了解一下什么是聚合搜索(附站点推荐)
  12. realme发布最便宜5G手机,心生不忿的小米强调体验不好
  13. IMU内参标定以及初始化(9轴IMU,比6轴多三个姿态角信息)
  14. 【matlab报错问题个人总结】数组超出索引维度
  15. 第一章:搭建实验环境_eve-ng模拟器
  16. 怎样用putty设置SSH tunnel
  17. 记录第一个360浏览器翻译插件
  18. 丁香园开放医疗数据平台,覆盖药、病、诊、科研等7大应用场景
  19. 利用清华镜像快速安装Python第三方库
  20. LeetCode-375.猜数字大小

热门文章

  1. 2019-01-25T01:30:00.000+0000 java取出的问题
  2. 进行域名解析时,递归和迭代查询方式是什么意思?
  3. 美丽乡村可行性研究报告
  4. APP - APP监控软件,美团 24 小时不间断定位上热搜
  5. Python数据类型变量命名format集合等
  6. 50个直击灵魂的问题_质量管理50个常见问题详解
  7. alibaba pc safe service无法删除,一直在后台运行怎么办?
  8. N4BiasFieldCorrection
  9. 华南农业大学c语言怎么考,华南农业大学期末考试试卷 C语言考试合集
  10. 纳米金/银修饰空心/杂化/纳米管和链霉亲和素修饰/纳米金粒子修饰单分散聚苯乙烯微球制备方式