计算机视觉——opencv快速入门(二) 图像的基本操作

前言

上一篇文章中我们介绍了如何配置opencv,而在这篇文章我们主要介绍的是如何使用opencv来是实现一些常见的图像操作。

图像的读取,显示与存储

读取图像文件

在opencv中我们利用imread函数来读取图像文件,函数语法如下:

image=cv2.imread(path,flag)

参数说明:

  • image:返回来的所读取的对象,如果读取失败,返回None.
  • path:图像路径
  • flag:可选参数,又可叫图像旗标,用来说明图像读取的格式,省略则按照默认图像格式来读取。

下面我们来看一个简单的示例:

import cv2cv2.namedWindow("image", cv2.WINDOW_NORMAL)
img = cv2.imread(r'C:\\Users\\fengxu\Desktop\\Screenshots\\1b8fc10d60dbe62d15237451f13408a1.jpg')
cv2.resizeWindow("image", 600,400)
cv2.imshow("image", img)# 等待按键后关闭窗口,否则imshow的窗口会立即消失
cv2.waitKey(0)
cv2.destroyAllWindows()

这就是一个非常简单的加载图像的代码了。

图像的显示与图像窗口的关闭

基于opencv实现图像的显示

在opencv中我们可以基于cv.imshow()函数将读取的图像对象显示在opencv窗口上,函数定义如下:

cv2.imshow(window_name,image)

参数说明:

  • window_name:要显示窗口的标题
  • image:要显示的图像对象

示例代码:

import cv2# 创建一个可调整大小的窗口
cv2.namedWindow("image", cv2.WINDOW_NORMAL)# 读取图像文件
img = cv2.imread(r'./source/a.png')# 检查图像是否成功读取
if img is None:print("无法读取图像文件,请检查路径是否正确。")
else:# 显示图像cv2.imshow("image", img)cv2.waitKey(0)  # 等待按键输入,参数为0表示无限等待,直到按下任意键cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

运行结果:
在这里插入图片描述

如何关闭opencv窗口

当我们将图片显示在opencv窗口后,除了点击关闭按钮关闭,还可以使用下列函数:

cv2.destoryWindow(window_name);  # 删除指定窗口
cv2.destoryAllWindows();		# 删除所有窗口

控制按键事件

opencv可以通过cv2.waitkey()函数来等待按键事件,函数语法如下:

ret_key=cv2.waitkey(delay);

参数说明:

  • ret_key:如果没有按下键盘上的值,返回值是-1,否则是按键对应的ASCII值
  • delay:单位为毫秒

示例:

  • 5秒后关闭:
import cv2# 创建一个可调整大小的窗口
cv2.namedWindow("image", cv2.WINDOW_NORMAL)# 读取图像文件
img = cv2.imread(r'./source/a.png')# 检查图像是否成功读取
if img is None:print("无法读取图像文件,请检查路径是否正确。")
else:# 显示图像cv2.imshow("image", img)cv2.waitKey(10000)  # 等待10秒cv2.destroyAllWindows()  # 关闭所有OpenCV窗口
  • 按q键退出
import cv2# 创建一个可调整大小的窗口
cv2.namedWindow("image", cv2.WINDOW_NORMAL)# 读取图像文件
img = cv2.imread(r'./source/a.png')# 检查图像是否成功读取
if img is None:print("无法读取图像文件,请检查路径是否正确。")
else:# 显示图像cv2.imshow("image", img)ret_key=cv2.waitKey(0)  if ret_key == ord('q'):   # # 如果按下q键,则退出cv2.destroyAllWindows()  # 关闭所有OpenCV窗口

调整图像窗口的大小

我们在使用imshow函数创建窗口显示图像时,窗口的大小是固定,但是我们可以通过namedWindow()函数建立未来要显示图像的窗口。

cv2.namedWindow(window_name,flag)
  • flag:窗口旗标参数,类型有:

    • cv2.WINDOW_NORMAL:用户可以自行调整窗口
    • cv2.WINDOW_AUTOSIZE:自动调整大小
    • cv2.WINDOW_OPENGL:支持以OPENGL的方式打开窗口

图像的存储

在opencv中我们可以使用imwrite函数存储图像,函数声明如下:

ret=cv2.imwrite(path,image)

成功返回True,失败返回False

示例代码:

import cv2# 创建一个可调整大小的窗口
cv2.namedWindow("image", cv2.WINDOW_NORMAL)# 读取图像文件
img = cv2.imread(r'./source/a.png')# 检查图像是否成功读取
if img is None:print("无法读取图像文件,请检查路径是否正确。")ret=cv2.imwrite("./source/output.png", img)
if ret:print("图像保存成功。")
else:print("图像保存失败。")cv2.waitKey(0)

在这里插入图片描述
运行后我们发现source文件夹下出现了我想要保存的结果

课后练习

选择一张图片,分别以灰色与彩色两种方式读取,同时以_color后缀存储彩色图片,_gray存储灰色照片

# 彩色
import cv2# 创建一个可调整大小的窗口
cv2.namedWindow("image1", cv2.WINDOW_NORMAL)# 读取图像文件
img1 = cv2.imread(r'./source/a.png')
cv2.imshow("image1", img1)
cv2.waitKey(0)# 检查图像是否成功读取
if img1 is None:print("无法读取图像文件,请检查路径是否正确。")ret=cv2.imwrite("./source/a_color.png", img1)
if ret:print("图像保存成功。")
else:print("图像保存失败。")
# 灰色
import cv2# 创建一个可调整大小的窗口
cv2.namedWindow("image2", cv2.WINDOW_NORMAL)# 读取图像文件
img2 = cv2.imread(r'./source/a.png', cv2.IMREAD_GRAYSCALE)
cv2.imshow("image2", img2)
cv2.waitKey(0)# 检查图像是否成功读取
if img2 is None:print("无法读取图像文件,请检查路径是否正确。")ret=cv2.imwrite("./source/a_gray.png", img2)
if ret:print("图像保存成功。")
else:print("图像保存失败。")

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

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

相关文章

信息安全新挑战:云计算环境下的等保测评实践探索

