OpenCV入门:图像处理基础教程

OpenCV简介

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习库。它包含超过2500种优化算法,涵盖图像处理、物体识别、人脸检测、3D重建、视频分析等任务。

核心功能

  • 图像处理:滤波、边缘检测、几何变换。
  • 视频分析:运动估计、背景减除。
  • 物体检测:人脸、行人、文本等。
  • 相机标定:3D重建、AR应用。
  • 机器学习:SVM、KNN、神经网络等集成。

下载与安装

Python环境安装

通过pip直接安装:

pip install opencv-python  # 仅核心模块
pip install opencv-contrib-python  # 包含额外模块

资源推荐

  • 官方文档:docs.opencv.org
  • GitHub仓库:github.com/opencv/opencv
  • 教程:OpenCV官方提供的Python和C++示例代码。

基础功能

1 读取图片

import cv2
import numpy as np
a=cv2.imread('test.png')
cv2.imshow('tu',a)
print(a.shape)
print(a.size)
print(a.dtype)
b=cv2.waitKey(0)
# cv2.destroyAllWindows()

这里线导入了opencv的库CV2,读取了一张图片,这里我们读取后的数据为(*,*,3),因为默认读取的是RGB三个通道的。然后cv2.show()可以展示图片,cv2.waitKey(0)表示停留时间,如果参数为0,表示一直停留,如果是其他表示停留n毫秒。cv2.destroyAllWindows()表示关闭所有界面

2 转化灰度图和保存

import cv2
import numpy as np
# a=cv2.imread('test.png',cv2.IMREAD_GRAYSCALE)
# a=cv2.imread('test.png',0)#等效
a=cv2.imread('test.png')
a=cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)
cv2.imshow('tu',a)
cv2.waitKey(0)
cv2.destroyAllWindows()
#图片保存
cv2.imwrite('test0.jpg',a)

这里采用了三种方法来转化灰度图,前两种都是在读取的同时就转化为灰度图了,第一种用cv2.IMREAD_GRAYSCALE来直接转换,其实吧这个替换为0也是同样效果。还有一种是用cv2.cvtColor(a,cv2.COLOR_BGR2GRAY)来转的。最后可以用cv2.imwrite('test0.jpg',a)来保存。

3 抠图

#抠图
import cv2
import numpy as np
a=cv2.imread('test.png')#等效b=a[100:300,280:500]
cv2.imshow('b',b)
cv2.imshow('tu',a)
cv2.waitKey(0)
#图片保存
cv2.imwrite('test0.jpg',a)

这里就像数组一样,可以进行切片。然后选取我们要选中的区域

我们可以这样理解图片,图片是由一个一个像素组成的,cv2库把像素点量化了(0-255)。通过cv2,我们可以把一组数组转化为图片,也可以把图片转化为数组。所有我们可以选中一块区域来转化为图片。

4 读取视频

#读取视频
import cv2
import numpy as np
video=cv2.VideoCapture('test.mp4')
# video=cv2.VideoCapture(0)         #0表示打开摄像头
if not video.isOpened():            #判断是否打开print("视频打开失败")
while True:ret,frame=video.read()              #ret表示是否读取到下一帧,用于终止画面的if not ret:break# frame=cv2.cvtColor(frame,cv2.COLOR_BGR2GRAY)    #把图像转化为黑白的cv2.imshow('frame',frame)if cv2.waitKey(30)  == 27:          #27为esc的ASCII码,只有esc才能退出breakvideo.release()
cv2.destroyAllWindows()

我们用cv2.VideoCapture('test.mp4')来读取一个视频,然后判断是否打开了(防止意外发生),然后如果打开了就进入一个循环,就是读取视频的每一帧,然后如果存在这里ret就为True:帧读取成功,可继续处理,否则就停止了。然后对这一帧进行展示,然后下面cv2.waitKey()中填参数来控制速度越大就会播放的速度。最后要对视频资源进行释放,否则如果视频资源太多会卡顿。

5 提取RGB通道

提取RGB通道
import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a1=a[:,:,0]
a2=a[:,:,1]
a3=a[:,:,2]
cv2.imshow('Red Channel (Grayscale)', a2)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)
cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)
cv2.waitKey(0)a_new=a.copy()
a_new[:,:,0]=0
a_new[:,:,1]=0
# a_new[:,:,2]=0
cv2.imshow('Red',a_new)
cv2.waitKey(0)b,g,r=cv2.split(a)
cv2.imshow('a',a)cv2.imshow('g',g)
cv2.imshow('b',b)
cv2.imshow('r',r)n=cv2.merge([b,g,r])
cv2.imshow('new',n)
cv2.waitKey(0)

上面提供了三种提供RGB的方式,但是如果我们展示单通道的时候会自动转化为灰白的图片,只有当我们将其与两种设为0,这样才会展现出。(RGB顺序和RGB不一样,他是以BGR顺序存在的)

 6 图片打码

