OpenCV(八)——基本线条操作

基本线条操作

OpenCV中提供了基本的线条的操作,包括画直线、画矩形、画圆形等。

(1)画直线,在OpenCV中利用line()画直线,形式为image_with_line = cv2.line(image, start_point, end_point, color, thickness)。line()中有5个参数,其中第一个参数image是需要处理的图像;第二个参数start_point是直线开始的像素点;第三个参数end_point直线结束的像素点;第四个参数color是直线的颜色;第五个参数thickness是直线的宽度。

例如画一个宽度为6的斜绿色线条:

import cv2
import numpy as npcanvas=np.zeros((200,200,3),dtype='uint8')
start_point=(0,0)
end_point=(200,200)color=(0,255,0)
#绿色直线
thickness=6
#图像宽度为6
image_with_line = cv2.line(canvas, start_point, end_point, color, thickness)
cv2.imshow('image',image_with_line)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

如运行结果所示,在一块200×200的黑色画布上,绘制了一条宽度为6的绿色斜线条。

(2)画圆形。OpenCV使用circle()函数画圆,基本形式是image_with_circle = cv2.circle(image, center_coordinates, radius, color, thickness)。circle()函数一共有五个参数,其中第一个参数image是需要处理的图片;第二个参数center_coordinates是圆的中心点;第三个参数radius是圆的半径;第四个参数color是圆的颜色;第五个参数radius是圆的宽度。

例如画一个宽度为2像素、半径为100像素的蓝色圆形:

import cv2
import numpy as npcanvas=np.zeros((200,200,3),dtype='uint8')
# 定义圆的中心坐标和半径
center_coordinates = (100, 100)
radius = 50# 定义圆边界线的颜色(蓝色)和粗细(2像素)
color = (255, 0, 0)
thickness = 2# 在图像上绘制圆形
image_circle = cv2.circle(canvas, center_coordinates, radius, color, thickness)# 显示图像
cv2.imshow('image_circle', image_circle)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

如果我们需要填充图形,只需要将circle函数的内容设置为负数,

thickness = -1
image_circle = cv2.circle(canvas, center_coordinates, radius, color, thickness)

运行结果如下所示:

可以看到,当thickness设置为-1的时候改成成功画了一个满圆。

在OpenCV中可以进行很多有意思的操作,例如利用随机数画圆:

import cv2
import numpy as np
import randomcanvas=np.ones((400,400,3),dtype='uint8')*255
center=(200,200)
thickness=1
for i in range(255):radius=icolor=np.random.randint(0,256,size=(3,)).tolist() #颜色随机cv2.circle(canvas,center,radius,color,1)
cv2.imshow('different_color',canvas)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

可以看到OpenCV以中心点为圆形,画了两百多个圆,形成五彩的图像。 

(3)画矩形。OpenCV使用rectangle()函数画矩形,基本形式是v2.rectangle(img, pt1, pt2, color, thickness=1, lineType=8, shift=0)。rectangle()函数一共有七个参数,其中第一个参数img是需要操作图片;第二个参数pt1是顶点的坐标,;第三个参数pt2是另一个顶点的坐标,第四个参数color是矩阵的颜色;第五个参数thickness表示矩阵线条的宽度,默认值为1,如果设置了负值,如cv2.FILLED,会绘制指定颜色的矩阵;第六个参数lineType是线条的类型,默认值为8,这通常与cv2.LINE_AAcv2.LINE_4等常量有关,用于定义线条的连接类型;第七个参数shift是坐标点的小数点位数,默认值为0。

例如:

