Python OpenCV 深入理解(二)

引言

OpenCV(Open Source Computer Vision Library)是一个用于计算机视觉的开源软件库。它提供了大量的图像处理和机器视觉功能,支持多种编程语言,其中Python接口因其易用性和快速原型设计能力而受到广泛欢迎。本文将详细介绍如何使用Python结合OpenCV进行计算机视觉开发。
在这里插入图片描述

OpenCV 简介

安装 OpenCV

在开始之前,首先需要安装 OpenCV。可以通过 pip 命令来安装:

pip install opencv-python

如果还需要图形界面支持,可以安装额外的包:

pip install opencv-python-headless

导入 OpenCV

使用以下命令导入 OpenCV 库:

import cv2

基础操作

读取图像

读取图像文件非常简单:

image = cv2.imread('path/to/image.jpg')

显示图像

使用 imshow 函数显示图像:

cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

写入图像

保存处理后的图像:

cv2.imwrite('output_image.jpg', image)

图像处理

图像变换

缩放

使用 resize 函数缩放图像:

new_width, new_height = 320, 240
resized_image = cv2.resize(image, (new_width, new_height))
旋转

使用 getRotationMatrix2DwarpAffine 进行旋转:

height, width = image.shape[:2]
center = (width // 2, height // 2)
angle = 45
scale = 1.0
rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_image = cv2.warpAffine(image, rotation_matrix, (width, height))

图像滤波

均值滤波

使用均值滤波平滑图像:

blurred_image = cv2.blur(image, (5, 5))
高斯滤波

使用高斯滤波器减少噪声:

gaussian_blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
中值滤波

使用中值滤波器去除椒盐噪声:

median_blurred_image = cv2.medianBlur(image, 5)

图像分割

背景减除

使用背景减除器从视频流中分离前景:

fgbg = cv2.createBackgroundSubtractorMOG2()
fgmask = fgbg.apply(frame)
阈值分割

使用阈值分割提取特定颜色区域:

gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
ret, thresh_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)

图像增强

对比度调整

使用直方图均衡化增强对比度:

equalized_image = cv2.equalizeHist(gray_image)
彩色平衡

使用色彩空间转换进行颜色校正:

hsv_image = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)

特征检测

边缘检测

Canny 边缘检测

使用 Canny 边缘检测算法:

edges = cv2.Canny(image, threshold1=100, threshold2=200)

特征点检测

SIFT 特征检测

使用 SIFT(Scale-Invariant Feature Transform)特征检测:

sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(gray_image, None)
SURF 特征检测

使用 SURF(Speeded Up Robust Features)特征检测:

surf = cv2.xfeatures2d.SURF_create(400)
keypoints, descriptors = surf.detectAndCompute(gray_image, None)

特征匹配

使用特征匹配找到图像之间的对应关系:

matcher = cv2.BFMatcher()
matches = matcher.match(descriptors1, descriptors2)

目标检测

Haar 分类器

使用预训练的 Haar 分类器检测人脸:

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')
faces = face_cascade.detectMultiScale(gray_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))

深度学习模型

使用预训练的深度学习模型进行对象检测:

net = cv2.dnn.readNetFromTensorflow('frozen_inference_graph.pb', 'ssd_mobilenet_v2_coco_2018_03_29.pbtxt')
blob = cv2.dnn.blobFromImage(image, size=(300, 300), swapRB=True, crop=False)
net.setInput(blob)
detections = net.forward()

视频处理

在这里插入图片描述

读取视频

读取视频文件:

video_capture = cv2.VideoCapture('path/to/video.mp4')while True:ret, frame = video_capture.read()if not ret:break# 处理帧cv2.imshow('Video', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo_capture.release()
cv2.destroyAllWindows()

写入视频

保存处理后的视频:

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output_video.avi', fourcc, 20.0, (width, height))while True:ret, frame = video_capture.read()if not ret:breakout.write(frame)video_capture.release()
out.release()

图像识别与分类

使用预训练模型

使用预训练的模型进行图像分类:

model = cv2.dnn.readNetFromCaffe('deploy.prototxt.txt', 'res10_300x300_ssd_iter_140000.caffemodel')
blob = cv2.dnn.blobFromImage(image, 1.0, (300, 300), (104.0, 177.0, 123.0))
model.setInput(blob)
predictions = model.forward()

实际应用案例

人脸识别系统

构建一个人脸识别系统,使用 Haar 分类器检测人脸,并使用特征匹配验证身份:

def recognize_faces(image):gray = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)faces = face_cascade.detectMultiScale(gray, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))for (x, y, w, h) in faces:roi_gray = gray[y:y+h, x:x+w]keypoints = face_detector.detect(roi_gray)if len(keypoints) > 0:# 特征匹配逻辑passrecognize_faces(image)

交通标志识别

使用颜色过滤和形状检测识别交通标志:

def detect_traffic_signs(image):hsv = cv2.cvtColor(image, cv2.COLOR_BGR2HSV)mask = cv2.inRange(hsv, lower_red, upper_red)contours, _ = cv2.findContours(mask, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)for contour in contours:approx = cv2.approxPolyDP(contour, 0.01 * cv2.arcLength(contour, True), True)if len(approx) == 3 or len(approx) == 4:# 三角形或矩形标志passdetect_traffic_signs(image)

性能优化

并行处理

使用多线程或多进程加速图像处理:

from concurrent.futures import ThreadPoolExecutordef process_image(image):# 图像处理逻辑passwith ThreadPoolExecutor(max_workers=4) as executor:results = list(executor.map(process_image, images))

GPU 加速

使用 GPU 加速深度学习任务:

net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

结论

本文提供了使用 Python 结合 OpenCV 进行计算机视觉开发的基础和一些高级技巧。OpenCV 是一个功能强大的库,适合各种复杂的应用场景。希望本文能帮助你更好地理解如何利用 OpenCV 来解决实际问题。


附录:常见问题解答

Q: 如何安装特定版本的 OpenCV?

可以使用以下命令安装指定版本的 OpenCV:

pip install opencv-python==version_number

Q: 如何检查 OpenCV 的版本?

可以通过以下方式检查 OpenCV 的版本:

print(cv2.__version__)

Q: 如何获取图像的高度和宽度?

可以使用 shape 属性获取图像的高度和宽度:

height, width = image.shape[:2]

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/416070.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

基于OMS构建OceanBase容灾双活架构的实践

在实际生产环境中,对于关键业务,往往会有容灾双活的需求。除了OceanBase提供的主备库能力,通过官方工具OMS也可以实现容灾双活架构。目前,通过OMS实现的双活架构仅支持OceanBase数据库之间的数据同步。 要通过OMS实现双活架构&am…

合宙LuatOS开发板Core_Air780EP使用说明

Core-Air780EP 开发板是合宙通信推出的基于 Air780EP 模组所开发的, 包含电源,SIM卡,USB,天线,音频等必要功能的最小硬件系统。 以方便用户在设计前期对 Air780EP模块进行性能评估,功能调试,软…

快速学习GO语言总结

干货分享,感谢您的阅读!备注:本博客将自己初步学习GO的总结进行分享,希望大家通过本博客可以在短时间内快速掌握GO的基本程序编码能力,如有错误请留言指正,谢谢! 一、初步了解Go语言 &#xf…

基于约束大于规范的想法,封装缓存组件

架构?何谓架构?好像并没有一个准确的概念。以前我觉得架构就是搭出一套完美的框架,可以让其他开发人员减少不必要的代码开发量;可以完美地实现高内聚低耦合的准则;可以尽可能地实现用最少的硬件资源,实现最高的程序效率…

职业院校如何建设人工智能实训室

随着人工智能(AI)技术的快速发展,越来越多的职业院校开始意识到培养具备AI技能的人才的重要性。为了让学生能够在实践中学习,职业院校需要建立能够支持实际操作的人工智能实训室。本文将探讨职业院校应该如何规划和建设一个高效且…

大模型产品经理学习路线,2024最新,从零基础入门到精通,非常详细收藏我这一篇

随着人工智能技术的发展,尤其是大模型(Large Model)的兴起,越来越多的企业开始重视这一领域的投入。作为大模型产品经理,你需要具备一系列跨学科的知识和技能,以便有效地推动产品的开发、优化和市场化。以下…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 09部署OSPF

本章的目的是帮助网络工程师确定网络的理想 OSPF 配置。本章将回答以下问题 应何时在数据中使用OSPF ?配置 OSPF 的关键设计原则是什么?OSPFv2 和 OSPFv3 之间有什么区别,应如何使用?如何在路由协议栈中配置 OSPF ?如何在服务器上配置 OSPF,例如为容…

Electron 项目实战 03: 实现一个截图功能

实现效果 实现思路 创建两个window,一个叫mainWindow,一个叫cutWindowmainWindow:主界面用来展示截图结果cutWindow:截图窗口,加载截图页面和截图交互逻辑mainWindow 页面点击截图,让cutWIndow 来实现具体…

