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

从0开始:OpenCV入门教程【图像处理基础】

图像处理基础

一、OpenCV主要功能及模块介绍

1、内置数据结构和输入/输出

  • OpenCV内置了丰富的与图像处理有关的数据结构,如Image、Point、Rectangle等。
  • core模块实现了各种基本的数据结构。
  • imgcodecs模块提供了图像文件的读写功能,用户使用简单的命令即可读写图像文件。

2、图像处理操作

imgproc模块提供了图像处理操作,如图像过滤、几何图像变换、绘图、色彩空间转换、直方图等。

3、图形用户界面操作

highgui模块提供了图像的图形窗口操作功能,如创建窗口显示图像或者视频、令窗口响应键盘和鼠标事件、操作窗口中图像的某个区域等。

4、视频分析

video模块提供了视频分析功能,如分析视频中连续帧之间的运动、跟踪视频中的目标。videostab模块提供了视频稳定处理功能,可解决拍摄视频时的抖动问题。optflow模块提供了与光流操作相关的算法。

5、3D重建

calib3d模块提供了3D重建功能,可根据2D图像创建3D场景。

6、特征提取

features2d模块提供了特征提取功能,可以从2D图像中检测和提取对象的特征。

7、对象检测

objdetect和xobjdetect模块提供了对象检测功能,可在图像中检测给定图像的位置。

8、机器学习

ml模块提供了机器学习功能,包含了多种机器学习算法,如k近邻(k-Nearest Neighbors,kNN)、k均值聚类(k-Means Clustering)、支持向量机(Support Vector Machines,SVM)、神经网络(Neural Network)等。机器学习算法广泛应用于目标识别、图像分类、人脸检测、视觉搜索等。

9、深度学习

深度神经网络(Deep Neural Network,DNN)模块提供了深度学习功能。深度学习是机器学习中近几年来快速发展的一个子领域,广泛应用于语音识别、图像识别、自然语言处理、图像修复、人脸识别等。OpenCV的深度学习支持Caffe、TensorFlow、Torch、Darknet等著名的深度学习框架。

10、计算摄影

计算摄影通过图像处理技术来改善相机拍摄的图像,如高动态范围成像、全景图像、图像补光等。photo和xphoto模块提供了与计算摄影有关的算法,stitching模块提供了全景图像算法。

11、形态分析

shape模块提供了形态分析功能,可以识别图像中对象的形状、分析形状之间的相似性、转换对象形状等。

12、人脸检测和识别

OpenCV已在face模块中实现了人脸检测、人脸特征检测和人脸识别功能。人脸检测属于对象检测,用于找出图像中人脸的位置和尺寸。人脸特征检测属于特征检测,用于找出图像中人脸的主要特征。人脸识别属于对象识别,包括从已知人脸集合中找出与未知人脸最匹配的人脸,以及验证给定人脸是否为某个已知人脸。OpenCV实现了基于Haar级联分类器和基于深度学习的人脸检测算法,以及EigenFaces、FisherFaces和局部二进制编码直方图(Local Binary Patterns Histograms,LBPH)等人脸识别算法。

13、表面匹配

surface_matching模块提供了3D对象识别算法和3D特征的姿态估计算法,用于根据图像的深度和强度信息识别3D对象。

14、文本检测和识别

text模块提供了文本检测和识别功能,用于识别和检测图像中的文本,实现车牌识别、道路标志识别、内容数字化等相关应用。

二、图像基本操作

读取图像:cv.imread()

import numpy as np

import cv2 as cv

#加载彩色灰度图像

img = cv.imread('messi5.jpg',0)

显示图像:cv.imshow()

cv.imshow('image',img)
cv.waitKey(0)
cv.destroyAllWindows()

写入图像:cv.imwrite()

import cv2
import numpy

img=numpy.zeros((50,50),dtype=numpy.uint8)	#创建大小为50×50的黑色正方形图像

cv2.imwrite('messigray.jpg',img)  

思考题:如果我们想以灰度模式加载图像,显示图像,按s键可以保存图像并退出,或者按ESC键直接退出不保存,设计出代码。