import cv2
import numpy as np# 创建一个空白的图像,单通道,白色背景
image = np.ones((500, 500, 3), dtype="uint8") * 255# 定义长方形的两个顶点坐标
pt1 = (100, 100)
pt2 = (400, 360)color = (87, 134, 255) # BGR格式# 使用rectangle函数绘制长方形
thickness=5
rectangle = cv2.rectangle(image, pt1, pt2, color, thickness)# 显示图像
cv2.imshow('Rectangle', rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

如上图所示画了一个粗细程度为5的长方形,两个顶点为(100,100)和(400,300)。

同样如果thickness的值为负数的话,那么该图形也为填充图形,例如将上面的部分代码改为:

color = (40,206,72) # BGR格式
thickness=-1
rectangle = cv2.rectangle(image, pt1, pt2, color, thickness)

运行结果如下所示:

我们同样可以对于图片进行操作,例如:

import cv2
import numpy as npimage=cv2.imread(r'D:\Photo\1.jpeg')
# 定义长方形的两个顶点坐标
pt1 = (80,32)
pt2 = (400, 360)color = (0,0,255) # BGR格式
thickness=5
rectangle = cv2.rectangle(image, pt1, pt2, color, thickness)# 显示图像
cv2.imshow('Rectangle', rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

我们可以看,利用长方形的操作将狗的头部成功的标记了出来,该处理方式在实际应用的有一定的应用范围。 

(4)绘制椭圆

在OpenCV中使用ellipse()函数绘制椭圆,ellipse()函数的使用方式为:ellipse = cv2.ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness)。第一个参数image是需要处理的图像;第二个参数center表示的是中心点的坐标;第三个参数axes是椭圆的旋转角度,以度为单位;第四个参数和第五个参数startAngle和endAngle定义椭圆弧段的范围,如果是绘制完整椭圆,这两个参数可以设置为0和360度;第六个参数color设置椭圆弧或椭圆的颜色;第七个参数thickness椭圆边缘线的粗细,如果设置为负数,则会填充椭圆;第八个参数lineType是线条的类型,默认为8;第九个参数shift是坐标点的小数点位数,通常保持默认值0。

例如:

import cv2
import numpy as np# 创建一个空白的图像,单通道,白色背景
image = np.ones((400, 400, 3), dtype="uint8") * 255
center = (200, 200)
axes = (200, 100)
angle = 0
startAngle = 0
endAngle = 360
color = (0, 120, 240) 
thickness = 2# 使用ellipse函数绘制椭圆
ellipse = cv2.ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness)cv2.imshow('Ellipse', ellipse)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

 上面这段代码是画一个类似于橙色的椭圆,其中椭圆的长半轴为200,短半轴100,粗度为2。

当thickness为负数时,那么则就是将椭圆进行填充。

color = (100, 80, 120) 
thickness=-1ellipse = cv2.ellipse(image, center, axes, angle, startAngle, endAngle, color, thickness)

运行结果如下所示:

 (5)绘制文本字符串

在OpenCV中,putText()函数用于在图像上绘制文本字符串。putText()函数是OpenCV中专门用来在图像上添加文字的一个重要功能,它允许开发者在图像中的指定位置放置文字信息,基本形式是image_with_text = cv2.putText(image, text, org, font, fontScale, color, thickness/lineType/bottomLeftOrigin)(thickness、lineType、bottomLeftOrigin是可选择的)。其中基本形式是第一个参数image表示是需要处理的图片;第二个参数text是字符串的内容;第三个参数org是文本字符串的起始点,通常是一个形式的坐标点 (x,y);第四个参数font是字体类型,可以可以使用内置字体;第五个参数fontScaler表示的是字体比例因子,表示字体大小的一个乘数;第六个参数是color表示的是文本的颜色,用BGR格式的三元组表示;thickness表示的是线条的粗细程度,如果是负数,则会填充文本;lineType表示的是线条的类型,通常默认即可;bottomLeftOrigin表示的是布尔值,如果为真,则文本的左下角是锚点,否则默认为左上角是锚点。

注:在OpenCV中的块应用一共有8中,分别为:

  • cv2.FONT_HERSHEY_SIMPLEX:这是一种简单的字体,适合用于需要清晰、简洁文本的场合。
  • cv2.FONT_HERSHEY_PLAIN:这种字体相对于SIMPLEX版本稍微复杂一些,线条较为均匀。
  • cv2.FONT_HERSHEY_DUPLEX:这种字体比PLAIN字体更复杂,有更多的细节。
  • cv2.FONT_HERSHEY_COMPLEX:这是一种更为复杂的字体,适合用于需要一定装饰性的文本。
  • cv2.FONT_HERSHEY_TRIPLEX:这种字体比COMPLEX字体还要复杂,线条和装饰更多。
  • cv2.FONT_HERSHEY_COMPLEX_SMALL:这是一种较小的复杂字体,适合空间有限的场合。
  • cv2.FONT_HERSHEY_SCRIPT_SIMPLEX:这种字体类似于手写体,给人一种自然流畅的感觉。
  • cv2.FONT_HERSHEY_SCRIPT_COMPLEX:这是一种复杂的手写体风格字体,适合用于需要艺术感的文本。

 例如:

