OpenCV的学习笔记

原创 2023-11-17 16:55 浙江
文章的分类 计算机视觉

OpenCV 的学习笔记

前言

概述

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库。它专为提供一个通用的基础设施,以帮助人们构建计算机视觉应用程序而设计。OpenCV提供了用于处理图像和视频的工具,包括面部识别、物体识别、图形变换、3D模型提取等功能。它可以用于多种编程语言如Python、C++、Java,并在多个平台如Windows、Linux、Mac OS上运行。OpenCV广泛应用于学术研究和商业项目中,是计算机视觉领域非常流行的一个工具。

获取函数和变量的信息

  • OpenCV的官方文档是获取关于这些函数和类的详细信息的最佳地点。文档详细描述了每个函数的作用、所需参数和返回值。
  • 在Python中,使用 help() 函数来获取关于任何函数或模块的信息。例如,执行 help(cv2.imshow) 会显示关于 imshow 函数的信息。
  • 网上在线资源和社区、指南和论坛,可以在这些地方找到OpenCV函数的使用例子和解释。

初步使用OpenCV

环境安装

安装OpenCV

1.安装Python: 确保系统上安装了Python。从Python官网下载和安装Python。
2.安装OpenCV库: 打开命令行工具(如终端、命令提示符),然后使用pip安装OpenCV。通常,运行以下命令:

pip install opencv-python

设置开发环境

1.安装VSCode代码编辑器:VSCode官网下载和安装
2.启动VSCode
3.创建一个新的Python文件: 在VSCode中创建一个新文件,保存为 .py 扩展名,例如 test_opencv.py。

编写和运行一个简单的OpenCV程序

1.编写代码: 在Python文件中编写一段简单的代码,用来读取和显示一张图像的代码:

# 将OpenCV库加载到Python脚本中
import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')

# 检查图像是否正确加载
if image is None:
    print("图像未找到")
else:
    # 显示图像
    cv2.imshow('Image', image)
    cv2.waitKey(0)
    cv2.destroyAllWindows()

2.运行代码: 在VSCode中运行Python脚本。就能看到加载的图像。

图像加载

至此,已经成功运行了基本的OpenCV程序并显示了图像!接下来,继续学习OpenCV的更多功能

图像基础操作

首先,熟悉一些基本的图像操作,如图像转换、调整大小、裁剪和旋转

示例: 调整图像大小:

# 将OpenCV库加载到Python脚本中
import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')  # 图像路径

# 设置新的宽度和高度
width = 300  # 宽度
height = 200  # 高度

# 调整图像大小
resized_image = cv2.resize(image, (width, height))

# 显示原始图像和调整大小后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Resized Image', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

这个简单的脚本,可以看到原始图像和调整大小后的图像。

图像调整

应用Canny边缘检测

Canny边缘检测是一种流行的边缘检测算法,它可以帮助我们在图像中识别物体的轮廓。

示例: Canny边缘检测

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg') # 图片路径
# 将图像转换为灰度
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 应用Canny边缘检测
edges = cv2.Canny(gray_image, 100, 200)

# 显示原始图像和边缘检测结果
cv2.imshow('Original Image', image)
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()

首先将图像转换为灰度,因为边缘检测通常在灰度图像上进行。然后使用cv2.Canny函数进行边缘检测。cv2.Canny函数的两个参数是用于边缘检测的阈值。运行代码,在图像中成功检测到边缘:

边缘检测

图像阈值处理

接下来,学习一下图像阈值处理。图像阈值是一种将图像分割成不同区域的简单方法,通常用于分离图像的前景和背景。

示例: 简单阈值处理

import cv2

# 读取图像
image = cv2.imread('path_to_image.jpg')  # 图像路径
# 彩色图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)    

