open-cv绘制简单形状line() circle() rectangle() polylines() putText() cvtColor()

OpenCV彩色图像中一个像素是按照“B-G-R”模式组织的。
绘图函数的一些公众参数:
img :图像对象
color: 颜色,如果彩色用一个三元组表示,三元组的元素按照B-G-R组织,三元组(0,255,0)中B为0,G为255,R为0所以表示的是纯绿色。如果是灰度,则用单个数值表示.
thickness:线条宽度。
point:点位置,用一个二元组表示。
lineType : 线条类型,在绘制曲线时通常使用CV2.LINE_AA可以有更好的平滑效果。

1.

直线 cv2.line()
第一个参数为要绘图的图像实例
第二个参数为起点,二元组
第三个参数为终点,二元组
第四个参数为颜色
第五个参数为线宽

先用numpy构建一个512×512大小的纯白色图片对象:img = np.ones((512,512,3)),
起点选在start=(50,50),终点选择stop=(300,300),颜色设置为红色color=(0,0,255),线宽thick=5import cv2
import numpy as np
print('VX公众号: 桔子code / juzicode.com')
print('cv2.__version__:',cv2.__version__)
img = np.ones((512,512,3))
#img = np.zeros((512,512)) #黑色背景
#img = np.ones((512,512)) #白色背景
start=(50,50)
stop=(300,300)
color=(0,0,255)
thick=5
cv2.line(img,start,stop,color,thick)
cv2.imshow('img',img)
cv2.waitKey()

2

.圆形cv2.circle()
第1参数是图像对象;
第2个参数为圆心;
第3个参数为半径;
第4个参数为颜色;
第5个参数为线条宽度,如果使用-1会自动填充圆形的内部;

import cv2
import numpy as np
img = np.ones((512,512,3)) #白色背景
center=(100,100)
radius=50
color=(0,255,255)  #黄色
cv2.circle(img,center, radius, color, 5) #线条

center=(200,200)
cv2.circle(img,center, radius, color, -1) #填充
cv2.imshow('img',img)
 
cv2.waitKey()

3.

方形cv2.rectangle()
第1个参数为图像对象;
第2个参数为方形左上角坐标;
第3个参数为方形右下角坐标,方形的宽高自动根据起始点坐标计算;
第4个参数为颜色;
第5个参数为线条宽度,如果使用-1会自动填充圆形的内部;

import cv2
import numpy as np
img = np.ones((512,512,3)) #白色背景

topleft=(10,100)
downright=(111,333)
color=(255,0,0)  #蓝色
cv2.rectangle(img,topleft, downright, color, 2) #线条

topleft=(300,100)
downright=(500,300)
color=(0,255,0)  #蓝色
cv2.rectangle(img,topleft, downright, color, -1) #填充

cv2.imshow('juzicode',img)
 
cv2.waitKey()

4

多边形cv2.polylines()

import cv2
import numpy as np
img = np.ones((512,512,3)) #白色背景
color=(0,255,0)  #绿色
#五角星
pts = np.array([[70,190],[222,190],[280,61],[330,190],[467,190],
     [358,260],[392,380],[280,308],[138,380],[195,260]])
pts = pts.reshape((-1,1,2))  #reshape为10x1x2的numpy
print(pts.shape)     # (10, 1, 2)
cv2.polylines(img,[pts],True,color,5)
#方形
pts = np.array([[10,50],[100,50],[100,100],[10,100]])
pts = pts.reshape((-1,1,2))#-1 表示自适应该维度大小。

这里 reshape 的第一个参数为-1, 表明这个参数是根据后面的维度1X2的计算出来的。
比如如果一个 array有 NX1X2个元素,那么它的 reshape(-1, 1, 2) 方法将返回一个 shape = (n, 1, 2) 的 ndarray.

cv2.polylines(img,[pts],True,color,3)
 
cv2.imshow('juzicode.com',img)
cv2.waitKey()

5.

