OpenCV 实战:从图像处理到深度学习的全面指南
nanshan 2024-10-08 05:31 15 浏览 0 评论
1. OpenCV 简介
什么是 OpenCV?
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它由一系列的 C 函数和少量 C++ 类构成,同时提供 Python、Java 和 MATLAB 等语言的接口,实现了图像处理和计算机视觉方面的很多通用算法。
# 导入OpenCV库
import cv2
# 打印OpenCV版本
print(cv2.__version__)
输出:
4.5.2
OpenCV 的设计目标是提供一套简单而且可扩展的计算机视觉库,使得它能够方便地在实际的应用、研究、开发中被使用。
OpenCV 的历史与发展
OpenCV 的起源可以追溯到 1999 年,当时在英特尔公司由一群热情的研发工程师开始进行开发。2000 年,OpenCV 以开源的方式发布,旨在推动计算机视觉的发展并帮助更多人应用这一技术。自此之后,OpenCV 已经不断发展,增加了大量新的功能,并已成为全球最流行的计算机视觉库之一。
OpenCV 的应用领域
OpenCV 具有极广的应用领域,它包括但不限于:
- 人脸识别和物体识别:这是 OpenCV 的一项重要功能,应用在许多领域,如安全监控、交互设计等。
- 图像和视频分析:如图像增强、图像分割、视频跟踪等。
- 图像合成和 3D 重建:在图像处理和计算机视觉领域,OpenCV 可以用于创建 AR 或 VR 效果,生成 3D 模型等。
- 机器学习:OpenCV 内置了大量的机器学习算法,可以用于图像分类、聚类等任务。
- 深度学习:OpenCV 中的 dnn 模块提供了一系列深度学习模型的接口,用户可以加载预训练模型进行图像识别、目标检测等任务。
# 例如,以下代码展示了如何使用OpenCV进行图像读取和显示
import cv2
# 读取一张图像
img = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
综上,OpenCV 凭借其强大的功能、开源的优势以及广泛的应用领域,成为了学者和工业界的重要工具。
2. OpenCV 的安装与配置
OpenCV 的安装方式根据不同的操作系统和使用环境有所不同。以下我们将分别介绍在 Windows、Linux 和 Mac OS 下的安装方式,以及如何配置 Python 环境使用 OpenCV。
OpenCV 在 Windows 系统下的安装
在 Windows 系统下,推荐使用 Python 的包管理工具 pip 来安装 OpenCV。你可以在命令行中运行以下命令来安装:
pip install opencv-python
如果你需要使用到 OpenCV 的额外模块(如 xfeatures2d 等),可以安装 opencv-contrib-python 包:
pip install opencv-contrib-python
OpenCV 在 Linux 系统下的安装
在 Linux 系统下,我们同样可以使用 pip 来安装 OpenCV。打开终端,运行以下命令:
pip install opencv-python
同样,如果你需要使用到 OpenCV 的额外模块,可以安装 opencv-contrib-python 包:
pip install opencv-contrib-python
OpenCV 在 Mac OS 系统下的安装
在 Mac OS 下,我们同样可以使用 pip 来安装 OpenCV。打开终端,运行以下命令:
pip install opencv-python
如果你需要使用到 OpenCV 的额外模块,可以安装 opencv-contrib-python 包:
pip install opencv-contrib-python
配置 Python 环境使用 OpenCV
安装完成 OpenCV 后,我们可以在 Python 环境中导入 cv2 模块来使用 OpenCV 的功能。你可以创建一个新的 Python 脚本,然后在其中输入以下代码来测试 OpenCV 是否安装成功:
import cv2
# 打印OpenCV版本
print(cv2.__version__)
如果输出了你所安装的 OpenCV 版本号,那么恭喜你,你已经成功安装并配置好了 OpenCV!
总的来说,无论是在 Windows、Linux 还是 Mac OS 系统下,安装和使用 OpenCV 都是相对简单的。只需要几个简单的命令,就可以开始你的 OpenCV 之旅了。
3. OpenCV 基础
在此部分,我们将介绍一些 OpenCV 的基础知识,包括图像的载入、显示和保存,以及图像的基本操作和色彩空间的转换。
图像的载入、显示和保存
在 OpenCV 中,我们通常使用 imread() 函数来载入一张图像,使用 imshow() 函数来显示一张图像,使用 imwrite() 函数来保存一张图像。
以下是一个示例:
import cv2
# 载入一张图像
img = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()
# 保存图像
cv2.imwrite('new_image.jpg', img)
图像的基础操作
OpenCV 提供了一系列的函数来进行图像的基础操作,包括但不限于:
- 获取和修改像素值
- 获取图像的基本属性(如大小、通道数、像素数等)
- 设置图像的 ROI(Region of Interest)
- 拆分和合并图像通道
# 获取和修改像素值
px = img[100,100]
print(px)
# 修改像素值
img[100,100] = [255,255,255]
print(img[100,100])
# 获取图像属性
print(img.shape)
print(img.size)
print(img.dtype)
# 设置ROI
roi = img[100:200, 100:200]
# 拆分和合并图像通道
b,g,r = cv2.split(img)
img = cv2.merge((b,g,r))
图像色彩空间的转换
OpenCV 提供了 200 + 种颜色空间的转换方法,但是我们最常用的还是 RGB<->Gray 和 RGB<->HSV 的转换。
我们可以使用 cv2.cvtColor() 函数来进行颜色空间的转换,如下例:
# 转换为灰度图像
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 转换为HSV图像
hsv = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)
这是 OpenCV 基础操作的简单介绍,这些操作是我们在进行更高级的图像处理之前需要掌握的基础知识。
4. 图像处理与计算机视觉基础
在计算机视觉中,图像处理是一个关键的环节,它包括图像阈值化、边缘检测、图像滤波、图像形态学操作和图像二值化等操作。下面我们将一一介绍。
图像阈值化
图像阈值化是将图像从灰度转换为二值化图像的过程,OpenCV 提供了 cv2.threshold() 函数来进行这项操作。
import cv2
import numpy as np
# 载入图像并转为灰度图
img = cv2.imread('image.jpg',0)
# 阈值化处理
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 显示处理结果
cv2.imshow('threshold',thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()
边缘检测
边缘检测是计算机视觉中的常见任务,它可以用来识别图像中的物体。Canny 边缘检测是一种常用的边缘检测算法,OpenCV 中可以使用 cv2.Canny() 函数来进行 Canny 边缘检测。
import cv2
import numpy as np
# 载入图像
img = cv2.imread('image.jpg',0)
# 进行Canny边缘检测
edges = cv2.Canny(img,100,200)
# 显示处理结果
cv2.imshow('edges',edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像滤波
图像滤波是计算机视觉中常见的图像预处理方法,OpenCV 提供了各种滤波函数,如 cv2.filter2D()、cv2.blur()、cv2.GaussianBlur() 等。
import cv2
import numpy as np
# 载入图像
img = cv2.imread('image.jpg')
# 使用高斯滤波进行图像平滑处理
blur = cv2.GaussianBlur(img,(5,5),0)
# 显示处理结果
cv2.imshow('blur',blur)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像形态学操作
形态学操作是基于图像形状的一系列操作,包括腐蚀、膨胀、开运算和闭运算等。OpenCV 提供了 cv2.erode()、cv2.dilate()、cv2.morphologyEx() 等函数来进行形态学操作。
import cv2
import numpy as np
# 载入图像
img = cv2.imread('image.jpg',0)
# 创建一个5x5的结构元素
kernel = np.ones((5,5),np.uint8)
# 进行膨胀操作
dilation = cv2.dilate(img,kernel,iterations = 1)
# 显示处理结果
cv2.imshow('dilation',dilation)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像二值化
二值化是将图像处理为只有两个颜色的过程,也就是将图像处理为黑白两色。二值化后的图像对于很多图像处理任务(如边缘检测、物体识别等)有很大的帮助,OpenCV 中可以使用 cv2.threshold() 函数来进行二值化操作。
import cv2
import numpy as np
# 载入图像
img = cv2.imread('image.jpg',0)
# 进行二值化操作
ret,thresh1 = cv2.threshold(img,127,255,cv2.THRESH_BINARY)
# 显示处理结果
cv2.imshow('binary',thresh1)
cv2.waitKey(0)
cv2.destroyAllWindows()
以上是图像处理与计算机视觉的基础知识,掌握这些知识,就可以进行更复杂的图像处理任务了。
5. OpenCV 实战案例
人脸检测
首先,我们来实现一个简单的人脸检测程序。这个程序可以读取一个图像,然后使用预训练的 Haar 级联分类器检测图像中的人脸。
import cv2
# 加载预训练的人脸级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取图像
img = cv2.imread('face.jpg')
# 将图像转换为灰度图
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)
# 使用级联分类器检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 为每个检测到的人脸绘制一个矩形
for (x, y, w, h) in faces:
cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Faces found', img)
cv2.waitKey(0)
实时人脸检测
接下来,我们来实现一个实时的人脸检测程序。这个程序可以实时地从摄像头捕获视频,并检测视频中的人脸。
import cv2
# 加载预训练的人脸级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 打开摄像头
cap = cv2.VideoCapture(0)
while True:
# 读取一帧
ret, frame = cap.read()
# 将帧转换为灰度图
gray = cv2.cvtColor(frame, cv2.COLOR_BGR2GRAY)
# 使用级联分类器检测人脸
faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 为每个检测到的人脸绘制一个矩形
for (x, y, w, h) in faces:
cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)
# 显示结果
cv2.imshow('Faces found', frame)
# 按'q'退出循环
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放摄像头
cap.release()
# 关闭所有窗口
cv2.destroyAllWindows()
目标跟踪
接下来的实战案例是使用 MeanShift 算法进行目标跟踪。我们将从视频中选择一个目标,然后在后续的帧中跟踪这个目标。
import cv2
import numpy as np
# 打开摄像头
cap = cv2.VideoCapture(0)
# 读取第一帧
ret, frame = cap.read()
# 设置初始的窗口位置
r, h, c, w = 240, 100, 400, 160
track_window = (c, r, w, h)
# 设置初始的ROI用于跟踪
roi = frame[r:r+h, c:c+w]
hsv_roi = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
mask = cv2.inRange(hsv_roi, np.array((0., 60., 32.)), np.array((180., 255., 255.)))
roi_hist = cv2.calcHist([hsv_roi], [0], mask, [180], [0, 180])
cv2.normalize(roi_hist, roi_hist, 0, 255, cv2.NORM_MINMAX)
# 设置终止条件,迭代10次或者至少移动1次
term_crit = (cv2.TERM_CRITERIA_EPS | cv2.TERM_CRITERIA_COUNT, 10, 1)
while(True):
ret, frame = cap.read()
if ret == True:
hsv = cv2.cvtColor(frame, cv2.COLOR_BGR2HSV)
dst = cv2.calcBackProject([hsv], [0], roi_hist, [0, 180], 1)
# 使用MeanShift算法找到新的位置
ret, track_window = cv2.meanShift(dst, track_window, term_crit)
# 在图像上画出新的窗口位置
x, y, w, h = track_window
img2 = cv2.rectangle(frame, (x, y), (x+w, y+h), 255, 2)
cv2.imshow('img2', img2)
if cv2.waitKey(1) & 0xFF == ord('q'):
break
else:
break
cap.release()
cv2.destroyAllWindows()
边缘检测
边缘检测是图像处理中的重要步骤,它可以帮助我们从图像中识别出物体的轮廓。下面的实战案例是使用 Canny 算法进行边缘检测。
import cv2
import numpy as np
# 读取图像
img = cv2.imread('road.jpg', 0)
# 使用Canny算法进行边缘检测
edges = cv2.Canny(img, 50, 150)
# 显示原图和边缘检测结果
cv2.imshow('Original Image', img)
cv2.imshow('Edge Image', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像拼接
图像拼接是将两个或多个图像在一定的几何和光度条件下拼接在一起,形成一个包含了所有输入图像视场的大视场图像。以下实战案例将展示如何使用 OpenCV 进行图像拼接。
import cv2
import numpy as np
# 读取两个图像
img1 = cv2.imread('road1.jpg')
img2 = cv2.imread('road2.jpg')
# 将两个图像拼接成一个图像
stitcher = cv2.Stitcher.create()
result, pano = stitcher.stitch([img1, img2])
if result == cv2.Stitcher_OK:
cv2.imshow('Panorama', pano)
cv2.waitKey()
cv2.destroyAllWindows()
else:
print("Error during stitching.")
6. 深度学习与 OpenCV
OpenCV 库不仅提供了大量的基本图像处理函数,还为深度学习领域提供了强大的支持。它可以用来加载预训练的模型,并使用这些模型进行图像分类、对象检测、图像分割等任务。下面我们将通过一些实战案例来深入了解 OpenCV 如何应用在深度学习中。
加载预训练模型
首先,我们将学习如何加载一个预训练的模型。我们将使用 OpenCV 中的 DNN 模块,该模块支持多种深度学习框架,包括 TensorFlow、Caffe 等。
import cv2
# 加载预训练的模型
net = cv2.dnn.readNetFromCaffe('bvlc_googlenet.prototxt', 'bvlc_googlenet.caffemodel')
图像分类
接下来,我们将使用加载的模型进行图像分类。我们将对一个图像进行预处理,然后将其输入到模型中,获取分类结果。
import cv2
import numpy as np
# 加载预训练的模型
net = cv2.dnn.readNetFromCaffe('bvlc_googlenet.prototxt', 'bvlc_googlenet.caffemodel')
# 加载标签名
with open('synset_words.txt', 'r') as f:
labels = f.read().strip().split("\n")
# 加载图像,并进行预处理
image = cv2.imread('image.jpg')
blob = cv2.dnn.blobFromImage(image, 1, (224, 224), (104, 117, 123))
# 将图像输入到网络中,进行前向传播,得到输出结果
net.setInput(blob)
outputs = net.forward()
# 获取预测结果
class_id = np.argmax(outputs)
label = labels[class_id]
print('Output class:', label)
物体检测
此外,我们还可以使用预训练的模型进行物体检测。我们将使用预训练的 YOLO 模型来检测图像中的物体。
import cv2
import numpy as np
# 加载预训练的模型
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')
# 加载图像,并进行预处理
image = cv2.imread('image.jpg')
blob = cv2.dnn.blobFromImage(image, 1/255, (416, 416), swapRB=True, crop=False)
# 将图像输入到网络中,进行前向传播,得到输出结果
net.setInput(blob)
layer_names = net.getLayerNames()
output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]
outputs = net.forward(output_layers)
# 处理网络的输出结果
for output in outputs:
for detection in output:
scores = detection[5:]
class_id = np.argmax(scores)
confidence = scores[class_id]
if confidence > 0.5:
# 将检测到的物体在图像上标记出来
center_x, center_y, w, h = map(int, detection[0:4] * np.array([image.shape[1], image.shape[0], image.shape[1], image.shape[0]]))
x = center_x - w // 2
y = center_y - h // 2
cv2.rectangle(image, (x, y), (x + w, y + h), (0, 255, 0), 2)
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
相关推荐
- 服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下
-
Raid5数据恢复算法原理:分布式奇偶校验的独立磁盘结构(被称之为raid5)的数据恢复有一个“奇偶校验”的概念。可以简单的理解为二进制运算中的“异或运算”,通常使用的标识是xor。运算规则:若二者值...
- 服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复
-
服务器数据恢复环境&故障:由于机房多次断电导致一台服务器中raid阵列信息丢失。该阵列中存放的是文档,上层安装的是Windowsserver操作系统,没有配置ups。因为服务器异常断电重启后,rai...
- 服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例
-
服务器数据恢复环境:P740+AIX+Sybase+V7000存储,存储阵列柜上共12块SAS机械硬盘(其中一块为热备盘)。服务器故障:存储阵列柜中有磁盘出现故障,工作人员发现后更换磁盘,新更换的磁盘...
- 「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复
-
服务器数据恢复环境:DellPowerVault系列磁盘柜;用RAID卡创建的一组RAID5;分配一个LUN。服务器故障:在Linux系统层面对LUN进行分区,划分sdc1和sdc2两个分区。将sd...
- 服务器数据恢复-ESXi虚拟机被误删的数据恢复案例
-
服务器数据恢复环境:一台服务器安装的ESXi虚拟化系统,该虚拟化系统连接了多个LUN,其中一个LUN上运行了数台虚拟机,虚拟机安装WindowsServer操作系统。服务器故障&分析:管理员因误操作...
- 「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例
-
服务器数据恢复环境:HPStorageWorks某型号存储;虚拟化平台为vmwareexsi;10块磁盘组成raid5(有1块热备盘)。服务器故障:raid5阵列中两块硬盘指示灯变黄掉线,无法读取...
- 服务器数据恢复—基于oracle数据库的SAP数据恢复案例
-
服务器存储数据恢复环境:某品牌服务器存储中有一组由6块SAS硬盘组建的RAID5阵列,其中有1块硬盘作为热备盘使用。上层划分若干lun,存放Oracle数据库数据。服务器存储故障&分析:该RAID5阵...
- 「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例
-
服务器虚拟化数据恢复环境:Dell某型号服务器;数块STAT硬盘通过raid卡组建的RAID10;XenServer服务器虚拟化系统;故障虚拟机操作系统:WindowsServer,部署Web服务...
- 服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例
-
服务器数据恢复环境:某品牌服务器中有一组由4块SAS磁盘做的RAID5磁盘阵列。该服务器操作系统为windowsserver,运行了一个单节点Oracle,数据存储为文件系统,无归档。该oracle...
- 服务器数据恢复—服务器磁盘阵列常见故障表现&解决方案
-
RAID(磁盘阵列)是一种将多块物理硬盘整合成一个虚拟存储的技术,raid模块相当于一个存储管理的中间层,上层接收并执行操作系统及文件系统的数据读写指令,下层管理数据在各个物理硬盘上的存储及读写。相对...
- 「服务器数据恢复」IBM某型号服务器RAID5磁盘阵列数据恢复案例
-
服务器数据恢复环境:IBM某型号服务器;5块SAS硬盘组成RAID5磁盘阵列;存储划分为1个LUN和3个分区:第一个分区存放windowsserver系统,第二个分区存放SQLServer数据库,...
- 服务器数据恢复—Zfs文件系统下误删除文件如何恢复数据?
-
服务器故障:一台zfs文件系统服务器,管理员误操作删除服务器上的数据。服务器数据恢复过程:1、将故障服务器所有磁盘编号后取出,硬件工程师检测所有硬盘后没有发现有磁盘存在硬件故障。以只读方式将全部磁盘做...
- 服务器数据恢复—Linux+raid5服务器数据恢复案例
-
服务器数据恢复环境:某品牌linux操作系统服务器,服务器中有4块SAS接口硬盘组建一组raid5阵列。服务器中存放的数据有数据库、办公文档、代码文件等。服务器故障&检测:服务器在运行过程中突然瘫痪,...
- 服务器数据恢复—Sql Server数据库数据恢复案例
-
服务器数据恢复环境:一台安装windowsserver操作系统的服务器。一组由8块硬盘组建的RAID5,划分LUN供这台服务器使用。在windows服务器内装有SqlServer数据库。存储空间LU...
- 服务器数据恢复—阿里云ECS网站服务器数据恢复案例
-
云服务器数据恢复环境:阿里云ECS网站服务器,linux操作系统+mysql数据库。云服务器故障:在执行数据库版本更新测试时,在生产库误执行了本来应该在测试库执行的sql脚本,导致生产库部分表被tru...
你 发表评论:
欢迎- 一周热门
-
-
爱折腾的特斯拉车主必看!手把手教你TESLAMATE的备份和恢复
-
如何在安装前及安装后修改黑群晖的Mac地址和Sn系列号
-
[常用工具] OpenCV_contrib库在windows下编译使用指南
-
WindowsServer2022|配置NTP服务器的命令
-
Ubuntu系统Daphne + Nginx + supervisor部署Django项目
-
WIN11 安装配置 linux 子系统 Ubuntu 图形界面 桌面系统
-
解决Linux终端中“-bash: nano: command not found”问题
-
NBA 2K25虚拟内存不足/爆内存/内存占用100% 一文速解
-
Linux 中的文件描述符是什么?(linux 打开文件表 文件描述符)
-
K3s禁用Service Load Balancer,解决获取浏览器IP不正确问题
-
- 最近发表
-
- 服务器数据恢复—Raid5数据灾难不用愁,Raid5数据恢复原理了解下
- 服务器数据恢复—多次异常断电导致服务器raid不可用的数据恢复
- 服务器数据恢复-V7000存储更换磁盘数据同步失败的数据恢复案例
- 「服务器数据恢复」重装系统导致XFS文件系统分区丢失的数据恢复
- 服务器数据恢复-ESXi虚拟机被误删的数据恢复案例
- 「服务器数据恢复」Raid5阵列两块硬盘亮黄灯掉线的数据恢复案例
- 服务器数据恢复—基于oracle数据库的SAP数据恢复案例
- 「服务器虚拟化数据恢复」Xen Server环境下数据库数据恢复案例
- 服务器数据恢复—RAID故障导致oracle无法启动的数据恢复案例
- 服务器数据恢复—服务器磁盘阵列常见故障表现&解决方案
- 标签列表
-
- linux 查询端口号 (58)
- docker映射容器目录到宿主机 (66)
- 杀端口 (60)
- yum更换阿里源 (62)
- internet explorer 增强的安全配置已启用 (65)
- linux自动挂载 (56)
- 禁用selinux (55)
- sysv-rc-conf (69)
- ubuntu防火墙状态查看 (64)
- windows server 2022激活密钥 (56)
- 无法与服务器建立安全连接是什么意思 (74)
- 443/80端口被占用怎么解决 (56)
- ping无法访问目标主机怎么解决 (58)
- fdatasync (59)
- 405 not allowed (56)
- 免备案虚拟主机zxhost (55)
- linux根据pid查看进程 (60)
- dhcp工具 (62)
- mysql 1045 (57)
- 宝塔远程工具 (56)
- ssh服务器拒绝了密码 请再试一次 (56)
- ubuntu卸载docker (56)
- linux查看nginx状态 (63)
- tomcat 乱码 (76)
- 2008r2激活序列号 (65)