OpenCV图像基础

目录

显示窗口

创建空白图像

保存图片

图像裁剪

调整图片大小

图像绘制

绘制圆形

绘制矩形

绘制直线

绘制文本

中文乱码

控制鼠标

视频处理


显示窗口

cv2.namedWindow(winname, flags=None)

创建一个命名窗口,以便在该窗口中显示图像或进行其他图形操作。

参数说明

  • winname (str): 窗口的名称。这个名称必须是唯一的,因为它是用来标识窗口的。

  • flags (int, 可选): 窗口的标志,用于设置窗口的行为。默认值为cv2.WINDOW_AUTOSIZE

    flags 常见的标志包括:

    • cv2.WINDOW_NORMAL: 允许调整窗口大小。

    • cv2.WINDOW_AUTOSIZE: 窗口大小根据图像大小自动调整,不能手动调整。

# 创建一个名为 "IMG" 的窗口,cv2.WINDOW_NORMAL设置允许调整大小
cv2.namedWindow('IMG', cv2.WINDOW_NORMAL)
# 2 设置名字和窗口大小(width,height)
cv2.resizeWindow('IMG', (500, 300))
# 读取图片
# 1.支持相对路径和绝对路径,2.图片路径不能包含中文
try:img = cv2.imread('pic/test1.jpg')# 显示图像cv2.imshow('IMG', img)# 等待用户按键cv2.waitKey(0)# 释放资源cv2.destroyAllWindows()except Exception as e:print(e)print("图片不存在")

创建空白图像

np.zeros((height, width, 3))

创建一个全零数组,这个数组可以表示一个空白图像。数组的形状应该符合图像的尺寸和通道数,例如,对于 RGB 图像,形状应为 (height, width, 3)

image = np.zeros((300, 500, 3), dtype=np.uint8)
cv2.imshow('img',image)
cv2.waitKey(0)

保存图片

cv2.imwrite(filename, img[, params])

用于将图像保存到文件中。

参数说明

  • filename (str): 要保存的文件路径和名称。支持的文件格式包括 .jpg, .png, .bmp, .tiff 等。

  • img (numpy.ndarray): 要保存的图像。通常是一个二维或三维的 NumPy 数组,表示图像的像素值。

返回值

  • bool: 成功保存图像返回 True,否则返回 False

import cv2# 读取图片
img = cv2.imread("images/car.png")
# 保存图片
rs = cv2.imwrite("save_image/car.png", img)
if rs:print("图像保存成功!")
else:print("图像保存失败!")

注意:

确保提供的文件路径是有效的,如果路径不存在,OpenCV 会尝试创建它,但如果权限不足则会保存失败。

图像裁剪

img[y:y+h, x:x+w]

在 OpenCV 中,图像切片用于从图像中提取一个子区域(矩形区域)。比如在目标检测、ROI(Region of Interest,感兴趣区域)提取等任务有用。

说明:

图像 img,类型: numpy.ndarray

  • x: 子区域左上角的 x 坐标。

  • y: 子区域左上角的 y 坐标。

  • w: 子区域的宽度。

  • h: 子区域的高度。

