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

2024-03-15 22:44
文章标签 opencv 操作 基本 线条

本文主要是介绍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中可以利用其中原理完成很多有意思的操作,各位可以自己进行操作。 

这篇关于OpenCV(八)——基本线条操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/813508

相关文章

使用opencv优化图片(画面变清晰)

文章目录 需求影响照片清晰度的因素 实现降噪测试代码 锐化空间锐化Unsharp Masking频率域锐化对比测试 对比度增强常用算法对比测试 需求 对图像进行优化,使其看起来更清晰,同时保持尺寸不变,通常涉及到图像处理技术如锐化、降噪、对比度增强等 影响照片清晰度的因素 影响照片清晰度的因素有很多,主要可以从以下几个方面来分析 1. 拍摄设备 相机传感器:相机传

基本知识点

1、c++的输入加上ios::sync_with_stdio(false);  等价于 c的输入,读取速度会加快(但是在字符串的题里面和容易出现问题) 2、lower_bound()和upper_bound() iterator lower_bound( const key_type &key ): 返回一个迭代器,指向键值>= key的第一个元素。 iterator upper_bou

【IPV6从入门到起飞】5-1 IPV6+Home Assistant(搭建基本环境)

【IPV6从入门到起飞】5-1 IPV6+Home Assistant #搭建基本环境 1 背景2 docker下载 hass3 创建容器4 浏览器访问 hass5 手机APP远程访问hass6 更多玩法 1 背景 既然电脑可以IPV6入站,手机流量可以访问IPV6网络的服务,为什么不在电脑搭建Home Assistant(hass),来控制你的设备呢?@智能家居 @万物互联

opencv 滚动条

参数介绍:createTrackbar( trackbarname , "hello" , &alpha_slider ,alpha_max ,  on_trackbar )  ;在标签中显示的文字(提示滑动条的用途) TrackbarName创建的滑动条要放置窗体的名字 “hello”滑动条的取值范围从 0 到 alpha_max (最小值只能为 zero).滑动后的值存放在

android-opencv-jni

//------------------start opencv--------------------@Override public void onResume(){ super.onResume(); //通过OpenCV引擎服务加载并初始化OpenCV类库,所谓OpenCV引擎服务即是 //OpenCV_2.4.3.2_Manager_2.4_*.apk程序包,存

C 语言的基本数据类型

C 语言的基本数据类型 注:本文面向 C 语言初学者,如果你是熟手,那就不用看了。 有人问我,char、short、int、long、float、double 等这些关键字到底是什么意思,如果说他们是数据类型的话,那么为啥有这么多数据类型呢? 如果写了一句: int a; 那么执行的时候在内存中会有什么变化呢? 橡皮泥大家都玩过吧,一般你买橡皮泥的时候,店家会赠送一些模板。 上

FreeRTOS-基本介绍和移植STM32

FreeRTOS-基本介绍和STM32移植 一、裸机开发和操作系统开发介绍二、任务调度和任务状态介绍2.1 任务调度2.1.1 抢占式调度2.1.2 时间片调度 2.2 任务状态 三、FreeRTOS源码和移植STM323.1 FreeRTOS源码3.2 FreeRTOS移植STM323.2.1 代码移植3.2.2 时钟中断配置 一、裸机开发和操作系统开发介绍 裸机:前后台系

动手学深度学习【数据操作+数据预处理】

import osos.makedirs(os.path.join('.', 'data'), exist_ok=True)data_file = os.path.join('.', 'data', 'house_tiny.csv')with open(data_file, 'w') as f:f.write('NumRooms,Alley,Price\n') # 列名f.write('NA

OpenCV结构分析与形状描述符(11)椭圆拟合函数fitEllipse()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C++11 算法描述 围绕一组2D点拟合一个椭圆。 该函数计算出一个椭圆,该椭圆在最小二乘意义上最好地拟合一组2D点。它返回一个内切椭圆的旋转矩形。使用了由[90]描述的第一个算法。开发者应该注意,由于数据点靠近包含的 Mat 元素的边界,返回的椭圆/旋转矩形数据

线程的四种操作

所属专栏:Java学习        1. 线程的开启 start和run的区别: run:描述了线程要执行的任务,也可以称为线程的入口 start:调用系统函数,真正的在系统内核中创建线程(创建PCB,加入到链表中),此处的start会根据不同的系统,分别调用不同的api,创建好之后的线程,再单独去执行run(所以说,start的本质是调用系统api,系统的api