当前位置: 首页 > article >正文

Opencv之计算机视觉一

一、环境准备

使用opencv库来实现简单的计算机视觉。

需要安装两个库:opencv-python和opencv-contrib-python,版本可以自行选择,注意不同版本的opencv中的某些函数名和用法可能不同

pip install opencv-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simple

pip install opencv-contrib-python==3.4.18.65 -i https://pypi.tuna.tsinghua.edu.cn/simplee


二、读取图片文件

1、使用pillow这个库中的功能

from PIL import Image
aa=Image.open('timg98.jpg')
print(aa)

2、使用opencv中特有的读取文件的方法 

import cv2  # 读取的格式是BGR  numpy
import matplotlib.pyplot as plt  # matplotlib读取的格式与opencv不同
import numpy as np# '''-------------------读取图片----------------------------'''
a = cv2.imread('timg98.jpg')#读取图片
# print(a)   #  NumPy数组,其中存储了读取的图像文件的像素值。
cv2.imshow('tu',a)  #显示图片。显示图片的名称,显示的图片数据。将图片以窗口的形式显示,后边的参数第一个参数是窗口名,第二个参数是保存图片数据的变量b = cv2.waitKey(0)#这里的waitkey函数是设置将里面的数字为非零数,则是指经过多ms后图片窗口会关闭,#如果里面的数字为0,则是窗口永久不会关闭,按下任意键时才会关闭
# # 当里面的参数设置为0时,waitkey这个函数会返回按下按键的ASCII码的数值print(b) #显示ASCII的数值,可以对应ASCII的表来查找对应的数值cv2.destroyAllWindows() #摧毁这个窗口,减少内存的占用,上面的waitkey已经关闭了窗口,在这里可以不用写,但是在一些大的项目中,为了防止内存占用,往往需要添加。# # '''调试模型观察shape,dtype、size属性'''print("图像形状 (shape):", a.shape)   #高、宽、通道数
print("图像数据类型 (dtype):", a.dtype) #无符号 8 位整数,用于表示像素值的范围在 0 到 255 之间。
print("图像大小 (size):", a.size) #表示图像的大小,通常是一个整数,表示图像的总像素数,即图像的高度乘以宽度乘以通道数

3、读取图片的灰度图

c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE) ,其中cv2.IMREAD_GRAYSCALE是设置imread读取图片是设置图片为灰度图,如果后面设置为0,则显示彩色图片,不写效果也是彩色。

c=cv2.imread('../data/4-1.jpg',cv2.IMREAD_GRAYSCALE)     #读取图片
c=cv2.resize(c,(500,500))           #图片原尺寸过大,所以这里对图片的大小进行重新设置cv2.imshow("tupian",c)      #将图片以窗口的形式显示,后边的参数第一个参数是窗口名,第二个参数是图片的来源b=cv2.waitKey(0)    #这里的waitkey函数是设置将里面的数字为非零数,则是指经过多ms后图片窗口会关#闭,如果里面的数字为0,则是窗口永久不会关闭,按下任意键时才会关闭
# # 当里面的参数设置为0时,waitkey这个函数会返回按下按键的ASCII码的数值print(b)    #显示ASCII的数值,可以对应ASCII的表来查找对应的数值cv2.destroyAllWindows()     #摧毁这个窗口,减少内存的占用,上面的waitkey已经关闭了窗口,在这里可#以不用写,但是在一些大的项目中,为了防止内存占用,往往需要添加print("图像的形状:",c.shape)print("图像的数据类型:",c.dtype)print("图像的大小:",c.size)#图片的保存,后面的两个参数,第一个是图片保存的位置,第二个是图片储存的变量
cv2.imwrite('tupian_gray.jpg',b)

4、视频文件的读取

import cv2
# 打开视频文件
video_capture = cv2.VideoCapture('转场.mp4')  #  摄像头:0
# 检查视频是否成功打开
if not video_capture.isOpened():print("无法打开视频文件")exit()
# 循环读取视频帧
while True:# 逐帧读取视频ret, frame = video_capture.read()  #ret是布尔值,表示是否成功读取了帧,frame 是读取到的帧# 检查是否成功读取帧if not ret:break# 将图像从一种颜色空间转换为另一种颜色空间。frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)# 显示当前帧cv2.imshow('Video', frame)# 检查用户是否按下 'esc' 键,如果是则退出循环if cv2.waitKey(100) == 27:break
# 释放资源
video_capture.release()
cv2.destroyAllWindows()