img = cv2.imread('pic/test2.png')# 定义坐标
x=100
y=150
w=150
h=100sub_img =img[y:y+h,x:x+w]
cv2.imshow("sub_img",sub_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

注意:

  • 边界检查:确保 (x, y)(x+w, y+h) 都在图像的边界内,否则会导致数组索引越界错误。

  • 数据类型img 通常是 numpy.ndarray 类型,切片操作返回的也是 numpy.ndarray 类型。

调整图片大小

cv2.resize(src, dsize, dst)

用于调整图像的大小,对图像进行缩放、放大或缩小以适应不同需求。

参数说明

  • src (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。

  • dsize (tuple): 输出图像的尺寸,是一个二元组 (width, height)

返回值

  • dst (numpy.ndarray): 缩放后的图像。

import cv2img = cv2.imread("images/car.png")
#获取图片的像素和通道数
height, width, channels = img.shape
print(f"高度:{height},宽度:{width},通道数:{channels}")
#调整图片的大小
img = cv2.resize(img, (300, 300))
height, width, channels = img.shape
print(f"调整后:高度:{height},宽度:{width},通道数:{channels}")
#保存图片
cv2.imwrite("save_image/car.png", img)

图像绘制

绘制圆形

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

参数:

  • img:要绘制圆形的图像。

  • center:圆心的坐标。

  • radius:圆的半径。

  • color:圆的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。

  • thickness:圆的边界线条的厚度,如果为负值或cv2.FILLED,表示填充整个圆。

img = cv2.imread('pic/test2.png')center = (150, 150)
radius = 100
color = (158, 56, 200)
thickness = 25
circle_img = cv2.circle(img, center, radius, color, thickness)
cv2.imshow("circle_img", circle_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制矩形

 cv2.rectangle(img, pt1, pt2, color[, thickness[, lineType[, shift]]])

参数:

  • img:要绘制矩形的图像。

  • pt1:矩形的一个顶点。

  • pt2:矩形对角线上的另一个顶点。

  • color:矩形的颜色,通常是一个表示BGR颜色的元组,例如(255, 0, 0)表示蓝色。

  • thickness:矩形边框的厚度,如果为负值或cv2.FILLED,表示填充整个矩形内部。

img = cv2.imread('pic/test.jpg')left_top = (100,100)
right_bottom = (300,400)
color = (151,48,12)
thickness=10
img_rectangle = cv2.rectangle(img,[100,200,300,400],color,thickness)
cv2.imshow("img_rectangle", img_rectangle)
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制直线

cv2.line(img, pt1, pt2, color, thickness lineType)

参数:

  • img: 输出图像,即要在这张图上绘制直线的图像。通常是一个 NumPy 数组。

  • pt1: 直线的一个端点,是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • pt2: 直线的另一个端点,也是一个包含两个元素(x, y)的元组,代表该点的坐标。

  • color: 直线的颜色,对于 BGR 图像,这应该是一个包含三个整数的元组,分别对应蓝色、绿色和红色的强度(例如 (255, 0, 0) 表示纯蓝色)。对于灰度图像,只需要一个整数值即可。

  • thickness: 可选参数,定义直线的宽度。默认值是 1。

返回值

  • img: 返回的是经过修改后的图像,实际上就是传入的图像本身,因为 cv2.line() 是直接在原图上操作的。

import cv2img = cv2.imread("images/car.png")# 定义直线的起点和终点
start_point = (50, 50)  # 起点坐标 (x1, y1)
end_point = (450, 450)  # 终点坐标 (x2, y2)# 定义颜色 (B, G, R) 和线条粗细
color = (255, 0, 0)  # 蓝色
thickness = 2  # 线条的宽度# 使用 cv2.line() 在图像上绘制直线
cv2.line(img, start_point, end_point, color, thickness)# 显示图像
cv2.imshow('Image with Line', img)# 等待按键,然后关闭窗口
cv2.waitKey(0)
cv2.destroyAllWindows()

绘制文本

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

用于在图像上添加文本。用于标注图像、显示信息或调试时。

参数:

  • img (numpy.ndarray): 输入图像,通常是一个二维或三维的 NumPy 数组。

  • text (str): 要添加的文本字符串。

  • org (tuple): 文本的起始位置,是一个二元组 (x, y),表示文本左下角的坐标。

  • fontFace

    (int): 字体类型,常见的字体类型包括:

    • cv2.FONT_HERSHEY_SIMPLEX: 正常大小的无衬线字体

    • cv2.FONT_HERSHEY_PLAIN: 小号的无衬线字体

    • cv2.FONT_HERSHEY_DUPLEX: 正常大小的无衬线字体,比 FONT_HERSHEY_SIMPLEX 更粗

    • cv2.FONT_HERSHEY_COMPLEX: 正常大小的有衬线字体

    • cv2.FONT_HERSHEY_TRIPLEX: 正常大小的有衬线字体,比 FONT_HERSHEY_COMPLEX 更粗

    • cv2.FONT_HERSHEY_SCRIPT_SIMPLEX: 手写风格的字体

    • cv2.FONT_HERSHEY_SCRIPT_COMPLEX: 手写风格的字体,比 FONT_HERSHEY_SCRIPT_SIMPLEX 更粗

    • cv2.FONT_ITALIC: 斜体修饰符,可以与其他字体类型组合使用

  • fontScale (float): 字体大小的比例因子。

  • color (tuple): 文本颜色,是一个三元组 (B, G, R),表示蓝色、绿色和红色的值。

  • thickness (int, 可选): 文本线条的厚度,默认值为 1。

  • lineType

    (int, 可选): 线条类型,常见的线条类型包括:

    • cv2.LINE_4: 4 连通线

    • cv2.LINE_8: 8 连通线

    • cv2.LINE_AA: 抗锯齿线(默认值)

返回值

  • img (numpy.ndarray): 添加文本后的图像。

import cv2
import numpy as npimage = cv2.imread("images/car.png")# 定义文本内容和位置
text = "hello world!"
# 文本的左下角位置
position = (50, 200)
# 设置字体类型
font = cv2.FONT_HERSHEY_SIMPLEX
#字体大小
font_scale = 1
#字体颜色
font_color = (0, 255, 0)  
#字体线条的粗细
line_type = 2# 在图像上绘制文本
cv2.putText(image, text, position, font, font_scale, font_color, line_type)
# 显示图像
cv2.imshow(' Text', image)
cv2.waitKey(0)
cv2.destroyAllWindows()# 保存图像(可选)
cv2.imwrite('output_image.png', image)

中文乱码

(1)安装库:

pip install opencv-python pillow

(2)下载一个中文字体文件,常见的中文字体文件有 simhei.ttfsimsun.ttc 等。你可以从系统中找到这些字体文件,或者从互联网下载。

(3)定义 put_text 函数

示例:

def put_text(image, text, position, font_path, font_size, color):# 将Opencv图像转换为PIL图像pil_image = Image.fromarray(cv2.cvtColor(image, cv2.COLOR_BGR2RGB))# 创建一个在给定图像绘图的对象draw = ImageDraw.Draw(pil_image)# 加载字体font = ImageFont.truetype(font_path, font_size)# 在图像上绘制文字draw.text(position, text, fill=color, font=font)# 将PIL图像转回Opencv图像image_with_text = cv2.cvtColor(np.array(pil_image), cv2.COLOR_RGB2BGR)return image_with_textdef show(even, x, y, flag, param):global img2global numif even == cv2.EVENT_LBUTTONDOWN:num += 1text1 = f'老铁们,上火箭,火箭数:{num}'img2 = put_text(img, text1, (10, 10), 'simhei.ttf',20, (225, 241, 14))img = cv2.imread('pic/test.jpg')
img2 =img
# 火箭数
num = 0win_name = 'IMG'
cv2.namedWindow(win_name)
cv2.setMouseCallback(win_name, show)
while True:cv2.imshow(win_name, img2 )if cv2.waitKey(1) == 27:break
cv2.destroyAllWindows()

控制鼠标

cv2.setMouseCallback()

允许用户定义一个回调函数,当鼠标事件发生时(如点击、释放、移动等),该回调函数会被调用。

def act(even, x, y, flag, param):global condif even == cv2.EVENT_LBUTTONDOWN:print("鼠标左键按下")cond = Trueelif even == cv2.EVENT_LBUTTONUP:print("鼠标左键释放")cond = Falseelif even == cv2.EVENT_MOUSEMOVE:print("鼠标移动")if cond:cv2.circle(img, (x, y), 5, (150, 125, 205), -1)else:print("无法识别")img = cv2.imread('pic/test.jpg')win_name = 'IMG'
cv2.namedWindow(win_name, cv2.WINDOW_NORMAL)
cv2.resizeWindow(win_name, (500, 400))
# 活动信号
cond = False
cv2.setMouseCallback(win_name, act)while True:cv2.imshow(win_name, img)if cv2.waitKey(10) == 27:cv2.imwrite('save_img.jpg', img)break
cv2.destroyAllWindows()

视频处理

cv2.VideoCapture()

是 OpenCV 库中的一个类,用于从摄像头或视频文件中捕获视频帧。这个类提供了多种方法来控制视频捕获的过程,包括打开视频文件、读取视频帧、获取视频属性等。

常用方法

(1)read()

用于从视频源中读取下一帧。它返回一个布尔值和图像帧。布尔值表示是否成功读取了帧,图像帧是一个 NumPy 数组。

ret, frame = cap.read()
if not ret:print("Failed to grab frame")break

(2)release()

用于释放视频捕获资源。在完成视频处理后,必须调用此方法来释放摄像头或视频文件。

cap.release()

(3)isOpened()

用于检查视频捕获对象是否已经成功打开。

if not cap.isOpened():print("Error opening video stream or file")

(4)get()set()

get()set() 方法用于获取和设置视频捕获属性。常用的属性包括帧宽、帧高、帧率等。

# 获取帧宽
width = cap.get(cv2.CAP_PROP_FRAME_WIDTH)# 获取帧高
height = cap.get(cv2.CAP_PROP_FRAME_HEIGHT)# 获取帧率
fps = cap.get(cv2.CAP_PROP_FPS)# 设置帧宽
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 640)# 设置帧高
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 480)

 示例:

import cv2# 打开视频文件或摄像头
# 使用 0 打开默认摄像头,或者替换为视频文件路径,例如 'video.mp4'
video_capture = cv2.VideoCapture('video/1.mp4')  # 0 表示使用摄像头
if not video_capture.isOpened():print("视频没有打开")exit()
# 获取视频的帧率
fps = video_capture.get(cv2.CAP_PROP_FPS)
delay = int(1000 / fps)  # 计算帧间延迟
while True:# 逐帧读取视频ret, frame = video_capture.read()# 显示当前帧cv2.imshow('Video', frame)# 按下 'q' 键退出if cv2.waitKey(delay) & 0xFF == ord('q'):break
# 释放视频捕获对象和关闭所有窗口
video_capture.release()
cv2.destroyAllWindows()

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

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

相关文章

Rust数据NoSQL 数据库的使用

第三节:NoSQL 数据库的使用 在现代应用中,NoSQL 数据库因其灵活性和高效性,广泛应用于处理海量数据、动态结构以及高并发请求的场景中。本节我们将详细探讨如何在 Rust 中使用 MongoDB,并深入讨论数据架构设计、查询优化、数据一…

golang gin ShouldBind的介绍和使用

在 Go 语言的 Gin 框架中,ShouldBind 是用于将请求中的数据绑定到结构体的一个方法。它简化了从请求中提取参数的过程,支持多种数据格式(如 JSON、表单、查询参数等)。以下是 ShouldBind 的介绍和使用示例。 1. 基本概念 Should…

GameFramework教程☀️福利(五):关于该框架的一些意义

文章目录 📢 不同模式的意义本章探讨GF这样编写的意义和使用场景。 📢 不同模式的意义 最近在做一个app,现在在调研阶段。 代码上后期可能用华佗进行C#热更新。 在调研华佗打包完的热更代码如何和UI AB结合起来时,看到了: "> 从这一点可以延伸理解出,当我们使…

Kafka日志记录

测试如下&#xff1a; INFO:kafka.conn:<BrokerConnection node_idbootstrap-0 host110.40.130.231:9092 <connecting> [IPv4 (110.40.130.231, 9092)]>: connecting to 110.40.130.231:9092 [(110.40.130.231, 9092) IPv4] INFO:kafka.conn:Probing node bootstr…

【漏洞复现】某平台-QRcodeBuildAction-LoginSSO-delay-mssql-sql注入漏洞

《Java代码审计》http://mp.weixin.qq.com/s?__bizMzkwNjY1Mzc0Nw&mid2247484219&idx1&sn73564e316a4c9794019f15dd6b3ba9f6&chksmc0e47a67f793f371e9f6a4fbc06e7929cb1480b7320fae34c32563307df3a28aca49d1a4addd&scene21#wechat_redirect 《Web安全》h…

切换淘宝镜像

查看当前镜像 npm config get registry切换npm镜像 npm config set registryhttps://registry.npmjs.org/切换淘宝镜像 npm config set registryhttps://registry.npmmirror.com

Armv8的安全启动

目录 1. Trust Firmware 2. TF-A启动流程 3. TF-M启动流程 3.1 BL1 3.2 BL2 4.小结 在之前汽车信息安全 -- 再谈车规MCU的安全启动文章里&#xff0c;我们详细描述了TC3xx 、RH850、NXPS32K3的安全启动流程&#xff0c;而在车控类ECU中&#xff0c;我们也基本按照这个流程…

vue+django+neo4j航班智能问答知识图谱可视化系统

&#x1f51e; 友友们&#xff0c;有需要找我&#xff0c;懂的都懂 &#x1fa75; 基于NLP技术知识图谱的航班知识智能问答 &#x1fa75; 技术架构&#xff1a;vue django mysql neo4j &#x1fa75; 数据&#xff1a;航班数据7万多条 &#x1fa75; vue知识图谱的模糊查询…

DICOM标准:核医学图像模块属性——核医学(Nuclear Medicine, NM)DICOM标准详解

目录 引言 1. NM 序列模块&#xff08;NM Sequence Module&#xff09; 1.1 NM序列模块属性 2. NM 设备模块&#xff08;NM Equipment Module&#xff09; 2.1 NM设备模块属性 3. NM 图像模块&#xff08;NM Image Module&#xff09; 3.1 NM图像模块属性 3.2 帧增量指针…

ViT面试知识点

文章目录 VITCLIPBlipSAMFast TransformerYOLO系列问题 BatchNorm是对一个batch-size样本内的每个特征做归一化&#xff0c;LayerNorm是对每个样本的所有特征做归一化。 Layer Normalization&#xff08;层归一化&#xff0c;简称LayerNorm&#xff09;是一种在深度学习中常用…

Linux云计算个人学习总结(一)

windows计算机基础 一、概述 1&#xff0e;计算机基本原则&#xff1a;计算机是执行输入、运算、输出的原则。软件是指命令和数据的结合&#xff0c;计算机中所有的内容皆为数字。 2.计算机的类型 计算器 手机 cps等都属于计算机。 3.计算机的发展 第一代计算机电子管时代&…

Linux中的apt update和apt upgrade区别

在Linux操作系统中&#xff0c;包管理是维护系统和软件更新的关键任务。apt&#xff08;高级包装工具&#xff09;是Debian及其衍生系统&#xff08;如Ubuntu&#xff09;中广泛使用的包管理器。本文将详细解释apt update和apt upgrade这两个常用命令的区别以及它们的实战案例。…

WPF使用Prism框架首页界面

1. 首先确保已经下载了NuGet包MaterialDesignThemes 2.我们通过包的项目URL可以跳转到Github上查看源码 3.找到首页所在的代码位置 4.将代码复制下来&#xff0c;删除掉自己不需要的东西&#xff0c;最终如下 <materialDesign:DialogHostDialogTheme"Inherit"Ide…

CTFshow之信息收集第1关到10关。详细讲解

得而不惜就该死&#xff01; --章总 开始新的篇章&#xff01; 零、目录 一、实验准备 1、ctf网站&#xff1a;ctf.show 2、工具&#xff1a;chrome浏览器、hackbar插件 3、burpsuite抓包工具 二、实验技巧 &#xff08;一&#xff09;F12摸奖 源码泄露 &#xff08;二…

C 语言标准库 - <assert.h>

C语言assert()函数: 断言一个表达式是否正确 函数名: assert 头文件&#xff1a;<assert.h> 函数原型: void assert( int expression ); 功能&#xff1a; 断言一个表达式是否正确 参数&#xff1a;expression如果其值为假&#xff08;即为0&#xff09;&#xff0…

Navicat 17 功能简介 | 转储SQL文件

Navicat 17 功能简介 | 转储SQL文件 随着 17 版本的发布&#xff0c;Navicat 也带来了众多的新特性&#xff0c;包括兼容更多数据库、全新的模型设计、可视化智能 BI、智能数据分析、可视化查询解释、高质量数据字典、增强用户体验、扩展MongoDB 功能、轻松固定查询结果、便捷U…

pdf文件预览和导出

抢先观看&#xff1a; window.URL.createObjectURL()&#xff1a; 用于根据传入的 Blob 对象或 File 对象生成一个临时的、可访问的 URL,仅在浏览器会话中有效&#xff0c;并且不会上传到服务器。 const url window.URL.createObjectURL(blob);Blob 对象&#xff1a; 是 …

欠定方程有多个真正解,超定方程可能无解所以有最小二乘解

Ax b x A\b ,但不是b/A,会报错矩阵维度不对应两个未知数&#xff0c;三个方程也可以是最小二乘解&#xff0c;因为无解满足三个方程&#xff0c;比如下面 A [0, 1; 1, 1;3,6]; % 一个接近奇异的矩阵 b [1; 2;3]; x A\b; % 求解线性方程组 % warning(off, MATLAB:…

大数据MapReduce最全面试题及参考答案

什么是 MapReduce?简述其核心概念和主要作用。 MapReduce 是一种用于大规模数据集处理的分布式计算模型和编程框架。它由 Google 提出,旨在能够在大量普通计算机组成的集群上对海量数据进行并行处理。 其核心概念主要包括以下几个方面:首先是数据划分,将大规模的数据集分割…

【折腾一上午】Java POI 导出 Excel 自适应列宽行高

主要方法&#xff1a; 调用 sheet.autoSizeColumn(f) // f是需要自适应的列的序号注&#xff1a; 1. 在设置自适应之前需要调用以下方法&#xff0c;否则会报跟踪列错误。 sheet.trackAllColumnsForAutoSizing() 2. 当你去调用上个方法的时候发现&#xff0c;sheet并没有…