import cv2
import numpy as npimage = np.ones((300, 300, 3), dtype="uint8") * 255text="Hello World"
org=(75, 150)
font=cv2.FONT_HERSHEY_DUPLEX
fontScale=1
color=(255,0,255)
thickness=2# 使用putText函数绘制文本
image_text = cv2.putText(image, text, org, font, fontScale, color, thickness)# 显示图像
cv2.imshow('image_text', image_text)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

可以看到上图是一个紫色的Hello World(注意在OpenCV中不能使用中文,OpenCV不支持中文)。

在比如,我们在

import cv2
import numpy as npimage=cv2.imread(r'D:\Photo\1.jpeg')
text="This is a dog"
org=(40, 50)
font=cv2.FONT_HERSHEY_COMPLEX
fontScale=2
color=(0,0,255)
thickness=2# 使用putText函数绘制文本
image_text = cv2.putText(image, text, org, font, fontScale, color, thickness)# 显示图像
cv2.imshow('image_text', image_text)
cv2.waitKey(0)
cv2.destroyAllWindows()

运行结果如下所示:

在OpenCV中可以利用其中原理完成很多有意思的操作,各位可以自己进行操作。 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/755220.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

智慧矿山新趋势:大数据解决方案一览

1. 背景 随着信息技术的快速发展和矿山管理需求的日益迫切,智慧矿山作为一种创新的矿山管理方式应运而生。智慧矿山借助先进的信息技术,实现对矿山生产、管理、安全等各方面的智能化、高效化、协同化,是矿山行业转型升级的必然趋势。 欢迎关…

【LabVIEW FPGA入门】并行执行

利用图形化编程的并行特性以及 FPGA 上 LabVIEW 图的真正并行实现,您可以通过将应用程序代码划分为更小的进程来进一步优化执行速度。与整个应用程序在一个循环中运行相比,这使得每个进程能够实现更高的循环速率和更高的应用程序整体执行速率。 …

Java语法学习八之认识String类

String类的重要性 在C语言中已经涉及到字符串了,但是在C语言中要表示字符串只能使用字符数组或者字符指针,可以使用标准库提供的字符串系列函数完成大部分操作,但是这种将数据和操作数据方法分离开的方式不符合面相对象的思想,而…

C++开发基础——函数模板

一,函数模板 1.基础概念 模板编程是C中泛型编程的基础。 一个模板可以是创建类或者函数的蓝图。 模板编程分两种,分别是算法抽象的模板、数据抽象的模板。算法抽象的模板以函数模板为主,数据抽象的模板以类模板为主。 基于函数模板生成的…

13.Python从入门到精通—Python 集合操作与方法概览

13.Python从入门到精通—Python 集合操作与方法概览 Python 集合集合的基本操作1、添加元素2、移除元素3、计算集合元素个数4、清空集合5、判断元素是否在集合中存在 集合内置方法完整列表 Python 集合 在Python中,集合是一种无序、不重复的数据类型。集合通常用于…

MVC接收请求教程

mvc接收各种请求 1-环境搭建 1.1-准备apifox发送请求 1.2-项目搭建 ①创建Web骨架的Maven项目 ​ --打开2023-IDEA ,选择New Project ​ --选择Maven Archetype ​ --注意点:Catalog默认就行了 ​ --Archetype选择webapp ​ --JDK跟着黑马敲最好…

无需借助任何三方软件,使用Windows自带分区功能实现磁盘分区!

像上面截图那样,如果当你由于文件分类或磁盘容量,想增加或减少分区盘符该怎么办。简单的理解就是怎么从E盘再分出个F盘,或者怎么从E盘分出点空间把D盘空间增大。 这里就牵扯出一个概念,磁盘分区,大概意思就是把一整个物理磁盘在系统上分出好几块区域,用来存放不同的文件…

【C++练级之路】【Lv.14】二叉搜索树(进化的二叉树——BST)

快乐的流畅:个人主页 个人专栏:《C语言》《数据结构世界》《进击的C》 远方有一堆篝火,在为久候之人燃烧! 文章目录 引言一、二叉搜索树介绍二、二叉搜索树的模拟实现2.1 结点2.2 成员变量2.3 默认成员函数2.3.1 constructor2.3.2…

