百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程字典 > 正文

OpenCV 实战从图像处理到深度学习的全面指南

toyiye 2024-06-21 11:55 13 浏览 0 评论

#挑战30天在头条写日记#

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()

相关推荐

为何越来越多的编程语言使用JSON(为什么编程)

JSON是JavascriptObjectNotation的缩写,意思是Javascript对象表示法,是一种易于人类阅读和对编程友好的文本数据传递方法,是JavaScript语言规范定义的一个子...

何时在数据库中使用 JSON(数据库用json格式存储)

在本文中,您将了解何时应考虑将JSON数据类型添加到表中以及何时应避免使用它们。每天?分享?最新?软件?开发?,Devops,敏捷?,测试?以及?项目?管理?最新?,最热门?的?文章?,每天?花?...

MySQL 从零开始:05 数据类型(mysql数据类型有哪些,并举例)

前面的讲解中已经接触到了表的创建,表的创建是对字段的声明,比如:上述语句声明了字段的名称、类型、所占空间、默认值和是否可以为空等信息。其中的int、varchar、char和decimal都...

JSON对象花样进阶(json格式对象)

一、引言在现代Web开发中,JSON(JavaScriptObjectNotation)已经成为数据交换的标准格式。无论是从前端向后端发送数据,还是从后端接收数据,JSON都是不可或缺的一部分。...

深入理解 JSON 和 Form-data(json和formdata提交区别)

在讨论现代网络开发与API设计的语境下,理解客户端和服务器间如何有效且可靠地交换数据变得尤为关键。这里,特别值得关注的是两种主流数据格式:...

JSON 语法(json 语法 priority)

JSON语法是JavaScript语法的子集。JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔花括号保存对象方括号保存数组JS...

JSON语法详解(json的语法规则)

JSON语法规则JSON语法是JavaScript对象表示法语法的子集。数据在名称/值对中数据由逗号分隔大括号保存对象中括号保存数组注意:json的key是字符串,且必须是双引号,不能是单引号...

MySQL JSON数据类型操作(mysql的json)

概述mysql自5.7.8版本开始,就支持了json结构的数据存储和查询,这表明了mysql也在不断的学习和增加nosql数据库的有点。但mysql毕竟是关系型数据库,在处理json这种非结构化的数据...

JSON的数据模式(json数据格式示例)

像XML模式一样,JSON数据格式也有Schema,这是一个基于JSON格式的规范。JSON模式也以JSON格式编写。它用于验证JSON数据。JSON模式示例以下代码显示了基本的JSON模式。{"...

前端学习——JSON格式详解(后端json格式)

JSON(JavaScriptObjectNotation)是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScriptProgrammingLa...

什么是 JSON:详解 JSON 及其优势(什么叫json)

现在程序员还有谁不知道JSON吗?无论对于前端还是后端,JSON都是一种常见的数据格式。那么JSON到底是什么呢?JSON的定义...

PostgreSQL JSON 类型:处理结构化数据

PostgreSQL提供JSON类型,以存储结构化数据。JSON是一种开放的数据格式,可用于存储各种类型的值。什么是JSON类型?JSON类型表示JSON(JavaScriptO...

JavaScript:JSON、三种包装类(javascript 包)

JOSN:我们希望可以将一个对象在不同的语言中进行传递,以达到通信的目的,最佳方式就是将一个对象转换为字符串的形式JSON(JavaScriptObjectNotation)-JS的对象表示法...

Python数据分析 只要1分钟 教你玩转JSON 全程干货

Json简介:Json,全名JavaScriptObjectNotation,JSON(JavaScriptObjectNotation(记号、标记))是一种轻量级的数据交换格式。它基于J...

比较一下JSON与XML两种数据格式?(json和xml哪个好)

JSON(JavaScriptObjectNotation)和XML(eXtensibleMarkupLanguage)是在日常开发中比较常用的两种数据格式,它们主要的作用就是用来进行数据的传...

取消回复欢迎 发表评论:

请填写验证码