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

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.dtcms.com/a/318908.html

相关文章:

  • 【题解】洛谷P3768 简单的数学题[杜教筛]+两种欧反公式解析
  • UDP网络编程chat
  • CompletableFuture的基础用法介绍
  • 技术优势铸就行业标杆:物联网边缘计算网关凭何引领智能变革?
  • 施耐德 Easy Altivar ATV310 变频器:高效电机控制的理想选择(含快速调试步骤及常见故障代码)
  • Flutter 局部刷新方案对比:ValueListenableBuilder vs. GetBuilder vs. Obx
  • 齐护机器人小智AI_MCP图形化编程控制Arduino_ESP32
  • 亚远景-ISO 42001:汽车AI安全的行业标准新趋势
  • 网站 博客遭遇DDoS,CC攻击应该怎样应对?
  • crew AI笔记[2] - 如何选型
  • MCU-TC397的UCB初识
  • 初识 MQ:从同步到异步,聊聊消息队列那些事
  • OpenCv对图片视频的简单操作
  • 深度学习(2):自动微分
  • 学深度学习,有什么好的建议或推荐的书籍?
  • MobileNetV3: 高效移动端深度学习的前沿实现
  • 从“炼金术”到“工程学”:深度学习十年范式变迁与未来十年路线图
  • 深度学习之opencv篇
  • HashMap寻址算法
  • QT项目 -仿QQ音乐的音乐播放器(第五节)
  • 《算法导论》第 10 章 - 基本数据结构
  • 深入剖析Java线程:从基础到实战(上)
  • ubuntu cloud init 20.04LTS升级到22.04LTS
  • vue3接收SSE流数据进行实时渲染日志
  • Web开发模式 前端渲染 后端渲染 身份认证
  • 第三章:【springboot】框架介绍MyBatis
  • Spring AOP动态代理核心原理深度解析 - 图解+实战揭秘Java代理设计模式
  • 前端百分比展示导致后端 BigDecimal 转换异常的排查与解决
  • 多账号管理方案:解析一款免Root的App分身工具
  • 【RabbitMQ面试精讲 Day 13】HAProxy与负载均衡配置