5、区域切割

ROI:区域感兴趣(Region of Interest)的缩写。它指的是图像或视频中感兴趣的特定区域,需要进行分析或处理。
ROI可以由用户手动选择,也可以使用计算机视觉算法自动检测。

a = cv2.imread(r'./timg98.jpg')
b = a[100:300,100:300]  #直接对numpy数组进行切片
cv2.imshow('yuantu',a)
cv2.imshow('qiepian',b)
cv2.waitKey(100000)
cv2.destroyAllWindows()

6、提取RGB颜色通道 

import cv2
# 1. 读取图像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道
# g 包含绿色通道
# r 包含红色通道
cv2.imshow('result', a2)
# 4. 设置窗口显示时间,单位为毫秒(这里设置为100秒,可以根据需要调整)
cv2.waitKey(100000)
# 5. 关闭所有窗口
cv2.destroyAllWindows()

注意:我们这里是显示蓝色通道的图像,但是所显示的图片确实灰色的,那是因为只显示蓝色通道时,
实际上是将蓝色通道作为亮度值,而将绿色和红色通道设置为默认的最大值,也就是255。这会导致图像呈现为灰色。
想要展示只包含蓝色通道信息的彩色图像,可以将图像中的绿色通道和红色通道设为0,即移除绿色和红色,只保留蓝色。

7、图片的复制.copy()