# 应用阈值处理
ret, thresh_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 显示原始图像和阈值处理后的图像
cv2.imshow('Original Image', image)
cv2.imshow('Threshold Image', thresh_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个代码中,cv2.threshold 函数用于应用阈值处理。这个函数的参数包括:

需要处理的灰度图像。
阈值(在这个例子中是127),它用于决定像素转换的界限。
最大值(在这个例子中是255),它表示如果像素值超过(有时是小于,根据类型而定)阈值应该赋予的值。
阈值类型(在这个例子中是 cv2.THRESH_BINARY),它决定了如何应用阈值。

阈值处理-1

阈值处理和边缘检测在某些情况下看起来可能有相似的效果,但它们在技术上和应用目的上是不同的,那么换一张图片来看

阈值处理-2

阈值处理
目的:阈值处理的目的是将图像简化为二值图像,即只有黑色和白色。这通常用于分离图像的前景和背景,特别是在图像的区域相对均匀时。
工作原理:在阈值处理中,我们设置一个阈值,所有高于(或低于,根据阈值类型而定)这个阈值的像素值被设置为最大值(通常是255,表示白色),而所有其他像素值被设置为最小值(通常是0,表示黑色)。
结果:结果是一个高对比度的图像,其中只包含两种颜色(黑和白)。这使得从图像中提取特定信息变得更加容易。

边缘检测
目的:边缘检测的目的是识别图像中物体的边界。这对于理解图像中物体的形状和位置非常有用。
工作原理:边缘检测算法(如Canny边缘检测)通过识别像素强度的突变来检测边缘。它不仅关注像素的绝对强度,还关注像素之间的对比度。
结果:结果是一个标记了图像中主要边界或线条的图像,通常用于图像分析和图像识别任务中。

总结
阈值处理是一种基本的图像分割技术,将图像转换为简化的二值版本,强调整体的明暗区域。
边缘检测关注于识别图像中的边界和线条,是一种更复杂的图像分析技术。

形状检测

形状检测是计算机视觉中一个重要的应用,它涉及到识别和定位图像中的几何形状(如线条、圆形、矩形等)。现在将使用OpenCV中的轮廓检测功能来识别简单的形状。

示例: 检测和绘制轮廓

import cv2

# 读取图像
image = cv2.imread('640x500a0a0.jpg')  # 图像路径
# 彩色图像转换为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)

# 设置新的宽度和高度
width = 300  # 宽度
height = 200  # 高度

# 应用阈值处理来准备轮廓检测
ret, thresh = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

# 查找轮廓
contours, hierarchy = cv2.findContours(thresh, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)

# 在原始图像上绘制轮廓
cv2.drawContours(image, contours, -1, (0, 255, 0), 3)

# 调整图像输出大小
Original_image = cv2.resize(gray_image,(width,height))
resized_image = cv2.resize(image,(width, height))

# 显示图像
cv2.imshow('Original Image', Original_image)
cv2.imshow('Contours', resized_image)
cv2.waitKey(0)
cv2.destroyAllWindows()

左边是已转换灰度的图像,右边是已经描绘了轮廓的图像

绘制轮廓


进一步的使用OpenCV

更复杂的图像处理技术: 需要探索更高级的图像处理技术,如图像滤波、形态学操作(膨胀、腐蚀)、图像分割等。
特征提取: 学习如何在图像中提取特征,如使用SIFT、SURF或ORB算法进行关键点检测和描述。
对象识别和跟踪: 开始实现对象识别(如面部识别、文字识别)和对象跟踪。
使用深度学习: 什么时候感兴趣,什么时候就可以开始如何在OpenCV中结合深度学习,比如使用预训练的神经网络进行图像分类或对象检测。
实际项目应用: 尝试在实际项目中应用你学到的知识,如开发一个简单的图像识别应用、实现实时视频处理等。

结语

计算机视觉是一个非常广泛的领域,而且水巨巨巨...深,还有非常非常非...多的东西可以学习。不断断断断...实践并尝试新的项目是提高技能的最佳方式。



THE END


分享
赞赏
精选留言 写留言
    1. 张宇芳 来自美国 访客 头像
      2023年12月21日