首页 > 其他分享 >OpenCV——第三章(图形的绘制)

OpenCV——第三章(图形的绘制)

时间:2024-08-24 10:56:41浏览次数:14  
标签:canvas 第三章 cv2 50 画布 OpenCV np import 绘制

1.线段的绘制

line()方法的语法格式如下:
img = cv2.line(img, pt1, pt2, color, thickness)
# 参数说明
# img:画布
# pt1: 线段的起点坐标
# pt2: 线段的终点坐标
# color:线条颜色
# thickness: 线条宽度

接下来我们使用该方法绘制一个图形吧!!!

import numpy as np 
import cv2

# np.zeros():创建了一个画布
# (300, 300, 3):一个300 x 300,具有3个颜色空间(即Red、Green和Blue)的画布
# np.uint8:OpenCV中的灰度图像和RGB图像都是以uint8存储的,因此这里的类型也是uint8

canvas = np.zeros((300, 300, 3), np.uint8) # 黑色背景
# canvas = np.ones((300, 300, 3), np.uint8) * 255 # 白色背景


# 在画布上,绘制一条起点坐标为(50, 50)、终点坐标为(250, 50),蓝色的,线条宽度为10的线段
canvas = cv2.line(canvas, (50, 50), (250, 50), (255, 0, 0), 10)
# 在画布上,绘制一条起点坐标为(150, 50)、终点坐标为(150, 250),黄色的,线条宽度为5的线段
canvas = cv2.line(canvas, (150, 50), (150, 250), (0, 255, 255), 5)
# 在画布上,绘制一条起点坐标为(150, 150)、终点坐标为(190, 190),红色的,线条宽度为5的线段
canvas = cv2.line(canvas, (150, 150), (190, 190), (0, 0, 255), 5)
cv2.imshow("Lines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

2.矩形的绘制

2.1 矩形

# rectangle()方法
# img = cv2.rectangle(img, pt1, pt2, color, thickness)
# img:画布
# pt1:左上角坐标
# pt2:右下角坐标
# color: 颜色
# thinckness: 线条宽度

 下面是一个绘制矩形边框的实例

import numpy as np 
import cv2

canvas = np.zeros((300, 300, 3), np.uint8)
# 在画布上绘制一个左上角坐标为(50,50),右下角坐标为(200,150),青色的,线条宽度为20的矩形边框
canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 255, 0), 20)
cv2.imshow("Rectangle", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

下面是一个绘制实心矩形的实例:

import numpy as np 
import cv2

canvas = np.zeros((300, 300, 3), np.uint8)
canvas = cv2.rectangle(canvas, (50, 50), (200, 150), (255, 25, 0), -1)
cv2.imshow("Rectangle", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

2.2 正方形

实例如下:

import numpy as np 
import cv2

canvas = np.zeros((300, 300, 3), np.uint8)
# 绘制一个左上角坐标为(50,50),右下角坐标为(250,250),红色的,线条宽度为40的正方形边框
canvas = cv2.rectangle(canvas, (50, 50), (250, 250), (0, 0, 255), 40)
# 绘制一个左上角坐标为(90,90),右下角坐标为(210,210),绿色的,线条宽度为30的正方形边框
canvas = cv2.rectangle(canvas, (90, 90), (210, 210), (0, 255, 0), 30)
# 绘制一个左上角坐标为(120,120),右下角坐标为(180,180),蓝色的,线条宽度为20的正方形边框
canvas = cv2.rectangle(canvas, (120, 120), (180, 180), (255, 0, 0), 20)
# 绘制一个左上角坐标为(140,140),右下角坐标为(160,160),橙色的实心正方形
canvas = cv2.rectangle(canvas, (140, 140), (160, 160), (0, 155, 255), -1)
cv2.imshow("Square", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

3.圆形的绘制

3.1 实心圆

circle()方法的语法格式如下:

img = cv2.circle(img, center, radius, color, thickness)

# center:圆心坐标

# radius:半径

实现代码如下:

import numpy as np 
import cv2


canvas = np.zeros((100, 300, 3), np.uint8)
# 在画布上,绘制一个圆心坐标为(50, 50),半径为40的实心圆形
canvas = cv2.circle(canvas, (50, 50), 40, (0, 255, 255), -1)
# 在画布上,绘制一个圆心坐标为(150, 50),半径为40的实心圆形
canvas = cv2.circle(canvas, (150, 50), 40, (85, 125, 255), -1)
# 在画布上,绘制一个圆心坐标为(250, 50),半径为40的实心圆形
canvas = cv2.circle(canvas, (250, 50), 40, (50, 125, 200), -1)
cv2.imshow("TrafficLights", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

3.2 同心圆

import numpy as np 
import cv2


canvas = np.zeros((300, 300, 3), np.uint8)
# shape[1]表示画布的宽度,center_X表示圆心的横坐标
# 圆心的横坐标等于画布的宽度的一半
center_X = int(canvas.shape[1] / 2)
# shape[0]表示画布的高度,center_X表示圆心的纵坐标
# 圆心的纵坐标等于画布的高度的一半
center_Y = int(canvas.shape[0] / 2)
# r表示半径;其中,r的值分别为0、30、60、90和120
for r in range(0, 150, 30): # [0, 150), 步长30
    # 绘制一个圆心坐标为(center_X, center_Y),半径为r,绿色的,线条宽度为5的圆形
    cv2.circle(canvas, (center_X, center_Y), r, (90, 125, 90), 5)
cv2.imshow("Circles", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

3.3 随机实心圆

import numpy as np 
import cv2


canvas = np.zeros((300, 300, 3), np.uint8)
# 通过循环绘制100个实心圆
for numbers in range(0, 101):
    # 获得随机的圆心横坐标,这个横坐标在[0, 299]范围内取值
    center_X = np.random.randint(0, high = 300)
    # 获得随机的圆心纵坐标,这个纵坐标在[0, 299]范围内取值
    center_Y = np.random.randint(0, high = 300)
    # 获得随机的半径,这个半径在[11, 70]范围内取值
    radius = np.random.randint(11, high = 71)
    # 获得随机的线条颜色,这个颜色由3个在[0, 255]范围内的随机数组成的列表表示
    color = np.random.randint(0, high = 256, size = (3,)).tolist()
    # 绘制一个圆心坐标为(center_X, center_Y),半径为radius,颜色为color的实心圆形
    cv2.circle(canvas, (center_X, center_Y), radius, color, -1)
cv2.imshow("Circles", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

4.多边形的绘制

多边形绘制的polylines()方法语法结构如下:

img = cv2.polylines(img, pts, isClosed, color, thickness)

# pts:由多边形各个顶点坐标组成的数组

# isClosed: 如果值为True, 表示一个闭合的多边形;如果为False, 表示一个不闭合的多边形

实例如下:

import numpy as np 
import cv2


canvas = np.zeros((300, 300, 3), np.uint8)
# 按顺时针给出等腰梯形4个顶点的坐标
# 这4个顶点的坐标构成了一个大小等于“顶点个数 * 1 * 2”的数组
# 这个数组的数据类型为np.int32
pts = np.array([[100, 50], [200, 50], [250, 250], [50, 250]], np.int32)

canvas = cv2.polylines(canvas, [pts], True, (0, 255, 255), 5)
cv2.imshow("Polylines", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

 

5.文字的绘制

OpenCV提供了putText()方法实现对文字的绘制, 该方法的语法格式如下:

 img = cv2.putText(img, text, org, fontFace, fontScale, color, thickness, lineType, bottomLeftOrigin)

# text: 要绘制的文字内容

# org: 文字在画布中的左下角坐标

# fontFace: 字体样式

# fontScale: 字体大小

# lineType: 线型(默认值为8)

# bottomLeftOrigin: 绘制文字的方向(默认值为False)

 下面的可以使用的一些字体样式:

  1. cv2.FONT_HERSHEY_SIMPLEX: 普通的无衬线字体
  2. cv2.FONT_HERSHEY_PLAIN: 更细的无衬线字体
  3. cv2.FONT_HERSHEY_DUPLEX: 具有一些粗细的无衬线字体
  4. cv2.FONT_HERSHEY_COMPLEX: 复杂的无衬线字体
  5. cv2.FONT_HERSHEY_TRIPLEX: 更复杂的无衬线字体
  6. cv2.FONT_HERSHEY_COMPLEX_SMALL: 小号复杂的无衬线字体
  7. cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 手写风格字体
  8. cv2.FONT_HERSHEY_SCRIPT_COMPLEX: 更复杂的手写风格字体
import numpy as np 
import cv2


canvas = np.zeros((100, 160, 3), np.uint8)
# 在画布上绘制文字“dmsj”,文字左下角的坐标为(20, 70)
# 字体样式为FONT_HERSHEY_TRIPLEX
# 字体大小为2,线条颜色是绿色,线条宽度为5
cv2.putText(canvas, "dmsj", (20, 70), cv2.FONT_HERSHEY_SCRIPT_SIMPLEX, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

 

大家可以修改示例代码体验不同的字体样式(该方法不可以显示中文)

5.1 斜体效果

FONT_ITALIC可以与其他文字类型一起使用

import numpy as np 
import cv2

canvas = np.zeros((100, 300, 3), np.uint8)
# 字体样式为FONT_HERSHEY_TRIPLEX和FONT_ITALIC
fontStyle = cv2.FONT_HERSHEY_TRIPLEX + cv2.FONT_ITALIC

cv2.putText(canvas, "dmsj", (20, 70), fontStyle, 2, (0, 255, 0), 5)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

 

5.2 垂直镜像效果

bottomLeftQrigin值为True时,文字将体现垂直镜像效果

import numpy as np 
import cv2


canvas = np.zeros((200, 300, 3), np.uint8)

fontStyle = cv2.FONT_HERSHEY_TRIPLEX

cv2.putText(canvas, "dmsj", (20, 70), fontStyle, 2, (0, 255, 0), 5)
# 使文字“dmsj”呈现垂直镜像效果,这时lineType和bottomLeftOrigin变成了必须参数
# 其中,lineType取默认值8,bottomLeftOrigin的值为True
cv2.putText(canvas, "dmsj", (20, 100), fontStyle, 2, (0, 255, 0), 5, 8, True)
cv2.imshow("Text", canvas) # 显示画布
cv2.waitKey()
cv2.destroyAllWindows()

5.3 图像上绘制文字

import cv2

image = cv2.imread(r"C:\Users\cgs\Desktop\pictures\5(1).jpg")

fontStyle = cv2.FONT_HERSHEY_TRIPLEX

cv2.putText(image, "pig", (20, 90), fontStyle, 1, (0, 0, 255))
cv2.imshow("Text", image) 
cv2.waitKey()
cv2.destroyAllWindows()

6.动态绘制图形

import cv2
import time
import numpy as np

width, height = 400, 400  # 画面的宽和高
r = 20  # 正方形边长的一半
x = r + 20  # 正方形起始横坐标
y = r + 100  # 正方形起始纵坐标
x_offer = y_offer = 4  # 每一帧的移动速度

while True:  # 持续循环直到按下按键
    if x > width - r or x < r:  # 如果正方形的横坐标超出边界
        x_offer *= -1  # 横坐标速度取相反值
    if y > height - r or y < r:  # 如果正方形的纵坐标超出边界
        y_offer *= -1  # 纵坐标速度取相反值
    x += x_offer  # 正方形按照横坐标速度移动
    y += y_offer  # 正方形按照纵坐标速度移动
    img = np.ones((width, height, 3), np.uint8) * 255  # 绘制白色背景面板
    
    # 绘制红色实心正方形
    top_left = (int(x - r), int(y - r))
    bottom_right = (int(x + r), int(y + r))
    cv2.rectangle(img, top_left, bottom_right, (155, 0, 150), -1)
    
    
    cv2.imshow("img", img)  # 显示图像

    if cv2.waitKey(1) != -1:  # 如果按下任何键
        break  # 退出循环 

cv2.destroyAllWindows()  # 释放所有窗体

 

<iframe allowfullscreen="true" data-mediaembed="csdn" frameborder="0" id="ZJp6MePk-1724468284242" src="https://live.csdn.net/v/embed/419735"></iframe>

屏幕录制 2024-08-24 105247

标签:canvas,第三章,cv2,50,画布,OpenCV,np,import,绘制
From: https://blog.csdn.net/2301_80166849/article/details/141489264

相关文章

  • 计算机毕业设计opencv+pytorch疲劳驾驶检测系统 自动驾驶 面部多信息特征融合的疲劳驾
    创新点:算法模型训练、可视化、深度学习框架、疲劳监测、模拟自动驾驶检测驾驶员疲劳核心算法:基于多信息特征指标融合建立驾驶员疲劳评价体系通过构建一种驾驶员面部多信息特征融合综合评价方法,为了能够将系统检测结果更直观的体现,研究了基于一种改进的粗糙集理论对各项特征结......
  • Python的OpenCV转换图像大小
    在Python中,使用OpenCV库来转换图像大小是一个常见的操作,它可以帮助你调整图像到特定的尺寸,以适应不同的应用场景,比如图像预处理、模型输入等。下面是一个详细的代码示例,展示了如何使用OpenCV来转换图像的大小。首先,确保你已经安装了OpenCV库。如果还没有安装,可以通过pip安装:bash......
  • OpenCV入门指南:开启计算机视觉之旅
    在计算机视觉领域,OpenCV(OpenSourceComputerVisionLibrary)是一个开源的计算机视觉和机器学习软件库,它提供了丰富的图像处理与视觉识别功能,广泛应用于学术研究与工业界。一、OpenCV安装在开始之前,你需要安装OpenCV库。这里以Python环境为例进行说明:使用pip安装:打开你的......
  • opencv中cv2.KeyPoint和cv2.DMatch的理解
    cv2.KeyPoint是opencv中关键点检测函数detectAndCompute()返回的关键点的类,他包含关键点的位置、方向等属性具体如下:point2fpt;//位置坐标floatsize;//特征点邻域直径floatangle;//特征点的方向,值为[0,360),负值表示不使用floatresponse;intoctave;//特征点所在的图像......
  • OpenCV(cv::FileStorage())
    目录1.功能2.方法和用法3.示例3.1写入数据3.2读取数据4.常见数据格式5.注意事项6.总结cv::FileStorage()是OpenCV提供的一个用于读写文件的类,主要用于读取和写入结构化数据(如XML、YAML或JSON文件)。它是用于在文件和内存之间存储和检索复杂数据结构的工具,例如矩......
  • OpenCV(cv::RNG、cv::theRNG())
    目录1.cv::RNG1.1构造函数1.2常用方法1.3示例2.cv::theRNG()2.1使用方式2.2全局随机数生成器的优点2.3示例3.总结在OpenCV中,cv::RNG和cv::theRNG()是用于随机数生成的工具,常用于图像处理、计算机视觉中的数据生成、扰动操作等。1.cv::RNGcv::RNG是一个用于生......
  • qt5.14.2 MSVC opencv(不结合vs)路径添加问题 测试通过
     不换行写法1win32:CONFIG(release,debug|release):LIBS+=-LG:/opencv4.4.0/opencv4.4_vs_msvc19_qt6.5/x64/vc17/lib/-lopencv_aruco440-lopencv_bgsegm440-lopencv_bioinspired440-lopencv_calib3d440-lopencv_ccalib440-lopencv_core440-lopencv_cvv440-lopen......
  • Qt5.14.2 MinGW7.3.0_64 opencv helloworld
    路径配置.proINCLUDEPATH+=E:\Opencv\includeLIBS+=E:\Opencv\x64\mingw\lib\libopencv_*.a 点击按钮打开一张图片1#include"mainwindow.h"2#include"ui_mainwindow.h"3#include<QFileDialog>4#include<QMessageBox>5......
  • 第三章 redis数据类型
    redis数据类型redis可以理解成一个全局的大字典,key就是数据的唯一标识符。根据key对应的值不同,可以划分成5个基本数据类型。redis={"name":"yuan","scors":["100","89","78"],"info":{"name":"rain"......
  • OpenCV 机器人手眼标定
    OpenCV机器人手眼标定(九点标定法)对于初学者而言,对相机的标定经常模糊不清。不知道机器坐标与相机坐标如何转换,两个坐标系又是如何建立?我们通常是利用张氏标定法,针对于相机的畸变进行标定,利用校正得到的参数对图形进行处理后再呈现出来。这个方法网上用的人很多,资......