import cv2
import numpy as np
a=cv2.imread('test.png')#等效
a[100:300,280:500]=np.random.randint(0,255,(200,220,3))
cv2.imshow('a',a)
cv2.waitKey(0)

还是和上面说的一样,图片由像素表示,像素由数字控制大小,如果我们把指定区域的数字取随机数,那么这块就相当于打码了

7 图片组合

import cv2
import numpy as np
a=cv2.imread('test.png')#等效
b=cv2.imread('img.png')
a[100:300,280:500]=b[100:300,200:420]
cv2.imshow('a',a)
cv2.waitKey(0)

这个就是把像素的一块,替换为另一张图片的一块,和上面图片打码的核心是差不多的。值得注意的是,这里两张图片取的大小要对应。

8 图片缩放

import cv2
import numpy as np
a=cv2.imread('test.png')#等效
cv2.imshow('a',a)
# b=cv2.resize(a,(300,300))
b=cv2.resize(a,dsize=None,fx=1.5,fy=1.5)
cv2.imshow('b',b)
cv2.waitKey(0)

这里由两种方法,虽然都是用resize,但一个 是直接给出你要放大或缩小到多少像素大小,另一种是要横向x和纵向y要放大或缩小多少倍

总结        

        OpenCV是一个开源的计算机视觉库,提供2500多种优化算法,支持图像处理、视频分析、物体检测等任务。摘要介绍了OpenCV的基础功能:1)读取和显示图片;2)灰度图转换与保存;3)图像区域裁剪;4)视频读取与处理;5)RGB通道分离与合并;6)图像打码处理;7)图像组合;8)图像缩放。这些功能展示了OpenCV如何通过像素级操作实现基础图像处理,为更复杂的计算机视觉应用奠定基础。

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

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

相关文章

影响内容传播速度的因素有哪些?

内容的传播速度是我们在衡量营销效果时的重要指标。传播速度越快,越能帮助品牌迅速覆盖目标受众,在短时间内提升影响力。影响内容传播速度的方式来自多个方面,下面就让我们一同来了解下这其中的因素。一、观点价值观点是否具有价值&#xff0…

css动态样式

使用scss通过变量设置css动态样式<template><div><!-- 方式一 --><p v-for"(item, index) in dataList" :key"index" :style"{--color: item.color}" >{{item.name}}</p><!-- 方式二 --><p v-for"(…

开源流媒体服务器ZLMediaKit 的Java Api实现的Java版ZLMediaKit流媒体服务器-二开视频对话

安全性&#xff1a;使用了WSS&#xff08;WebSocket Secure&#xff09;协议确保通信安全 兼容性&#xff1a;支持现代浏览器的WebRTC功能 信令机制&#xff1a;通过WebSocket进行信令交换&#xff0c;确保连接建立 媒体传输&#xff1a;使用STUN服务器进行NAT穿透&#xff0c;…

mariadb10.3.35备份脚本

一、创建备份用户[(none)]> create user buserlocalhost identified by tmrQ;[(none)]> GRANT RELOAD, PROCESS, LOCK TABLES, REPLICATION CLIENT ON *.* TO buserlocalhost;[(none)]> flush privileges;二、脚本# cat mysql_bask.sh #!/bin/bash # MariaDB 10.3.35…

W3D引擎游戏开发----从入门到精通【22】

配置完成基本DT物体项后&#xff0c;在这个DT物体项中开始添加这个玩家的动画信息&#xff0c;如下所示。UseAnim设置是否使用动画功能&#xff0c;这里开启。AnimTypeN设置总共的动画类型数&#xff0c;当前只有一个待机动画&#xff0c;因此设置为1。AnimType1FrameN设置1号动…

在我国申请注册的商标在国外可以用不!

近日一个网友找到普推知产商标老杨&#xff0c;问在我国申请注册商标在新加坡和欧盟可以用不&#xff0c;当然用不成&#xff0c;根据商标法的地域性原则&#xff0c;商标权保护限于注册地&#xff0c;驰名商标享有部分跨国保护&#xff0c;但是这个要有所在国相关法律证据。如…

在开发板上画出一个2048棋盘的矩阵

#include “head.h"int* p lcd NULL; //显示屏内存映射的起始地址int g lcd width; //LCD显示屏的宽度int g lcd high ; //LCD显示屏的高度int g lcd bpp; //每个像素点所占的比特位//int x:屏的X轴&#xff08;宽度、列&#xff09;坐标//int y:屏幕y轴&#xff08;高度、…

开源软件与文化:从嬉皮士精神到数字时代的协同创新

开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新 本文章由笔者使用提示词驱动AI创作&#xff0c;并进行审阅。 文章目录开源软件与文化&#xff1a;从嬉皮士精神到数字时代的协同创新一、引言&#xff1a;开源的文化基因与技术革命二、开源软件的文化根源&#x…

