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

news/2025/2/23 6:11:16

图像处理基础

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

python">import numpy as np

import cv2 as cv

#加载彩色灰度图像

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

显示图像:cv.imshow()

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

写入图像:cv.imwrite()

python">import cv2
import numpy

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

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

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

python">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()函数在窗口中显示帧(即播放视频)。

python">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.niftyadmin.cn/n/5863082.html

相关文章

AutoGen 技术博客系列 八:深入剖析 Swarm—— 智能体协作的新范式

本系列博文在掘金同步发布, 更多优质文章,请关注本人掘金账号: 人肉推土机的掘金账号 AutoGen系列一:基础介绍与入门教程 AutoGen系列二:深入自定义智能体 AutoGen系列三:内置智能体的应用与实战 AutoGen系列四&am…

《论软件的可靠性评价》审题技巧 - 系统架构设计师

论软件的可靠性评价写作框架 一、考点概述 软件可靠性评价作为软件可靠性活动的关键环节,是确保软件质量、提升用户体验的重要手段。本题主要考察以下几个方面的内容: 首先,本题要求考生理解并掌握软件可靠性评价的基本概念及其在软件开发…

C语言的内存分配:malloc和free

使用库函数分配和管理内存。在运行时,分配更多的内存给程序使用,主要工具是malloc函数,这个函数接受一个参数:所需要要的内存字节数。malloc函数会找到合适的空闲内存块,这样的内存是匿名的,即malloc分配了…

商贸物流产业大脑:智能化驱动,赋能商贸物流高效运营

商贸物流产业大脑:智能化驱动,赋能商贸物流高效运营 在数字化转型的浪潮中,商贸物流行业正面临着效率提升、成本控制、服务质量优化等多重挑战。作为全国领先的综合技术解决方案提供商,临沂呆马区块链网络科技有限公司&#xff0…

Python Django系列—入门实例(二)

数据库配置 现在,打开 mysite/settings.py 。这是个包含了 Django 项目设置的 Python 模块。 默认情况下,​ DATABASES 配置使用 SQLite。如果你是数据库新手,或者只是想尝试 Django,这是最简单的选择。SQLite 包含在 Python 中…

leetcode hot100-34 合并K个升序链表

方法一:分治法(相当于对暴力法的优化) class Solution { private:ListNode* mergeTwoLists(ListNode* list1, ListNode* list2) {ListNode* dummyhead new ListNode(0);ListNode* cur dummyhead;while (list1 && list2) {if (list…

bpmn.js + Node.js_构建高效的后端工作流处理系统

1. 引言 1.1 研究背景与意义 随着企业业务的复杂化,传统的流程管理工具已难以满足需求。BPMN(Business Process Model and Notation)作为一种标准化的流程建模语言,结合 bpmn.js 和 Node.js 可以实现高效的工作流管理系统,提升企业的运营效率。 1.3 BPMN 和 bpmn.js 简…

最新版本Exoplayer(MediaX)实现K歌原伴唱包括单音轨和双音轨

在做K歌类项目中,原伴唱切换是必不可少的基础功能,一般一首完整的歌曲要包含MV视频原唱音频伴唱音频歌词。 而原伴唱音频有两种形式: 1.双音轨:音轨一是原唱,音轨二是伴唱 2.单音轨:左声道是原唱&#x…