import cv2
a = cv2.imread(r'./timg98.jpg')
# 复制原始图像以避免更改原始图像
a_new = a.copy()
a_new[:, :, 1] = 0  # 绿色通道设为0
a_new[:, :, 2] = 0  # 红色通道设为0
# 创建一个窗口来显示修改后的图像,并将其命名为'result'
cv2.imshow('result', a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()

 8、合并颜色通道

import cv2
# 1. 读取图像
a = cv2.imread(r'./timg98.jpg')
# 2. 提取颜色通道
a1 = a[:, :, 0]  # 蓝色通道(B通道)
a2 = a[:, :, 1]  # 绿色通道(G通道)
a3 = a[:, :, 2]  # 红色通道(R通道)
# 或者使用 cv2.split() 来分离颜色通道
b, g, r = cv2.split(a)
# b 包含蓝色通道  g 包含绿色通道  r 包含红色通道
# 使用cv2.merge()函数将三个通道重新合并成一个图像
img = cv2.merge((b, g, r))
# img = cv2.merge((a1,a2,a3)) 或者使用这行代码
cv2.imshow('result', img)
cv2.waitKey(100000)
cv2.destroyAllWindows()

9、图片修改

1、图片打码 

# 图片打码
import numpy as npa = cv2.imread(r'./timg98.jpg')
a[100:200,200:300] = np.random.randint(0,256,(100,100,3))#矩阵赋值必须是相同大小
cv2.imshow('masaike',a)
cv2.waitKey(1000000)
cv2.destroyAllWindows()

 2、图片组合

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b[200:350,200:350] = a[50:200,100:250]#注意:矩阵的大小必须要统一。
cv2.imshow('b',b)
cv2.imshow('a',a)
cv2.waitKey(100000)
cv2.destroyAllWindows()

3、图片的放缩

cv2.resize
# 用于调整图像的大小。它有以下几个参数:
# src:要调整大小的输入图像,可以是numpy数组、PIL图像或其他类型。
# dsize:输出图像的大小,可以是一个元组,例如(宽,高),或者使用整数标量来缩放原始图像。如果dsize为None,则根据scalefx和scalefy缩放原始图像。
# fx:沿x轴的缩放系数。
# fy:沿y轴的缩放系数。

a = cv2.imread('timg98.jpg')#方法一
a_new = cv2.resize(a,(200,600))   # 宽、高#方法二
# a_new = cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
# print(a.shape)  # 高、宽、通道数cv2.imshow('a',a)
cv2.imshow('a_new',a_new)
cv2.waitKey(100000)
cv2.destroyAllWindows()

10、图像的运算

1、图像的加法一


当某位置像素相加得到的数值小于255时,该位置数值为两图像的像素值相加之和,
当某位置像素相加得到的数值大于255时,该位置数值将截断结果并将其减去256,例如相加之后时260,则世纪时260-256=4。

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
c = a+10    #图片,
cv2.imshow('yuan',a)
cv2.imshow('a+10',c)
cv2.waitKey(100000)c = a[50:450,50:400]+b[50:450,50:400]
cv2.imshow('a+b',c)
cv2.waitKey(100000)

2、图像的加法二


​​​​​​​对于cv2的add()运算,当对图像a,图像b进行加法求和时,遵循以下规律
当某位置像素相加得到的数值小于255时,该位置数值为两图像的像素值相加之和
当某位置像素相加得到的数值大于255时,该位置数值为255

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
c = cv2.add(a,b)   #也可以使用使用
cv2.imshow('a add b',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()

3、图像的加权运算

就是计算在两幅图像的像素值之和时,将每幅图像的权值考虑进来,可以用公式表示为dst=src1×α+src×β+γ

a = cv2.imread('timg98.jpg')
b = cv2.imread('zl.png')
b = cv2.resize(b,(400,400))
a = cv2.resize(a,(400,400))
#
c =cv2.addWeighted(a,0.2,b,0.8,0)   # 10:图像的亮度值(常数),将添加到加权和上
cv2.imshow('addWeighted',c)
cv2.waitKey(100000)
cv2.destroyAllWindows()

相关文章:

Opencv之计算机视觉一

一、环境准备 使用opencv库来实现简单的计算机视觉。 需要安装两个库:opencv-python和opencv-contrib-python,版本可以自行选择,注意不同版本的opencv中的某些函数名和用法可能不同 pip install opencv-python3.4.18.65 -i https://pypi.t…...

批量测试IP和域名联通性2

在前面批量测试IP和域名联通性-CSDN博客的基础上,由于IP和域名多样性,比如带端口号的192.168.1.17:17,实际上应该ping 192.168.1.17。如果封禁http://www.abc.com/a.exe,实际可ping www.abc.com。所以又完善了代码。 echo off se…...

[动手学习深度学习]26. 网络中的网络 NiN

前面的LeNet、AlexNet、VGG在设计上的共同之处在于:先以卷积层构成的模块充分抽取空间特征,再以全连接层构成的模块来输出分类结果 其中AlexNet和VGG对LeNet的改进主要在于如何对这两个模块价款(增加通道数)和加深 这一节的NiN提出…...

C语言论递归函数及其本质

一个函数在函数体内又调用了本身,我们称为递归调用,这样的函数就是递归函数。 递归函数成功执行需满足以下两个条件: 必须有一个明显的结束条件。必须有一个趋近于结束条件的趋势。 举个生活例子:数钱 假设你有一叠钞票&#xf…...

碰一碰发视频saas系统技术源头一站式开发文档

碰一碰发视频系统技术源头一站式开发文档 一、引言 在数字化信息传播高速发展的当下,如何让视频分享更便捷、高效,成为商家和开发者们关注的焦点。“碰一碰发视频”系统以其独特的交互方式和强大的功能优势,为视频分享领域带来了革命性变革。…...

Linux目录理解

前言 最近在复习linux,发现有些目录总是忘记内容,发现有些还是得从原义和实际例子去理解会记忆深刻些。以下是个人的一些理解 Linux目录 常见的Linux下的目录如下: 1. 根目录 / (Root Directory) 英文含义:/ 是文件系统的根…...

可视化图解算法:链表中倒数(最后)k个结点

1. 题目 描述 输入一个长度为 n 的链表,设链表中的元素的值为ai ,返回该链表中倒数第k个节点。 如果该链表长度小于k,请返回一个长度为 0 的链表。 数据范围:0≤n≤105,0 ≤ai≤109,0 ≤k≤109 要求&am…...

Swift 并发中的任务让步(Yielding)和防抖(Debouncing)

网罗开发 (小红书、快手、视频号同名) 大家好,我是 展菲,目前在上市企业从事人工智能项目研发管理工作,平时热衷于分享各种编程领域的软硬技能知识以及前沿技术,包括iOS、前端、Harmony OS、Java、Python等…...

@SpringBootApplication

SpringBootApplication拓展 一. SpringBootConfiguration注解 是SpringBoot的注解, 标识一个类为配置类, 与Configration功能一致 run方法初始化了SpringBootConfiguration注解 注解源码 Target(ElementType.TYPE)//类型 Retention(RetentionPolicy.RUNTIME)//生命周期 Docu…...

什么是状态管理?有何种方式可以实现?它们之间有什么区别?

目录 一、状态管理的核心概念 二、常见状态管理方案及对比 1. 基础方案:setState 2. 官方推荐:Provider 3. 事件驱动:Bloc (Business Logic Component) 4. 响应式增强:Riverpod 5. 轻量级全能库:GetX 三、方案对比与选型指南 四、实战建议 在 Flutter 中,状态管…...

HW基本的sql流量分析和wireshark 的基本使用

前言 HW初级的主要任务就是看监控(流量) 这个时候就需要我们 了解各种漏洞流量数据包的信息 还有就是我们守护的是内网环境 所以很多的攻击都是 sql注入 和 webshell上传 (我们不管对面是怎么拿到网站的最高权限的 我们是需要指出它是…...

docker-compose install nginx(解决fastgpt跨区域)

CORS前言 CORS(Cross-Origin Resource Sharing,跨源资源共享)是一种安全措施,它允许或拒绝来自不同源(协议、域名、端口任一不同即为不同源)的网页访问另一源中的资源。它的主要作用如下: 同源策略限制:Web 浏览器的同源策略限制了从一个源加载的文档或脚本如何与另一…...

设计模式(创建型)-单例模式

摘要 在软件开发的世界里,设计模式是开发者们智慧的结晶,它们为解决常见问题提供了经过验证的通用方案。单例模式作为一种基础且常用的设计模式,在许多场景中发挥着关键作用。本文将深入探讨单例模式的定义、实现方式、应用场景以及可…...

Leetcode 刷题笔记1 图论part01

图论的基础知识: 图的种类: 有向图(边有方向) 、 无向图(边无方向)、加权有向图(边有方向和权值) 度: 无向图中几条边连接该节点,该节点就有几度&#xff1…...

鸿蒙NEXT开发问题大全(不断更新中.....)

目录 问题1:鸿蒙NEXT获取华为手机的udid ​问题2:[Fail]ExecuteCommand need connect-key? 问题3:测试时如何安装app包 问题1:鸿蒙NEXT开发获取华为手机的udid hdc -t "设备的序列号" shell bm get --udid 问题2&…...

分享一个项目中遇到的一个算法题

需求背景: 需求是用户要创建一个任务计划在未来执行,要求在创建任务计划的时候判断选择的时间是否符合要求,否则不允许创建,创建的任务类型有两种,一种是单次,任务只执行一次;另一种是周期&…...

TI的Doppler-Azimuth架构(TI文档)

TI在AWR2944平台上推出新的算法架构,原先的处理方式是做完二维FFT后在RD图上做CFAR检测,然后提取各个通道数据做测角。 Doppler-Azimuth架构则是做完二维FFT后,再做角度维FFT,生成Doppler-Azimuth频谱图,然后在该频谱图…...

电子邮件常用协议技术详解与C++实践(SMTP POP3 IMAP)

一、核心协议概览 协议端口(明文/加密)核心功能数据同步方式典型场景SMTP25 / 587邮件发送单向传输客户端提交邮件POP3110 / 995邮件下载单向同步单设备离线阅读IMAP143 / 993邮件管理双向同步多设备实时同步 二、协议深度解析 1. SMTP(简单…...

机器学习算法:一文掌握 K近邻算法 的详细用法(2个案例可直接运行)

文章目录 一、KNN 算法概述1.1 算法原理1.2 KNN 的优缺点1.3 K 值的选择 二、Python 实现 KNN 案例2.1 使用 KNN 算法进行手写数字识别2.2 使用 Python 实现 KNN 分类 三、总结 KNN(K-Nearest Neighbors,K近邻算法) 是一种简单且常用的分类和…...

设计C语言的单片机接口

一、主要内容 (一)控制引脚 1、定义管脚 // 定义管脚的结构体 struct pin{ int id; // 管脚编号 int mode; // 模式,输入为1,输出为0 int pull; // 输入电阻 int driver; // 功率 } 2、输出电平 语法: void pin_output(s…...

[从零开始学习JAVA] Stream流

前言: 本文我们将学习Stream流,他就像流水线一样,可以对我们要处理的对象进行逐步处理,最终达到我们想要的效果,是JAVA中的一大好帮手,值得我们了解和掌握。(通常和lambda 匿名内部类 方法引用相…...

「自动驾驶的数学交响曲:线性代数、微积分与优化理论的深度共舞」—— 解析人工智能背后的高阶数学工具链

引言 自动驾驶系统是数学工具链的集大成者。从传感器数据的多维空间映射到控制指令的生成,每一步都隐藏着线性代数、微积分、概率论和优化理论的精妙配合。本文将构建一个数学模型完整的自动驾驶案例,结合Python代码实现,揭示以下核心数学工具: 线性代数:张量运算与特征空…...

调试 Rust + WebAssembly 版康威生命游戏

1. 启用 Panic 日志 1.1 让 Panic 信息显示在浏览器控制台 如果 Rust 代码发生 panic!(),默认情况下不会在浏览器开发者工具中显示详细的错误信息。这使得排查问题变得困难。 我们可以使用 console_error_panic_hook 这个 Rust crate,将 Panic 信息打…...

VSCode通过SSH远程登录Windows服务器

系列 1.1 VSCode通过SSH远程登录Windows服务器 1.2 VSCode通过SSH免密远程登录Windows服务器 文章目录 系列1 准备工作2 远程服务器配置2.1 安装SSH服务器2.2 端口 3 本地电脑配置3.1 安装【Remote - SSH】。3.2 登录 1 准备工作 本地电脑Windows 11,已安装VS Cod…...

qt下载和安装教程国内源下载地址

qt不断在更新中,目前qt6日渐成熟,先前我们到官方下载或者国内镜像直接可以下载到exe文件安装,但是最近几年qt官方似乎在逐渐关闭旧版本下载通道,列为不推荐下载。但是qt5以其广泛使用和稳定性,以及积累大量代码使得qt5…...

使用htool工具导出和导入Excel表

htool官网 代码中用到的hool包里面的excel工具ExcelUtil 1. 引入依赖 <!-- Java的工具类 --><dependency><groupId>cn.hutool</groupId><artifactId>hutool-all</artifactId><version>5.8.25</version></dependency>&l…...

mysql 到 doris 挪移数据

工具datax..... 下载地址&#xff1a;http://datax-opensource.oss-cn-hangzhou.aliyuncs.com/datax.tar.gz 下载以后解压&#xff1a;tar -xvzf datax.tar.gz 然后&#xff0c;理论上就可以直接使用了。但是&#xff0c;datax本身是python2写的&#xff0c;如果需要python3…...

Springboot中的@ConditionalOnBean注解:使用指南与最佳实践

在使用Spring Boot进行开发时&#xff0c;大家应该都听说过条件注解&#xff08;Conditional Annotations&#xff09;。其中的ConditionalOnBean注解就很有趣&#xff0c;它帮助开发者在特定条件下创建和注入Bean&#xff0c;让你的应用更加灵活。今天就来聊聊这个注解的使用场…...

ubuntu系统下添加pycharm到快捷启动栏方法

一、背景 之前在ubuntu系统下使用pycharm时&#xff0c;总是要进入/home/dlut/pycharm-community-2022.1/bin文件夹下&#xff0c;然后终端执行命令下面的命令才可修改代码&#xff1a; ./pycharm.sh为了以后方便&#xff0c;这里给出添加pycharm到快捷启动栏的方法 二、添加…...

开源:LMDB 操作工具:lmcmd

目录 什么是 LMDB为什么编写 lmcmd安装方法如何使用 连接数据库命令列表 小结 1. 什么是 LMDB LMDB&#xff08;Lightning Memory-Mapped Database&#xff09;是一种高效的键值存储数据库&#xff0c;基于内存映射&#xff08;memory-mapping&#xff09;技术&#xff0c;提供…...