OpenCV算法使用案例全解

前言

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉和机器学习软件库,它提供了大量的图像和视频处理功能。从简单的图像滤波到复杂的三维重建,OpenCV涵盖了计算机视觉领域的众多算法。本文将详细介绍OpenCV中常见算法的使用案例,帮助读者更好地理解和应用这些强大的工具。

一、图像处理基础

(一)滤波操作

滤波是图像处理中最基本的操作之一,用于去除噪声、平滑图像或突出图像的某些特征。常见的滤波方法包括高斯滤波和中值滤波。

案例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.png')# 高斯滤波
blur = cv2.GaussianBlur(img, (5, 5), 0)# 中值滤波
median = cv2.medianBlur(img, 5)# 展示结果
cv2.imshow('Original Image', img)
cv2.imshow('Gaussian Blur', blur)
cv2.imshow('Median Blur', median)
cv2.waitKey(0)
cv2.destroyAllWindows()​

(二)边缘检测

边缘检测是图像分析中的重要步骤,用于提取图像中物体的轮廓。常见的边缘检测方法包括Canny边缘检测、Laplacian边缘检测和Sobel边缘检测。

案例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# Canny边缘检测
edges = cv2.Canny(img, 100, 200)# Laplacian边缘检测
laplacian = cv2.Laplacian(img, cv2.CV_64F)# Sobel边缘检测
sobelx = cv2.Sobel(img, cv2.CV_64F, 1, 0, ksize=5)
sobely = cv2.Sobel(img, cv2.CV_64F, 0, 1, ksize=5)
sobel = cv2.addWeighted(sobelx, 0.5, sobely, 0.5, 0)# 展示结果
cv2.imshow('Original Image', img)
cv2.imshow('Canny Edge Detection', edges)
cv2.imshow('Laplacian Edge Detection', laplacian)
cv2.imshow('Sobel Edge Detection', sobel)
cv2.waitKey(0)
cv2.destroyAllWindows()

(三)形态学操作

形态学操作用于处理图像的形状,常见的操作包括膨胀、腐蚀、开运算和闭运算。

案例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 创建结构元素
kernel = np.ones((5, 5), np.uint8)# 膨胀操作
dilation = cv2.dilate(img, kernel, iterations=1)# 腐蚀操作
erosion = cv2.erode(img, kernel, iterations=1)# 开运算
opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)# 闭运算
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)# 展示结果
cv2.imshow('Original Image', img)
cv2.imshow('Dilation', dilation)
cv2.imshow('Erosion', erosion)
cv2.imshow('Opening', opening)
cv2.imshow('Closing', closing)
cv2.waitKey(0)
cv2.destroyAllWindows()

二、特征提取与匹配

(一)SIFT特征提取

SIFT(尺度不变特征变换)是一种经典的特征提取算法,用于提取图像中的关键点和描述符。

案例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 初始化SIFT检测器
sift = cv2.SIFT_create()# 提取关键点和描述符
kp, des = sift.detectAndCompute(gray, None)# 绘制关键点
img = cv2.drawKeypoints(gray, kp, img, flags=cv2.DRAW_MATCHES_FLAGS_DRAW_RICH_KEYPOINTS)# 展示结果
cv2.imshow('SIFT Features', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)特征点匹配

特征点匹配用于比较两幅图像之间的相似性,常用于图像拼接、目标识别等任务。

案例代码:

import cv2
import numpy as np# 读取两张图像
img1 = cv2.imread('image1.jpg')
img2 = cv2.imread('image2.jpg')
gray1 = cv2.cvtColor(img1, cv2.COLOR_BGR2GRAY)
gray2 = cv2.cvtColor(img2, cv2.COLOR_BGR2GRAY)# 提取特征点和描述符
sift = cv2.SIFT_create()
kp1, des1 = sift.detectAndCompute(gray1, None)
kp2, des2 = sift.detectAndCompute(gray2, None)# 使用FLANN算法进行匹配
FLANN_INDEX_KDTREE = 0
index_params = dict(algorithm=FLANN_INDEX_KDTREE, trees=5)
search_params = dict(checks=50)
flann = cv2.FlannBasedMatcher(index_params, search_params)
matches = flann.knnMatch(des1, des2, k=2)# 筛选好的匹配点
good = []
for m, n in matches:if m.distance < 0.7 * n.distance:good.append(m)# 绘制匹配结果
img_matches = cv2.drawMatches(img1, kp1, img2, kp2, good, None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)
cv2.imshow('Feature Matching', img_matches)
cv2.waitKey(0)
cv2.destroyAllWindows()

