OpenCV入门(C++/Python)- 使用OpenCV读取、显示和写入图像(一)

news2024/9/28 11:24:15

使用OpenCV读取、显示和写入图像

  • 1.imread()读取图像
    • imread()函数
  • 2.imshow()在窗口中显示图像
    • waitKey()
    • destoryAllWindows()
  • 3.imwrite()将图像写入文件目录

读取、显示和写入图像是图像处理和计算机视觉的基础。即使裁剪、调整大小、旋转或应用不同的过滤器来处理图像,您也需要首先读取图像。因此,掌握这些基本操作很重要。

1.imread()读取图像

Python

# import the cv2 library
import cv2
 
# The function cv2.imread() is used to read an image.
img_grayscale = cv2.imread('test.jpg',0)
 
# The function cv2.imshow() is used to display an image in a window.
cv2.imshow('graycsale image',img_grayscale)
 
# waitKey() waits for a key press to close the window and 0 specifies indefinite loop
cv2.waitKey(0)
 
# cv2.destroyAllWindows() simply destroys all the windows we created.
cv2.destroyAllWindows()
 
# The function cv2.imwrite() is used to write an image.
cv2.imwrite('grayscale.jpg',img_grayscale)

C++

//Include Libraries
#include<opencv2/opencv.hpp>
#include<iostream>
 
// Namespace nullifies the use of cv::function(); 
using namespace std;
using namespace cv;
 
// Read an image 
Mat img_grayscale = imread("test.jpg", 0);
 
// Display the image.
imshow("grayscale image", img_grayscale); 
 
// Wait for a keystroke.   
waitKey(0);  
 
// Destroys all the windows created                         
destroyAllWindows();
 
// Write the image in the same directory
imwrite("grayscale.jpg", img_grayscale);

imread()函数

imread(filename,flags)

  • 第一个参数是图像名称,它需要文件的完全限定路径名
  • 第二个参数是一个可选的标志,允许您指定图像的表示方式。OpenCV为该标志提供了几个选项,但最常见的选项包括
    1. cv2.IMREAD_UNCHANGED or -1
    2. cv2.IMREAD_GRAYSCALE or 0
    3. cv2.IMREAD_COLOR or 1

标志的默认值为1,它将在图像中读取为彩色图像。当您想以特定格式阅读图像时,只需指定适当的标志即可。

在这一点上,请注意,OpenCV以BGR格式读取彩色图像,而大多数其他计算机视觉库使用RGB通道格式顺序。因此,当将OpenCV与其他工具包一起使用时,当您从一个库切换到另一个库时,不要忘记交换蓝色和红色通道。

如下面的代码部分所示,我们将首先使用上述所有三个标志值在测试图像中阅读。
Python

# Read an image
img_color = cv2.imread('test.jpg',cv2.IMREAD_COLOR)
img_grayscale = cv2.imread('test.jpg',cv2.IMREAD_GRAYSCALE)
img_unchanged = cv2.imread('test.jpg',cv2.IMREAD_UNCHANGED)

C++

// Read an image 
Mat img_color = imread("test.jpg", IMREAD_COLOR);
Mat img_grayscale = imread("test.jpg", IMREAD_GRAYSCALE);
Mat img_unchanged = imread("test.jpg", IMREAD_UNCHANGED);

Or

Python

img_color = cv2.imread('test.jpg',1)
img_grayscale = cv2.imread('test.jpg',0)
img_unchanged = cv2.imread('test.jpg',-1)

C++

Mat img_color = imread("test.jpg", 1);
Mat img_grayscale = imread("test.jpg", 0);
Mat img_unchanged = imread("test.jpg", -1);

2.imshow()在窗口中显示图像

在OpenCV中,您可以使用imshow()函数显示图像。语法如下所示:

imshow(window_name,图像)

此函数还接受两个参数:

  • 第一个参数是将显示在窗口上的窗口名称。
  • 第二个参数是您想要显示的图像。

要同时显示多个图像,请为要显示的每个图像指定一个新的窗口名称。

imshow()函数旨在与waitKey()和destroyAllWindows() / destroyWindow()函数一起使用。

waitKey()

waitKey()函数是一个键盘绑定函数。
它需要一个参数,即显示窗口的时间(以毫秒为单位)。

如果用户在此时间段内按下任何键,程序将继续。
如果传递0,程序将无限期地等待按键。

您还可以将该功能设置为检测键盘上的Q键或ESC键等特定按键,从而更明确地告诉哪个键将触发哪种行为

destoryAllWindows()

函数destoryAllWindows()会破坏我们创建的所有窗口。如果需要销毁特定窗口,请给出确切的窗口名称作为参数。使用deargetAllWindows()还可以从系统的主内存中清除窗口或图像。下面的代码示例显示了如何使用imshow()函数来显示您读取的图像。
Python

