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

news2025/2/23 13:19:28

图像处理基础

一、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.coloradmin.cn/o/2303927.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Scrum方法论指导下的Deepseek R1医疗AI部署开发

一、引言 1.1 研究背景与意义 在当今数智化时代,软件开发方法论对于项目的成功实施起着举足轻重的作用。Scrum 作为一种广泛应用的敏捷开发方法论,以其迭代式开发、快速反馈和高效协作的特点,在软件开发领域占据了重要地位。自 20 世纪 90 …

个人环境配置--安装记录

根据显卡下载对应的cuda和cudnn 我使用的是docker,首先拉取镜像,我用的是ubuntu20.04 加速:pull hub.1panel.dev/ devel是开发版本 sudo docker pull hub.1panel.dev/nvidia/cuda:11.6.1-devel-ubuntu20.04先测试一下cuda有没有安装好 nvcc -V更新,安装…

win10把c盘docker虚拟硬盘映射迁移到别的磁盘

c盘空间本身就比较小、如果安装了docker服务后,安装的时候没选择其他硬盘,虚拟磁盘也在c盘会占用很大的空间,像我的就三十多个G,把它迁移到其他磁盘一下子节约几十G 1、先输入下面命令查看 docker 状态 wsl -l -v 2、如果没有停止…

开源的 LLM 应用开发平台-Dify 部署和使用

加粗样式 Dify 简介 官网 http://difyai.com/ 生成式 AI 应用创新引擎 开源的 LLM 应用开发平台 Dify 为开发者提供了健全的应用模版和编排框架,你可以基于它们快速构建大型语言模型驱动的生成式 AI 应用,将创意变为现实,也可以随时按需无…

libxls库的编译以及基于Visual studio的配置

最近有一个需求在windows处理xls,所以就需要libxls这个库,调查了一下,基于C的库的解析情况如下: 所以最理想的就是Libxlsd个开源的方案 基于历史整理的 libxls 在 MinGW 下的编译步骤 前提条件 系统:Windows&#…

抗辐照加固CAN FD芯片的商业航天与车规级应用解析

在工业自动化、智能汽车、航空航天及国防装备等关键领域,数据传输的安全性、可靠性与极端环境适应能力是技术升级的核心挑战。国科安芯推出全新一代CANFD(Controller Area Network Flexible Data Rate)芯片,以高安全、高可靠、断电…

Ollama+Deepseek+AnythingLLM搭建本地知识库

OllamaDeepseek的配置可以参考OllamaDeepseekopen-webui搭建本地知识库-CSDN博客 一,AnythingLLM安装 AnythingLLM官网地址AnythingLLM | The all-in-one AI application for everyone 下载 win64 下载完毕后安装。 二,AnythingLLM 配置 新建工作区 …

再探动态规划--背包问题

背包问题常见类型: 动态规划问题核心就两个:状态转移方程和遍历顺序 如果求组合数就是外层for循环遍历物品,内层for遍历背包。如果求排列数就是外层for遍历背包,内层for循环遍历物品。 状态转移方程是动态规划问题中的核心&…

Javascript使用Sodium库实现 aead_xchacha20poly1305_ietf加密解密,以及与后端的密文交互

Node.js环境安装 sodium-native (其他库可能会出现加密解密失败,如果要使用不一样的库,请自行验证) npm install sodium-native 示例代码,使用的是 sodium-native v4.3.2 (其他版本可能会有变化,如果要使用,请自行验…

【算法与数据结构】单调队列

目录 单调队列 使用单调队列维护滑动窗口 具体过程: 代码实现: 复杂度分析: 使用单调队列优化动态规划 例题 单调队列 单调队列(deque)是一种特殊的队列,队列中的元素始终按严格递增或者递减排列。这样就可以保证队头元素…

Mysql-------事务

事务 一、事务 (一)什么是事务: MySQL数据库事务:(database transaction): 事务是由一组SQL语句组成的逻辑处理单元,这些操作要么全做要么全不做,是一个不可分割的工作单位。 ※…

基于Martin的全国基础底图实现

概述 前面有文章基于Martin实现MapboxGL自定义底图分享了Martin的使用,本文使用网络收集的数据实现了全国基础数据的收集和基础底图。 实现后效果 实现 1. 数据准备 实例中包含如下数据: 边界线和九段线数据省边界面数据省会城市点数据市边界面数据…

网络安全:防范NetBIOS漏洞的攻击

稍微懂点电脑知识的朋友都知道,NetBIOS 是计算机局域网领域流行的一种传输方式,但你是否还知道,对于连接互联网的机器来讲,NetBIOS是一大隐患。 漏洞描述 NetBIOS(Network Basic Input Output System,网络基本输入输…

一周学会Flask3 Python Web开发-客户端状态信息Cookie以及加密

锋哥原创的Flask3 Python Web开发 Flask3视频教程: 2025版 Flask3 Python web开发 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili HTTP是无状态(stateless)协议。也就是说,在一次请求响应结束后,服务器不会留下任何关于对…

机器学习面试八股文——决战金三银四

大家好,这里是好评笔记,公主 号:Goodnote,专栏文章私信限时Free。本笔记的任务是解读机器学习实践/面试过程中可能会用到的知识点,内容通俗易懂,入门、实习和校招轻松搞定。 公主号合集地址 点击进入优惠地…

【Akashic Records】THE EGG

博客主页: [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: Akashic Records 文章目录 💯观后感一、宇宙的孤寂与个人成长:二、选择与责任:三、灵性与世界的连接:四、选择如何改变命运:结语: 💯…

从零开始用react + tailwindcs + express + mongodb实现一个聊天程序(一)

项目包含5个模块 1.首页 (聊天主页) 2.注册 3.登录 4.个人资料 5.设置主题 一、配置开发环境 建立项目文件夹 mkdir chat-project cd chat-project mkdir server && mkdir webcd server npm init cd web npm create vitelatest 创建前端项目时我们选择javascrip…

ant design 疑惑记录 Dropdown.Button

onMenuClick是点击展开的 子项的点击事件 Actions的点击事件是什么? 解答: 也是个按钮Button,也有自己的onClick事件 const onMenuClick (e) > {console.log(click, e); }; const otherClick (e) > {console.log(其他操作主按钮…

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

SAP on Microsoft Azure Architecture and Administration (Ravi Kashyap)

Missing required prop: “maxlength“

背景&#xff1a; 封装一个使用功能相同使用频率较高的input公共组件作为子组件&#xff0c;大多数长度要求为200&#xff0c;且实时显示统计子数&#xff0c;部分input有输入提示。 代码实现如下&#xff1a; <template><el-input v-model"inputValue" t…