Springboot笔记-01

简化spring应用开发,约定大于配置 简化Spring应用开发的一个框架; 整个Spring技术栈的一个大整合; J2EE开发的一站式解决方案; 优点: 快速创建独立运行的spring项目以及于主流框架集成 使用嵌入式的Servlet容器&#x…

IonQ最新研究突破!引入光量子纠缠以构建量子计算网络

内容来源:量子前哨(ID:Qforepost) 编辑丨慕一 编译/排版丨沛贤 深度好文:700字丨5分钟阅读 2024年2月22日,美国量子计算公司IonQ宣布,公司研究团队已实现可重复地生成与离子纠缠的光子&#…

目标检测——YOLOv4算法解读

论文:YOLOv4:Optimal Speed and Accuracy of Object Detection 作者:Alexey Bochkovskiy, Chien-Yao Wang, Hong-Yuan Mark Liao 链接:https://arxiv.org/pdf/2004.10934.pdf 代码:https://github.com/AlexeyAB/darkne…

如何使用Excel进行设备管理:巡检、维修、保养、备件管理

在现代企业运营中,设备管理是维持生产效率和保障生产安全的关键环节。良好的设备管理包括设备的巡检、维修、保养和备件管理等多个方面。随着信息技术的发展,许多企业开始利用电子化工具来提高设备管理的效率和准确性。其中,Excel作为一款功能…

旅游行业分析及媒体邀约资源汇总

传媒如春雨,润物细无声,大家好,我是51媒体网胡老师。 酒店旅游行业分析及媒体邀约资源汇总是两个相对独立但又相互关联的领域。下面将分别对这两个方面进行概述。 酒店旅游行业分析 1. 市场概况 市场规模:评估市场的总价值、增长…

react中使用antdesign组件库的table组件实现自定义筛选菜单

需求如下: 这是一个表格的表头信息,实现这几列的筛选。 涉及到的筛选有:自定义选择项,动态生成选择项,自定义筛选菜单展示 1、依据antdesign官方给出的例子实现的,比如第一列,使用的是&#x…

阿里云RDS MySQL与自建MySQL数据库进行主从同步(GTID方式)

1、创建数据库,dump阿里云RDS数据,导入到自建MySQL 阿里云RDS的配置几乎不用动,只需从RDS开一个只读的账号出来。 在ECS服务器上远程导出RDS的数据库,执行下面命令,记得将[]内容替换掉 mysqldump -h http://***.mys…

安装vcenter管理esxi

安装vcenter管理esxi虚拟化操作系统 文章目录 安装vcenter管理esxi虚拟化操作系统1.安装vcenter2.vcenter的应用 1.安装vcenter esxi虚拟机具体安装步骤请参考上一篇文章,vcenter软件包需自己到网上下 2.vcenter的应用

电机学(笔记一)

磁极对数p: 直流电机的磁极对数是指电机定子的磁极对数,也等于电机电刷的对数。它与电机的转速和扭矩有直接关系。一般来说,极对数越多,电机转速越低,扭矩越大,适用于低速、高扭矩的场合;相反&…

Java-JVM 虚拟机原理调优实战

一、基础 栈帧(Stack Frame)栈空间的 基本元素,用于 方法的调用和方法的执行的数据结构 堆内存用来存放由new创建的对象和数组。在堆中分配的内存,由Java虚拟机的自动垃圾回收器来管理。在堆中产生了一个数组或对象后&#xff0c…

MATLAB的使用(一)

一,MATLAB的编程特点 a,语法高度简化; b,脚本式解释型语言; c,针对矩阵的高性能运算; d,丰富的函数工具箱支持; e,通过matlab本体构建跨平台; 二,MATLAB的界面 工具栏:提供快捷操作编辑器…

2024年腾讯云服务器租用价格表_1个月一年3年5年和1小时费用表

腾讯云服务器租用优惠价格表:轻量应用服务器2核2G3M价格61元一年、2核2G4M价格99元一年,540元三年、2核4G5M带宽165元一年,2核4G5M带宽756元三年、轻量4核8G12M服务器646元15个月,轻量4核16G12M服务器32元1个月、312元一年&#x…