随着信息技术的飞速发展,云计算技术因其灵活性、可伸缩性和经济性,正逐渐成为企业和组织构建信息系统的首选。然而,云计算环境的复杂性和动态性也为信息安全带来了新的挑战,尤其是在信息安全等级保护(以下简称“等保”…

FairMOT安装

安装环境:CUDA:11.3 GCC version 9.5.0 1、下载FairMOT FairMOT下载地址:https://github.com/ifzhang/FairMOT 2、下载DCNv2 DCNv2下载地址:https://github.com/lbin/DCNv2/tree/pytorch_1.9 这里下载1.9对应的版本&#xff0…

NLP+LLM从入门到精通系列

NLPLLM从入门到精通系列 前言:笔者从事于NLPLLM的对话智能机器人的相关行业,现在的大模型的技术日新月异,传统的NLP业务显然是要被淘汰的,那么这也是我着笔写这一系列文章的初衷。本系列将由浅到深,结合实际代码案例&…

深度调峰汽轮机相关技术资料 厂家培训用

网盘 https://pan.baidu.com/s/16KfuoVko5xCUk3bDOfTlvQ?pwdezjb 亚临界循环流化床机组深度调峰下的输出功率预测方法.pdf 基于时间序列分析的燃煤电厂深度调峰预测方法及装置】.pdf 基于汽轮机低压缸排汽压力调节的深度调峰方法.pdf 基于深度调峰工况下阀门阀杆的振动预测方…

01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型

01–SpringAI接入大模型,chatgpt,Java接入人工智能大模型 文章目录 01--SpringAI接入大模型,chatgpt,Java接入人工智能大模型一、准备工作?①:环境准备 二、创建一个springAI项目①:创建一个根项目②:创建一个SpringAI模块01.解决…

国际水务交流 | 一带一路沿线水环境考察暨中马水务合作论坛

从具体区域来看,“一带一路"沿线国家环境问题复杂而多样,各国生态环境特征差异明显 东南亚尤其是东盟地区受热带季风影响,降水较多,洪水高发,也是世界生物最为多样最为丰富的地区之一,这一区域面临森…

项目实战--Spring Boot与PageHelper的集成及线程污染解决

一、PageHelper使用背景 公司要做个简单管理系统,要我搭建Spring BootMyBatisPageHelperRedis的项目框架然后交i给实习生来开发。这个其实很简单,但是遇到搭建和使用过程中PageHelper有好多小坑,就记录一下,避免再踩。 版本选择&…

std::__cxx11::basic_string 和std::basic_string的不同

问题描述: 源文件中定义的函数是 : void setAccessKeyId(std::string) 但是使用centos中 g4.8.5 编译能正常编译过,debian系统中使用 centos 10.2版本编译不过 提示找不到定义:setAccessKeyId(std::__cx…

c++:#include 某文件.h底层如何寻找其.cpp实现

在C中,当你编写了一个头文件(如MyLibrary.h)和对应的实现文件(如MyLibrary.cpp)时,其他源文件(如main.cpp)只需要包含头文件(#include "MyLibrary.h"&#xff…

C语言_操作符

目录 算术操作符 移位操作符 位操作符 赋值操作符 单目操作符 关系操作符 逻辑操作符 条件操作符 逗号表达式 下标引用,函数调用,结构成员 表达式求值 隐式类型转换 算术转换 操作符的属性 练习题 代码仓库 算术操作符 加()&#x…

部署过docker后,防火墙firewall与iptables的基本指令

一、iptables【无需stop docker服务】 如果服务器中部署了docker,优先选用iptables 1. 记录关闭docker中运行的mongoDB的27017端口: 由于docker与iptables存在配置规则,因此要修改docker相关端口的可访问性时需要使用下面的语句&#xff1a…

自定义通信协议实例

自定义通信协议是指通信双方为了实现特定功能或满足特定需求,在通信过程中自行约定的一种通信规则。这种协议通常包括数据的格式、传输方式、校验方法等内容,以确保通信双方能够正确地理解和交换信息。以下是关于自定义通信协议的一些详细解释和示例&…

git上传时出现了main master的问题解决

git 上传时 出现了main master 这个问题通常出现在Git版本控制系统中,当你尝试上传代码到远程仓库时,可能会看到一个提示,关于"main"和"master"的。 解释: Git 2020年发布了新的默认分支名称"main&qu…

智能插座搭配BIOS唤醒功能实现远程定时开关机

智能插座 智能插座凭借其强大的联网能力,不仅能够实现远程操控开关电源,部分高端型号更是集成了电量统计与自动化操作功能,为用户带来了前所未有的便捷体验。以下是我对几款体验过的智能插座的简要评价,因版本差异可能有所不同。…

工业交换机端口统计功能

工业交换机端口统计功能不仅是一项技术手段,更是一双透视企业网络健康状态的慧眼。通过这一功能,企业能够实时捕捉到网络中每一个端口的流量情况,这不仅仅是数据的积累,更是对网络脉搏的精准把握。当网络的每一个脉动都被记录在案…

RecyclerView实现手势滑动选中相册图片

要使用RecyclerView实现手势滑动选中相册图片的功能,你需要以下几个步骤: 创建含有图片资源的ViewHolder,继承自RecyclerView.ViewHolder,用于显示相册中的每个图片。 创建一个Adapter,继承自RecyclerView.Adapter&…

建智慧医院核心:智能导航系统的功能全析与实现效益

在数字化转型的浪潮中,智慧医院的建设是医疗行业数字化转型的关键步骤。随着医院规模的不断扩大和医疗设施的日益复杂,传统的静态不连续的导航方式已无法满足患者的需求。院内智能导航系统,作为医疗数字化转型的关键组成部分,正逐…

怎么做IDS,入侵检测

要在Linux系统上实现入侵检测系统(IDS),您可以选择许多开源或商业工具。以下是使用开源工具Snort和Suricata来实施入侵检测系统的详细步骤: 选择IDS工具 1. Snort Snort是一款流行的开源网络入侵检测和防御系统(IDS…

禅心驭智,展望软件未来新纪元

禅心驭智,展望软件未来新纪元 阿弥陀佛,善哉善哉。于这瞬息万变的数字时代,生成式人工智能(AIGC)如同璀璨星辰,引领着软件开发领域步入一个前所未有的新纪元。贫僧观此变革,心中满是感慨与期待…

freemarker取值使用

格式化 格式化为字符串 ${entity.name!} 格式化为数字 ${entity.id?c} 格式化为时间 ${detail.date?string("yyyy-MM-dd HH:mm:ss")} 格式化为金额 判断非空 <#if detail.aEntity?? && detail.aEntity.has?? && detail.aEntity.has1>-- …