输出文字:cv2.putText()
第1个参数为图像对象;
第2个参数为要输出的字符串;
第3个参数为起始点位置;
第4个参数为字体;
第5个参数为字体大小;
第6个参数为颜色;
第7个参数为线条宽度,默认为1;
第8个参数为线型,默认为LINE8;

import cv2
import numpy as np
img = np.ones((512,512,3)) #白色背景
text = 'VX:juzicode'
start = (10,200) 
font = cv2.FONT_HERSHEY_SIMPLEX
fontscale = 2
color=(0,0,255)  #红色
thick = 2
linetype = cv2.LINE_AA
cv2.putText(img,text,start, font, fontscale, color,thick,linetype)
 
cv2.imshow('juzicode.com',img)
cv2.waitKey()

OpenCV中并没有包含中文字体,一个变通的方法是通过pillow转换后显示中文:

import cv2
import numpy as np
from PIL import Image,ImageDraw,ImageFont
img = np.full((512,512,3),255,np.uint8) #白色背景
img_pil = Image.fromarray(cv2.cvtColor(img,cv2.COLOR_BGR2RGB))

text = 'VX:图片code'
start = (10,200)      #起始位置
fonttype = 'msyh.ttc' #微软雅黑字体,和具体操作系统相关
fontscale = 30        #字体大小
font = ImageFont.truetype(fonttype,fontscale)
draw = ImageDraw.Draw(img_pil)
draw.text(start,text,font=font,fill=(255,0,0))  #PIL中BGR=(255,0,0)表示红色
img_ocv = np.array(img_pil)                     #PIL图片转换为numpy
img = cv2.cvtColor(img_ocv,cv2.COLOR_RGB2BGR)   #PIL格式转换为OpenCV的BGR格式
cv2.imshow('tupian',img)
cv2.waitKey()


cv2.cvtColor(p1,p2) 是颜色空间转换函数,p1是需要转换的图片
,p2是转换成何种格式。
cv2.COLOR_BGR2RGB 将BGR格式转换成RGB格式
cv2.COLOR_BGR2GRAY 将BGR格式转换成灰度图片
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,下面是一个可以派生circlelinerectangle等类的C++ Geometry类示例: ```c++ // 基类 Geometry class Geometry { public: // 纯虚函数,用于计算面积 virtual double area() = 0; }; // 派生圆类 Circle class Circle : public Geometry { public: // 构造函数 Circle(double radius) : radius(radius) {} // 重载 area() 函数 double area() { return PI * radius * radius; } private: const double PI = 3.14159265358979323846; double radius; }; // 派生直线类 Line class Line : public Geometry { public: // 构造函数 Line(double length) : length(length) {} // 重载 area() 函数 double area() { return 0.0; } private: double length; }; // 派生矩形类 Rectangle class Rectangle : public Geometry { public: // 构造函数 Rectangle(double length, double width) : length(length), width(width) {} // 重载 area() 函数 double area() { return length * width; } private: double length; double width; }; ``` 在这个示例中,我们定义了一个基类 Geometry,它包含一个纯虚函数 area(),用于计算面积。然后我们派生了三个类:CircleLineRectangle,它们都继承了Geometry基类,并重载了area()函数,以计算特定形状的面积。 你可以在主函数中创建一个Geometry类的对象,并使用其方法计算面积。例如: ```c++ int main() { Geometry* shape1 = new Circle(5.0); Geometry* shape2 = new Line(10.0); Geometry* shape3 = new Rectangle(3.0, 4.0); std::cout << "The area of circle is " << shape1->area() << std::endl; std::cout << "The area of line is " << shape2->area() << std::endl; std::cout << "The area of rectangle is " << shape3->area() << std::endl; delete shape1; delete shape2; delete shape3; return 0; } ``` 输出结果为: ``` The area of circle is 78.5398 The area of line is 0 The area of rectangle is 12 ``` 注意,在使用完指针后,我们需要使用delete操作符释放内存。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值