‌智慧公厕:城市文明的智慧新篇章‌@卓振思众

在日新月异的城市化进程中,公共设施的智能化升级已成为不可逆转的趋势。其中,智慧公厕作为城市智慧化建设的重要组成部分,正悄然改变着我们的生活。智慧公厕,这一融合了物联网、大数据、云计算等现代信息技术的创新产物&#xff0…

Django Admin管理后台导入CSV

修改管理模型,代码如下: class CsvImportForm(forms.Form):csv_file forms.FileField() admin.register(Hero) class HeroAdmin(admin.ModelAdmin, ExportCsvMixin):...change_list_template "entities/heroes_changelist.html"def get_url…

Opencv中的直方图(2)计算图像的直方图函数calcHist()的使用

操作系统:ubuntu22.04 OpenCV版本:OpenCV4.9 IDE:Visual Studio Code 编程语言:C11 算法描述 计算一组数组的直方图。 函数 cv::calcHist 计算一个或多个数组的直方图。用于递增直方图bin的元组的元素是从相同位置的相应输入数组中获取的。…

MATLAB中cond函数用法

目录 语法 说明 示例 矩阵的条件数 1-范数条件数 cond函数的功能是返回逆运算的条件数。 语法 C cond(A) C cond(A,p) 说明 C cond(A) 返回 2-范数逆运算的条件数,等于 A 的最大奇异值与最小奇异值之比。 C cond(A,p) 返回 p-范数条件数,其中…

虚幻地形高度图生成及测试

虚幻地形高度图生成及测试 虚幻引擎地形系统将高度数据存储在高度图中,这是一个灰阶图像,使用黑白色值来存储地貌高程。在高度图中,纯黑色值表示最低点,纯白色值表示最高点。支持16位灰阶PNG、8位灰阶r8及16位灰阶r16格式。 本文…

C++设计模式——Template Method模板方法模式

一,模板方法模式的定义 模板方法模式是一种行为型设计模式,它先定义了一个算法的大致框架,然后将算法的具体实现步骤分解到多个子类中。 模板方法模式为算法设计了一个抽象的模板,算法的具体代码细节由子类来实现,从…

springboot高校实验室教学管理系统的设计和实现

基于springbootvue高校实验室教学管理系统的设计和实现(源码L文ppt)4-045 4 系统总体设计 此次高校实验室教学管理系统通过springboot框架。springboot适合快速构建Web应用。springboot将B/S设计模式中的视图分成了View模块和Template模块两部分,将动态的逻辑处理…

传统CV算法——基于opencv的答题卡识别判卷系统

基于OpenCV的答题卡识别系统,其主要功能是自动读取并评分答题卡上的选择题答案。系统通过图像处理和计算机视觉技术,自动化地完成了从读取图像到输出成绩的整个流程。下面是该系统的主要步骤和实现细节的概述: 1. 导入必要的库 系统首先导入…

亚信安全荣获“2024年网络安全优秀创新成果大赛”优胜奖

近日,由中央网信办网络安全协调局指导、中国网络安全产业联盟(CCIA)主办的“2024年网络安全优秀创新成果大赛”评选结果公布。亚信安全信舱ForCloud荣获“创新产品”优胜奖,亚信安全“宁波市政务信息化网络数据安全一体化指挥系统…

C语言 | Leetcode C语言题解之第392题判断子序列

题目&#xff1a; 题解&#xff1a; bool isSubsequence(char* s, char* t) {int n strlen(s), m strlen(t);int f[m 1][26];memset(f, 0, sizeof(f));for (int i 0; i < 26; i) {f[m][i] m;}for (int i m - 1; i > 0; i--) {for (int j 0; j < 26; j) {if (t…

初级python代码编程学习----简单的图形化聊天工具

创建一个图形化的聊天工具通常需要使用编程语言和图形用户界面库。以下是一个使用Python和Tkinter库创建的基本图形化聊天工具的代码示例&#xff1a; 代码 import tkinter as tk from tkinter import scrolledtext # 创建主窗口 root tk.Tk() root.title("图形化聊天…

Echarts 绘制地图省、市、区、县(以及点击显示下级,支持坐标定位)

** Echarts 绘制地图省、市、区、县&#xff08;以及点击显示下级&#xff0c;支持坐标定位&#xff09; ** 上代码 <template><div class"mapCont"><div id"mapSelf" contextmenu.prevent"disableContextMenu"></div&g…