import numpy as np
import cv2 as cv
img = cv.imread('cat.jpg',0) #或者把0改成cv.IMREAD_GRAYSCALE
cv.imshow('cat.jpg',img)
k=cv.waitKey(0)
if k==27:
    cv.destroyAllWindows()
elif k==ord('s'):
    cv.imwrite('catgray.png',img)
    cv.destroyAllWindows()

其中注意:

  • 判断 ESC 键(ASCII码27):
    如果按下的是 ESC 键(对应的ASCII码是27),程序会调用 cv.destroyAllWindows() 关闭所有打开的窗口,不保存图像。
  • 判断 s 键:
    如果按下的是字母 s 键(ord('s') 用来获取字符 s 的 ASCII 码),程序会执行两步:
    1. 使用 cv.imwrite('catgray.png', img) 将当前图像保存为名为 'catgray.png' 的文件。
    2. 然后调用 cv.destroyAllWindows() 关闭所有窗口。

三、视频读取-摄像头读取

(1)将视频文件或者摄像头作为数据源来创建VideoCapture对象。

(2)调用VideoCapture对象的read()方法获取视频中的帧,每一帧都是一幅图像。

(3)调用VideoWriter对象的write()方法将帧写入视频文件,或者调用cv2.imshow()函数在窗口中显示帧(即播放视频)。

import numpy as np
import cv2 as cv
cap = cv.VideoCapture(0)
fourcc = cv.VideoWriter_fourcc(*'XVID')
out = cv.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
if not cap.isOpened():
    print("Cannot open camera")
    exit()
while True:
    # 逐帧捕获
    ret, frame = cap.read()
    # 如果正确读取帧,ret为True
    if not ret:
        print("Can't receive frame (stream end?). Exiting ...")
        break
    frame = cv.flip(frame, 1)
    out.write(frame)
    # 我们在框架上的操作到这里
    gray = cv.cvtColor(frame, cv.COLOR_BGR2GRAY)
    # 显示结果帧e
    cv.imshow('frame', frame)
    if cv.waitKey(1) == ord('q'):
        break
# 完成所有操作后,释放捕获器
cap.release()
out.release()
cv.destroyAllWindows()
  • 通过摄像头实时捕获视频;
  • 对每一帧进行水平镜像翻转;
  • 将处理后的帧保存为视频文件,同时在屏幕上实时显示视频画面;
  • 当用户按下 'q' 键时,停止视频捕获并释放所有资源。

像这样,还挺有趣的哈哈

后面可以结合图像识别做更有趣的操作,学起来~


http://www.kler.cn/a/557457.html

相关文章:

  • open webui 部署 以及解决,首屏加载缓慢,nginx反向代理访问404,WebSocket后端服务器链接失败等问题
  • 记录一下_treafik使用Gateway-APi使用的细节参数
  • [ComfyUI]Recraft贴图开源方案,实现服装印花自由
  • P2865 [USACO06NOV] Roadblocks G 与最短路的路径可重复的严格次短路
  • Spring Boot中整合Flink CDC 数据库变更监听器来实现对MySQL数据库
  • 工业级无人机手持地面站技术详解
  • 基于SpringBoot+vue+uniapp的智慧旅游小程序+LW示例参考
  • DirectX SDK(June 2010)安装报错:S1023
  • 0222-leetcode-1768.交替合并字符串、389找不同、
  • 0基础学Linux系统(准备1)
  • Java试题:进制转换
  • SQL Server 创建用户并授权
  • 【部署优化篇十三】深度解析《DeepSeek API网关:Kong+Nginx配置指南》——从原理到实战的超详细手册
  • 3.3.2 交易体系构建——缠论操作思路
  • Git常见命令--助力开发
  • C++ 设计模式-中介者模式
  • Python采用DeepSeekR1本地部署+本地API接口实现简单对话
  • 基于传统信息检索算法 BM25 的检索器 和 基于大语言模型生成的文本嵌入(dense embeddings)来计算相似度的检索器 两者的区别和联系
  • docker搭建tars框架
  • Pytorch的F.cross_entropy交叉熵函数