#Displays image inside a window
cv2.imshow('color image',img_color)  
cv2.imshow('grayscale image',img_grayscale)
cv2.imshow('unchanged image',img_unchanged)
 
# Waits for a keystroke
cv2.waitKey(0)  
 
# Destroys all the windows created
cv2.destroyAllwindows() 

C++

// Create a window.
namedWindow( "color image", WINDOW_AUTOSIZE );
namedWindow( "grayscale image", WINDOW_AUTOSIZE );
namedWindow( "unchanged image", WINDOW_AUTOSIZE );
 
// Show the image inside it.
imshow( "color image", img_color ); 
imshow( "grayscale image", img_grayscale );
imshow( "unchanged image", img_unchanged ); 
 
// Wait for a keystroke.   
waitKey(0);  
 
// Destroys all the windows created                         
destroyAllWindows();

在这里插入图片描述

3.imwrite()将图像写入文件目录

最后,让我们讨论如何使用imwrite()函数将图像写入/保存到文件目录中。查看其语法:

imwrite(文件名,图像)

  • 第一个参数是文件名,其中必须包括文件扩展名(例如.png、.jpg等)。OpenCV使用此文件扩展名来指定文件的格式。
  • 第二个参数是您想要保存的图像。如果图像保存成功,该函数返回True。

请查看下面的代码。看看将图像写入磁盘有多简单。只需指定具有适当扩展名的文件名(前面有任何所需的路径)。包括包含图像数据的变量名称,您就完成了。
Python

cv2.imwrite('grayscale.jpg',img_grayscale)

C++

imwrite("grayscale.jpg", img_grayscale);

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

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

相关文章

C. Carrying Conundrum(思维 + 奇偶数位)

Problem - 1567C - Codeforces 爱丽丝刚刚学会了加法。但是&#xff0c;她还没有完全学会 "携带 "的概念--她不是携带到下一列&#xff0c;而是携带到左边两列的列。 例如&#xff0c;评估20392976这个和的常规方法是如图所示。 然而&#xff0c;爱丽丝是按照图中的…

【在SpringBoot项目中使用Validation框架检查数据格式-常用的检查注解】

常用的检查注解 使用Validation框架检查数据格式时&#xff0c;常用的检查注解有&#xff1a; NotNull&#xff1a;不允许为null值 可用于任何类型的参数NotEmpty&#xff1a;不允许为空字符串&#xff0c;即长度为0的字符串 仅用于检查字符串类型的参数NotBlank&#xff1a;不…

【D3.js】1.17-给 D3 元素添加标签

title: 【D3.js】1.17-给 D3 元素添加标签 date: 2022-12-02 14:35 tags: [JavaScript,CSS,HTML,D3.js,SVG] 为了让图更易懂&#xff0c;我们给每一个rect添加上标签。 一、学习目标 如何添加text元素&#xff1f; .append(“text”) 如何设置text元素的值&#xff1f; .attr(…

[附源码]计算机毕业设计在线图书销售系统Springboot程序

项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM mybatis Maven Vue 等等组成&#xff0c;B/S模式 M…

IPWorks macOS Edition通信组件

IPWorks macOS Edition通信组件 用于Internet通信的一整套组件。 IPWorks是一个用于Internet开发的综合框架&#xff0c;它消除了Internet开发的复杂性&#xff0c;提供了可编程的、支持SSL的组件&#xff0c;以便于执行诸如确保安全、发送电子邮件、传输文件、管理网络、浏览W…

物联网 MQTT 协议

MQTT官网&#xff1a;MQTT - The Standard for IoT Messaging MQTT中文网&#xff08;全是广告&#xff09;&#xff1a;首页 | MQTT中文网 物联网百科 物联网&#xff08;Internet of Things&#xff0c;简称IoT&#xff09;是指通过各种信息传感器、射频识别技术、全球定位…

在线编程教学技术解决方案,覆盖所有授课场景需求

在线编程教学是一种应用较为广泛的远程教学形式&#xff0c;例如&#xff1a;互动体验&#xff0c;音视频技术的普及&#xff0c;对线上教学的质量与学习效率带来了很大的提升。在线编程教学可以让教师对学生进行在线编程教学&#xff0c;以一对多小班教学为主。那么在线编程教…

线上项目源码安全性处理方案

场景&#xff1a; 最近项目提出要对线上代码进行安全性处理&#xff0c;防止客户直接通过反编译工具将代码反编译出来 方案&#xff1a; 第一种方案使用的是代码混淆 第二种方案使用的是代码加密 方案比较 方案一&#xff1a;采用的proguard-maven-plugin插件 方案二&#xf…

要花多少亿美元,HPE才能买下超融合鼻祖Nu­t­a­n­ix?

【全球存储观察 | 热点关注】据报道&#xff0c;慧与科技HPE在近几个月与超融合提供商Nutanix就收购进行了谈判。 在这之前的2017年2月&#xff0c;HPE以6.5亿美元收购了超融合全球老二SimpliVity&#xff0c;后来整合成了HPE重要的超融合产品线&#xff0c;并进一步丰富了整体…