三、图像分割与分析

(一)阈值分割

阈值分割是一种简单而有效的图像分割方法,通过设定一个阈值将图像分为前景和背景。

案例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.png', cv2.IMREAD_GRAYSCALE)# 全局阈值分割
ret, thresh1 = cv2.threshold(img, 127, 255, cv2.THRESH_BINARY)# 自适应阈值分割
thresh2 = cv2.adaptiveThreshold(img, 255, cv2.ADAPTIVE_THRESH_MEAN_C, cv2.THRESH_BINARY, 11, 2)# 展示结果
cv2.imshow('Global Thresholding', thresh1)
cv2.imshow('Adaptive Thresholding', thresh2)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)轮廓检测

轮廓检测用于提取图像中物体的边界,常用于目标识别和形状分析。

案例代码:

import cv2
import numpy as np# 读取图像
img = cv2.imread('image.png')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 边缘检测
edges = cv2.Canny(gray, 50, 150)# 查找轮廓
contours, hierarchy = cv2.findContours(edges, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)# 绘制轮廓
cv2.drawContours(img, contours, -1, (0, 255, 0), 3)# 展示结果
cv2.imshow('Contours', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

四、目标检测与识别

(一)人脸检测

人脸检测是计算机视觉中的经典应用,OpenCV提供了基于Haar特征的级联分类器,用于快速检测图像中的人脸。

案例代码:

import cv2# 加载人脸检测分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')# 读取图像
img = cv2.imread('test.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 检测人脸
faces = face_cascade.detectMultiScale(gray, 1.3, 5)# 绘制人脸矩形框
for (x, y, w, h) in faces:cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)# 展示结果
cv2.imshow('Face Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)车牌识别

车牌识别是一种常见的目标识别应用,结合OpenCV和Tesseract OCR可以实现车牌号码的提取。

案例代码:

import cv2
import pytesseract# 读取图像
img = cv2.imread('car.jpg')
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)# 使用高斯模糊去噪
blurred = cv2.GaussianBlur(gray, (5, 5), 0)# 使用Canny边缘检测
edges = cv2.Canny(blurred, 50, 150)# 查找轮廓
contours, _ = cv2.findContours(edges, cv2.RETR_EXTERNAL, cv2.CHAIN_APPROX_SIMPLE)# 遍历轮廓,筛选车牌区域
for contour in contours:# 获取轮廓的边界框x, y, w, h = cv2.boundingRect(contour)aspect_ratio = float(w) / h# 筛选宽高比接近车牌的轮廓if 2 < aspect_ratio < 5:# 提取车牌区域plate = gray[y:y+h, x:x+w]# 使用Tesseract OCR识别车牌号码text = pytesseract.image_to_string(plate, config='--psm 7')print("Detected License Plate Text:", text.strip())# 绘制车牌区域cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.putText(img, text.strip(), (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)# 展示结果
cv2.imshow('License Plate Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

(三)目标跟踪

目标跟踪是计算机视觉中的一个重要应用,用于在视频中跟踪移动目标。OpenCV提供了多种目标跟踪算法,如KCF、MIL等。

案例代码:

import cv2# 初始化目标跟踪器
tracker = cv2.TrackerKCF_create()# 打开视频文件
video = cv2.VideoCapture('video.mp4')# 读取第一帧
ret, frame = video.read()
if not ret:print("Failed to read video")exit()# 选择跟踪目标区域
bbox = cv2.selectROI(frame, False)# 初始化跟踪器
tracker.init(frame, bbox)while True:ret, frame = video.read()if not ret:break# 更新跟踪器success, bbox = tracker.update(frame)if success:# 绘制跟踪框x, y, w, h = [int(v) for v in bbox]cv2.rectangle(frame, (x, y), (x+w, y+h), (0, 255, 0), 2)else:cv2.putText(frame, "Tracking failure detected", (100, 80), cv2.FONT_HERSHEY_SIMPLEX, 0.75, (0, 0, 255), 2)# 显示结果cv2.imshow('Object Tracking', frame)if cv2.waitKey(1) & 0xFF == ord('q'):breakvideo.release()
cv2.destroyAllWindows()

五、三维重建与深度学习

(一)三维重建

三维重建是通过多视角图像恢复场景三维结构的过程。OpenCV提供了立体视觉算法,如StereoBM和StereoSGBM,用于计算深度图。

案例代码:

import cv2
import numpy as np# 读取左右图像
imgL = cv2.imread('left.jpg', cv2.IMREAD_GRAYSCALE)
imgR = cv2.imread('right.jpg', cv2.IMREAD_GRAYSCALE)# 初始化立体匹配算法
stereo = cv2.StereoSGBM_create(minDisparity=0, numDisparities=16*5, blockSize=5)# 计算深度图
disparity = stereo.compute(imgL, imgR)# 归一化深度图
disparity = cv2.normalize(disparity, None, alpha=0, beta=255, norm_type=cv2.NORM_MINMAX, dtype=cv2.CV_8U)# 显示深度图
cv2.imshow('Depth Map', disparity)
cv2.waitKey(0)
cv2.destroyAllWindows()

(二)深度学习与OpenCV

OpenCV支持加载预训练的深度学习模型,如YOLO、SSD等,用于目标检测和分类。

案例代码:

import cv2
import numpy as np# 加载预训练的YOLO模型
net = cv2.dnn.readNet('yolov3.weights', 'yolov3.cfg')# 加载类别名称
with open('coco.names', 'r') as f:classes = f.read().rstrip('\n').split('\n')# 读取图像
img = cv2.imread('image.jpg')
height, width, _ = img.shape# 将图像输入网络
blob = cv2.dnn.blobFromImage(img, 1/255, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
outs = net.forward(net.getUnconnectedOutLayersNames())# 解析检测结果
for out in outs:for detection in out:scores = detection[5:]class_id = np.argmax(scores)confidence = scores[class_id]if confidence > 0.5:center_x = int(detection[0] * width)center_y = int(detection[1] * height)w = int(detection[2] * width)h = int(detection[3] * height)x = int(center_x - w / 2)y = int(center_y - h / 2)cv2.rectangle(img, (x, y), (x+w, y+h), (0, 255, 0), 2)cv2.putText(img, f'{classes[class_id]} {int(confidence * 100)}%', (x, y-10), cv2.FONT_HERSHEY_SIMPLEX, 0.5, (255, 255, 255), 2)# 显示结果
cv2.imshow('Object Detection', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

六、总结

OpenCV作为计算机视觉领域的强大工具,提供了丰富的算法和功能,涵盖了图像处理、特征提取、目标检测、三维重建等多个方面。通过本文的案例,读者可以快速上手OpenCV,并将其应用于实际项目中。无论是初学者还是有一定基础的开发者,都能从OpenCV中找到适合自己的工具和方法。

注意事项:

• 在使用OpenCV时,请确保安装了正确的库版本,并根据需要安装额外的依赖(如Tesseract OCR、YOLO模型等)。

• 本文中的代码仅为示例,实际应用中可能需要根据具体需求进行调整和优化。

• 如果你对某个算法有更深入的需求,可以参考OpenCV官方文档或相关开源项目。

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

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

相关文章

Redis的持久化-RDBAOF

文章目录 一、 RDB1. 触发机制2. 流程说明3. RDB 文件的处理4. RDB 的优缺点 二、AOF1. 使用 AOF2. 命令写⼊3. 文件同步4. 重写机制5 启动时数据恢复 一、 RDB RDB 持久化是把当前进程数据生成快照保存到硬盘的过程&#xff0c;触发 RDB 持久化过程分为手动触发和自动触发。 …

Python Cookbook-2.29 带版本号的文件名

任务 如果你想在改写某文件之前对其做个备份&#xff0c;可以在老文件的名字后面根据惯例加上三个数字的版本号。 解决方案 我们需要编写一个函数来完成备份工作: def VersionFile(file_spec, vtypecopy):import os,shutilif os.path.isfile(file_spec):#检查vtype参数if v…

CCF-CSP认证 202104-1灰度直方图

题目描述 思路 首先输入矩阵长度、矩阵宽度和灰度范围&#xff0c;结果数组长度可固定&#xff0c;其中的元素要初始化为0。在输入灰度值的时候&#xff0c;结果数组中以该灰度值为索引的元素值1&#xff0c;即可统计每个灰度值的数量。 代码 C版&#xff1a; #include <…

水果识别系统 | BP神经网络水果识别系统,含GUI界面(Matlab)

使用说明 代码下载&#xff1a;BP神经网络水果识别系统&#xff0c;含GUI界面&#xff08;Matlab&#xff09; BP神经网络水果识别系统 一、引言 1.1、研究背景及意义 在当今科技迅速发展的背景下&#xff0c;人工智能技术尤其是在图像识别领域的应用日益广泛。水果识别作为…

如何在网页上显示3D CAD PMI

在现代制造业中&#xff0c;3D CAD模型已成为产品设计和制造的核心。为了更有效地传达设计意图和制造信息&#xff0c;产品和制造信息&#xff08;PMI&#xff09;被嵌入到3D模型中。然而&#xff0c;如何在网页上清晰、准确地显示这些3D CAD PMI&#xff0c;成为了一个重要的技…

Git基本命令索引

GIT基本命令索引 创建代码库修改和提交代码日志管理远程操作操作分支 创建代码库 操作指令初始化仓库git init克隆远程仓库git clone 修改和提交代码 操作指令查看文件状态git status文件暂存git add文件比较git diff文件提交git commit回滚版本git reset重命名或者移动工作…

基于Selenium的Python淘宝评论爬取教程

文章目录 前言1. 环境准备安装 Python&#xff1a;安装 Selenium&#xff1a;下载浏览器驱动&#xff1a; 2. 实现思路3. 代码实现4. 代码解释5. 注意事项 前言 以下是一个基于 Selenium 的 Python 淘宝评论爬取教程&#xff0c;需要注意的是&#xff0c;爬取网站数据应当遵守…

GenBI 可视化选谁:Python Matplotlib?HTML ?Tableau?

引言 生成式 BI(Generative BI,GenBI)通过自然语言交互和自动化内容生成,革新了数据分析和商业智能(BI)领域。用户可以通过自然语言提问,GenBI 系统自动生成相应的 SQL 查询、获取数据,并以可视化图表、表格、自然语言摘要等形式呈现分析结果。 可视化是 GenBI 的关键…

java后端开发day24--阶段项目(一)

&#xff08;以下内容全部来自上述课程&#xff09; GUI&#xff1a;Graphical User Interface 图形用户接口&#xff0c;采取图形化的方式显示操作界面 分为两套体系&#xff1a;AWT包&#xff08;有兼容问题&#xff09;和Swing包&#xff08;常用&#xff09; 拼图小游戏…

vmware安装firepower ftd和fmc

在vmware虚拟机中安装cisco firepower下一代防火墙firepower threat defence&#xff08;ftd&#xff09;和管理中心firepower management center&#xff08;fmc&#xff09;。 由于没有cisco官网下载账号&#xff0c;无法下载其中镜像。使用eveng模拟器中的ftd和fmc虚拟镜像…

【Java进阶】java设计模式之单例模式

一、单例设计模式的基本概念 在 Java 编程的广阔天地里&#xff0c;单例设计模式宛如一颗璀璨的明星&#xff0c;是一种极为实用的创建型设计模式。它的核心使命是确保一个类在整个应用程序的生命周期内仅仅存在一个实例&#xff0c;并且为外界提供一个全局唯一的访问点来获取…

011 rocketmq过滤消息

文章目录 过滤消息TAG模式过滤FilterByTagProducer.javaFilterByTagConsumer.java SQL表达式过滤FilterBySQLProducer.javaFilterBySQLConsumer.java 类过滤模式&#xff08;基于4.2.0版本&#xff09; 过滤消息 消息过滤包括基于表达式过滤与基于类模式两种过滤模式。其中表达…

【心得】一文梳理高频面试题 HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别并附加记忆方法

面试时很容易遇到的一个问题—— HTTP 1.0/HTTP 1.1/HTTP 2.0/HTTP 3.0的区别&#xff0c;其实这四个版本的发展实际上是一环扣一环的&#xff0c;是逐步完善的&#xff0c;本文希望帮助读者梳理清楚各个版本之间的区别&#xff0c;并且给出当前各个版本的应用情况&#xff0c;…

大模型部署与调优:从基础到高效优化全解析

大模型部署与调优&#xff1a;从基础到高效优化全解析 1. 引言 随着深度学习的快速发展&#xff0c;大模型&#xff08;Large Models&#xff09; 在自然语言处理&#xff08;NLP&#xff09;、计算机视觉&#xff08;CV&#xff09;、推荐系统等领域的应用日益广泛。然而&am…

小红书app复制短链,分享链接转直接可访问链接

简介&#xff1a;小红书手机app分享的链接需要点击才能获取完成链接&#xff0c;本文教大家如何通过代码的方式将xhs的短连接转化为长链接。 1.正常我们分享的链接是这样的&#xff1a; 44 小猪吃宵夜发布了一篇小红书笔记&#xff0c;快来看吧&#xff01; &#x1f606; KeA…

DeepSeek 助力 Vue3 开发:打造丝滑的弹性布局(Flexbox)

前言&#xff1a;哈喽&#xff0c;大家好&#xff0c;今天给大家分享一篇文章&#xff01;并提供具体代码帮助大家深入理解&#xff0c;彻底掌握&#xff01;创作不易&#xff0c;如果能帮助到大家或者给大家一些灵感和启发&#xff0c;欢迎收藏关注哦 &#x1f495; 目录 Deep…

DeepSeek开源周Day5压轴登场:3FS与Smallpond,能否终结AI数据瓶颈之争?

2025年2月28日&#xff0c;DeepSeek开源周迎来了第五天&#xff0c;也是本次活动的收官之日。自2月24日启动以来&#xff0c;DeepSeek团队以每天一个开源项目的节奏&#xff0c;陆续向全球开发者展示了他们在人工智能基础设施领域的最新成果。今天&#xff0c;他们发布了Fire-F…

SQL AnyWhere 的备份与恢复

目录 一、备份 二、恢复 1、自动恢复 2、映像恢复 3、日志恢复-指定时间点 4、日志恢复-指定偏移 5、完整的恢复流程 6、恢复最佳实践 三、其他操作 1、dbtran 2、SQL Shell 工具 数据库的安装与基本使用内容请参考博客: SAP SQLAnyWhere 17 的安装与基本使用_sql…

入门基础项目(SpringBoot+Vue)

文章目录 1. css布局相关2. JS3. Vue 脚手架搭建4. ElementUI4.1 引入ElementUI4.2 首页4.2.1 整体框架4.2.2 Aside-logo4.2.3 Aside-菜单4.2.4 Header-左侧4.2.5 Header-右侧4.2.6 iconfont 自定义图标4.2.7 完整代码 4.3 封装前后端交互工具 axios4.3.1 安装 axios4.3.2 /src…

unity学习61:UI布局layout

目录 1 布局 layout 1.1 先准备测试UI,新增这样一组 panel 和 image 1.2 新增 vertical layout 1.3 现在移动任意一个image 都会影响其他 1.3.1 对比 如果没有这个&#xff0c;就会是覆盖效果了 1.3.2 对比 如果没有这个&#xff0c;就会是覆盖效果了 1.4 总结&#xf…