OpenCV入门教程:从基础到实战,手把手教你玩转计算机视觉
创作时间:
作者:
@小白创作中心
OpenCV入门教程:从基础到实战,手把手教你玩转计算机视觉
引用
CSDN
1.
https://blog.csdn.net/qq_36287830/article/details/143590917
OpenCV作为开源计算机视觉库的佼佼者,以其丰富的图像处理和计算机视觉功能,广泛应用于图像识别、物体检测、人脸识别等领域。本文将带你从零开始,全面掌握OpenCV的核心概念、安装配置及实际应用,助力你快速入门计算机视觉开发。
什么是OpenCV?
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,支持多种编程语言(如C++、Python、Java等),并在多个平台上可用(如Windows、Linux、macOS)。它提供了大量的图像处理和计算机视觉算法,广泛应用于图像识别、物体检测、人脸识别等领域。
- 图像处理:如图像增强、滤波、边缘检测等。
- 物体检测:如行人检测、车辆检测等。
- 人脸识别:如人脸检测、人脸识别等。
- 视频分析:如运动检测、背景减除等。
安装配置
OpenCV可以通过pip工具轻松安装:
pip install opencv-python
安装完成后,可以通过以下代码验证OpenCV是否安装成功:
import cv2
print(cv2.__version__)
核心功能详解
图像读取与显示
OpenCV提供了读取和显示图像的基本功能:
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像属性与操作
- 形状:获取图像的高度、宽度和通道数。
- 像素值:获取和设置特定像素的值。
# 获取图像的形状
height, width, channels = image.shape
print(f'Height: {height}, Width: {width}, Channels: {channels}')
# 获取特定像素的值
pixel_value = image[100, 100]
print(f'Pixel Value at (100, 100): {pixel_value}')
# 设置特定像素的值
image[100, 100] = [0, 255, 0] # 设置为绿色
图像裁剪与复制
# 裁剪图像
cropped_image = image[50:150, 50:150]
# 复制图像
copied_image = image.copy()
图像转换
将彩色图像转换为灰度图像:
# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 显示灰度图像
cv2.imshow('Grey Image', grey_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像滤波
对图像进行高斯模糊处理:
# 高斯模糊
blurred_image = cv2.GaussianBlur(image, (5, 5), 0)
# 显示模糊图像
cv2.imshow('Blurred Image', blurred_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
边缘检测
使用Canny算法检测图像的边缘:
# 边缘检测
edges = cv2.Canny(image, 100, 200)
# 显示边缘图像
cv2.imshow('Edges', edges)
cv2.waitKey(0)
cv2.destroyAllWindows()
视频处理
视频读取与显示
OpenCV可以读取和显示视频文件:
import cv2
# 读取视频
cap = cv2.VideoCapture('video.mp4')
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 显示帧
cv2.imshow('Frame', frame)
# 按 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
视频录制
OpenCV可以录制视频:
import cv2
# 初始化视频捕获
cap = cv2.VideoCapture(0)
# 定义编码器和输出文件
fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (640, 480))
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 写入帧
out.write(frame)
# 显示帧
cv2.imshow('Frame', frame)
# 按 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
out.release()
cv2.destroyAllWindows()
物体检测
Haar级联分类器
Haar级联分类器是一种常用的物体检测方法,可以用于检测人脸、眼睛等:
import cv2
# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取图像
image = cv2.imread('image.jpg')
# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(grey_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 绘制矩形框
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 显示图像
cv2.imshow('Face Detection', image)
cv2.waitKey(0)
cv2.destroyAllWindows()
特征点检测
SIFT(Scale-Invariant Feature Transform)和 SURF(Speeded-Up Robust Features)是常用的特征点检测算法:
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 初始化 SIFT 检测器
sift = cv2.xfeatures2d.SIFT_create()
# 检测特征点
keypoints, descriptors = sift.detectAndCompute(image, None)
# 绘制特征点
image_with_keypoints = cv2.drawKeypoints(image, keypoints, None)
# 显示图像
cv2.imshow('SIFT Keypoints', image_with_keypoints)
cv2.waitKey(0)
cv2.destroyAllWindows()
图像分割
GrabCut是一种基于图割的图像分割算法,用于从背景中分离前景:
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 初始化掩码
mask = np.zeros(image.shape[:2], np.uint8)
# 定义前景和背景的初始矩形
rect = (50, 50, 300, 300)
# 初始化前景和背景模型
bgd_model = np.zeros((1, 65), np.float64)
fgd_model = np.zeros((1, 65), np.float64)
# 运行 GrabCut 算法
cv2.grabCut(image, mask, rect, bgd_model, fgd_model, 5, cv2.GC_INIT_WITH_RECT)
# 将掩码转换为二值图像
mask2 = np.where((mask==2)|(mask==0), 0, 1).astype('uint8')
# 应用掩码
segmented_image = image * mask2[:, :, np.newaxis]
# 显示分割后的图像
cv2.imshow('Segmented Image', segmented_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
实际应用案例
人脸识别
假设我们有一个包含人脸的照片,需要进行人脸识别:
import cv2
# 加载 Haar 级联分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
# 读取图像
image = cv2.imread('people.jpg')
# 转换为灰度图像
grey_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 检测人脸
faces = face_cascade.detectMultiScale(grey_image, scaleFactor=1.1, minNeighbors=5, minSize=(30, 30))
# 绘制矩形框
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (255, 0, 0), 2)
# 保存结果
cv2.imwrite('detected_faces.jpg', image)
运动目标跟踪
假设我们有一个视频,需要跟踪视频中的移动物体:
import cv2
# 初始化视频捕获
cap = cv2.VideoCapture('video.mp4')
# 初始化背景减除器
fgbg = cv2.createBackgroundSubtractorMOG2()
while cap.isOpened():
ret, frame = cap.read()
if not ret:
break
# 应用背景减除器
fgmask = fgbg.apply(frame)
# 显示帧
cv2.imshow('Frame', frame)
cv2.imshow('FG Mask', fgmask)
# 按 q 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
通过本文,我们深入了解了OpenCV的基本概念、安装配置、核心功能以及实际应用。OpenCV是一个强大的计算机视觉库,提供了丰富的图像处理和计算机视觉功能。希望本文能帮助读者更好地理解和应用OpenCV,提升计算机视觉开发能力。
热门推荐
南北朝时期的开挂皇帝,十六国的终结者——北魏太武帝拓跋焘
干皮和油皮哪个更缺水?
历史的尘埃——职场萌新苏轼在凤翔:白面书生遇黑脸上司
小孩子感冒能吃羊肉吗?看是风寒感冒还是风热感冒!
小孩子感冒能吃羊肉吗?看是风寒感冒还是风热感冒!
大S遗产分配惹关注!孩子的钱能真正留给他们的吗?信托是最佳解方?
案例十:模拟温室环境
魔兽世界WLK惩戒骑命中等级达标要求详解
胃病可以吃柚子吗
黄酒与阿胶的配比原则与使用指南
【夫妻户外拓展】夫妻户外活动有哪些?适合夫妻的有趣户外活动哦
公司无法清偿债务,股东是否需要承担赔偿责任?
钙钛矿叠层电池商业化进程加速
探秘葫芦岛:十大必游景点,解锁北国海滨与千年古韵的奇幻之旅
别乱吃!板蓝根不防病,也不是万能感冒药,这些情况不适用……
32周孕妇发现胎儿双侧脑室增宽该如何处理
垂柳的生长习性与生态特征(探究垂柳是否为落叶植物)
依恋型人格特征及影响,帮助你找出关系中的困难点!
情人节档期上映,新版《呼啸山庄》将如何再现经典?
在SQL中实现API集成的多种方法与最佳实践
压强是标量还是矢量
对比四大历史底部!把握当前A股市场价值方位
400多位百万富翁如何致富?他们使用了这11种策略
临床常用感冒药有哪些?治疗鼻塞、打喷嚏首选哪一种?
科技创新带动柯坪骆驼产业发展步入新赛道
抑郁症与精分症最明显的区别
什么是定向就业?定向就业招生政策详解
王者荣耀刘备打野攻略:蓝开还是红开?
假面骑士:那些令人难忘的雨中场景
老黄历上的今日八字:解读与应用