Seal库官方示例(五):ckks_basics.cpp解析

这个代码计算的是πx30.4x1\pi \times x^30.4 \times x 1πx30.4x1。 代码解析 方案选择 首先照例是方案选择 EncryptionParameters parms(scheme_type::ckks);参数设置 CKKS方案中使用rescale方法来控制膨胀的密文规模和噪声&#xff0c;这个和modulus switching有点类似…

[激光原理与应用-28]:《激光原理与技术》-14- 激光产生技术 - 激光的主要参数与指标

目录 1、 激光器的门限电流与功率输出 2、激光器的调制增益 3、功率/能量密度 6、额定功耗 7、转换效率 8、光斑大小 9、线宽 10、激光器的谱线宽度。 11、激光器的相对强度噪声RIN。 12、激光器的线性范围。 13、带内平坦度 14、激光器的温度特性 15、激光器的交…

基于PHP+MySQL信息技术学习网站设计与实现

智多在线网络学习平台为学习各种技术查看资料的用户提供一个准确、最新的技术与相关文档&#xff0c;浏览目前流行教学的新闻&#xff0c;提出技术上遇到的难点及问题&#xff0c;帮助其他用户回答所提出的问题&#xff0c;上传想要分享的资源&#xff0c;下载要获取的相关技术…

Spirng MVC——获取参数详解

文章目录1. 什么是 Spirng MVC1.1 MVC 定义1.2 MVC 和 Spring MVC 的关系2. 创建Spring MVC 项目3. Spring MVC 学习目标3.1 实现用户和程序的映射方法1&#xff1a;RequestMapping("/xxx")方法2&#xff1a;使用 POSTMapping("/xxx")方法3&#xff1a;使用…

Kali生成windows木马程序

目录 一、生成windows执行木马程序 二、进入msfconsole进行监听目标上线 三、目标运行木马和后渗透 四、问题 Meterpreter session 2 closed. Reason: Died 一、生成windows执行木马程序 -p windows/x64/meterpreter/reverse_tcp //载入64位payload攻击载荷&#xff0c…

RabbitMQ-惰性队列

文章目录1 消息堆积问题2 惰性队列2.1 基于命令行设置lazy-queue2.2 基于Bean声明LazyQueue(推荐)2.3 基于RabbitListener声明LazyQueue3 总结3.1 消息堆积问题的解决方案&#xff1f;3.2 惰性队列的优点有哪些&#xff1f;3.3 惰性队列的缺点有哪些&#xff1f;1 消息堆积问题…

BSA-maltose 牛血清白蛋白修饰麦芽糖 BSA-麦芽糖

产品名称&#xff1a;牛血清白蛋白修饰麦芽糖 英文名称&#xff1a;BSA-maltose 用途&#xff1a;科研 状态&#xff1a;固体/粉末/溶液 产品规格&#xff1a;1g/5g/10g 保存&#xff1a;冷藏 储藏条件&#xff1a;-20℃ 储存时间&#xff1a;1年 牛血清中的简单蛋白&#xff…

JAVA数据类型与变量

JAVA初阶 背景了解 Java语言之父—>高斯林。现代计算机之父—>冯诺依曼。 Java当中的main方法。 .java ->编译javac xxx.java -> xxx.class[字节码文件&#xff1a;二进制文件]。java命令 运行java程序 public class HelloWorld {//m main psvm 出现之后回车即可…

Qt第二十七章:QWidget、QMainWindow自定义标题栏并自由移动缩放

前提&#xff1a;UI必須采用自适应布局。 自定义组件【直接CV】custom_components.py from PySide6 import QtGui, QtWidgets, QtCore from PySide6.QtCore import Qt, QSize, QRect from PySide6.QtWidgets import QPushButton, QLabel, QWidgetclass QCustomTitleBar:def _…

基于SpringBoot vue的茶叶商城平台源码和论文含支付宝沙箱支付

此项目是前后端分离的 后台项目:shop 前端项目:Vue-shop 后端项目启动步骤: 1.先把sql导入数据库 2.把后台项目导入编辑器 3.修改数据库配置 4.启动项目 前端项目启动步骤: 1.打开Vue-shop目录,在这个文件夹里面加入cmd目录窗口 2.运行启动vue项目目录(需先安装nodejs软件)…

四、伊森商城 前端基础-Vue 双向绑定事件处理安装插件 p22

1、双向绑定 双向绑定&#xff1a; 效果&#xff1a;我们修改表单项&#xff0c;num 会发生变化。我们修改 num&#xff0c;表单项也会发生变化。为了实 时观察到这个变化&#xff0c;我们将 num 输出到页面。 我们不需要关注他们为什么会建立起来关联&#xff0c;以及页面如何…