sigfillset 函数详解

sigfillset 函数详解 一、函数概念 sigfillset() 是 POSIX 信号处理中的核心函数&#xff0c;用于初始化并填充一个信号集&#xff0c;使其包含当前系统支持的所有信号。它是操作信号屏蔽字&#xff08;signal mask&#xff09;的基础工具&#xff0c;常与 sigprocmask()、sigs…

Redis实战(8) -- 分布式锁Redission底层机制

介绍Redisson 是基于 Redis 实现的 Java 驻内存数据网格&#xff08;In-Memory Data Grid&#xff09;&#xff0c;提供了分布式和可扩展的 Java 数据结构&#xff0c;如分布式锁、分布式集合等。【注意】如果需要重新实现redission&#xff0c;需要重新设置RedissionClient配置…

Linux基础测试

linux基础测试 一、环境准备 基础环境信息 登录用户&#xff1a;root&#xff08;初始密码&#xff1a;redhat&#xff09; 虚拟机启动&#xff1a;登录后执行 virt-manager&#xff0c;右键启动 node1 和 node2 虚拟机 node1 信息&#xff1a;root 密码为 redhat&#xf…

Linux中Docker Swarm实践

一、部署前后分离使用你自己的自定义镜像部署多个副本所有副本使用相同的配置和逻辑Nginx 做反向代理统一入口外部访问形式如&#xff1a;http://your-domain/api/xxx1.1 建立私库镜像已构建并推送到可访问的镜像仓库启动 Docker Registry 容器docker run -d -p 5000:5000 --re…

Dash 中的 dcc.Clipboard 组件详解:实现一键复制功能

dcc.Clipboard 是 Dash 核心组件库中的一个实用工具&#xff0c;允许用户将指定内容一键复制到系统剪贴板&#xff0c;极大提升用户体验。本文将深入解析该组件的用法、特性和实际应用场景。 一、组件核心功能与价值 dcc.Clipboard 解决了 Web 应用中的关键痛点&#xff1a; 简…

初识C++类的6个默认成员函数

目录 一、初始化和清理 二、拷贝复制 三、取地址重载 四、重要说明 五、注意事项 六、示例代码 在C中&#xff0c;当一个类没有显式定义某些成员函数时&#xff0c;编译器会自动生成6个默认成员函数。这些函数可以分为以下几类&#xff1a; 一、初始化和清理 1、构造函数…

Spring事务失效场景?

题目详细答案Spring事务失效的场景主要有以下几种。非public方法使用Transactional场景描述&#xff1a;Spring事务管理是基于AOP实现的&#xff0c;而AOP对于JDK动态代理或CGLib动态代理只会代理public方法。如果事务方法的访问修饰符为非public&#xff0c;SpringAOP无法正确…

1.电动汽车动力电池系统技术介绍与分类

1.电动汽车动力电池系统技术介绍与分类 1.1 电动汽车发展的三个 “黄金时代” 第一个黄金时代&#xff08;19 世纪末 - 20 世纪初&#xff09; 技术基础&#xff1a;铅酸蓄电池发明&#xff08;1859 年&#xff09;&#xff0c;推动电动三轮车&#xff08;1873 年&#xff09;、…

调用阿里云-阿里云百炼 AI

相关文档&#xff1a;大模型服务平台百炼控制台 多轮对话&#xff1a;通义千问模型的多轮对话_大模型服务平台百炼(Model Studio)-阿里云帮助中心 创建知识库&#xff1a;大模型服务平台百炼控制台 创建智能体&#xff1a;大模型服务平台百炼控制台 点击智能体发布后&#x…

Apache Flink:从实时数据分析到实时AI

引言欢迎踏上这段深入了解 Apache Flink 演进历程的旅程&#xff0c;Apache Flink 是一项重新定义了实时数据处理的技术。本博客文章基于王峰&#xff08;阿里云开放数据平台负责人、Apache Flink Committer&#xff09;在 2025 年 Flink Forward Asia 新加坡大会上的演讲内容编…

oelove奥壹新版v11.7旗舰版婚恋系统微信原生小程序源码上架容易遇到的几个坑,避免遗漏参数白屏显示等问题

oelove和 金媒我都用过一段时间&#xff0c;其中oelove 用的时间较多&#xff0c;也比较了解这个系统&#xff0c;这个系统比较不错的就是小程序是原生的&#xff08;完全遵循微信开发者平台规则非Uniapp&#xff09;开发的&#xff0c;原生小程序的特点就是兼容性好&#xff0…

行为模式-模板方法模式

定义&#xff1a;Define the skeleton of an algorithm in an operation,deferring some steps to subclasses.Template Method lets subclasses redefine certain steps of an algorithm without changing the algorithms structure.&#xff08;定义一个操作中的算法的框架&a…