首页 > 编程语言 >OpenCV Python 深度指南

OpenCV Python 深度指南

时间:2024-09-18 08:54:48浏览次数:3  
标签:指南 img Python frame cap cv2 OpenCV 图像

OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,它包含了大量的图像处理和机器视觉算法。OpenCV支持多种编程语言,包括C++和Python,其中Python接口因其易用性和灵活性而受到广泛欢迎。
在这里插入图片描述
本指南将覆盖以下几个方面:

  1. OpenCV简介
  2. OpenCV安装与配置
  3. 图像基础
  4. 视频处理
  5. 图像处理
    • 颜色空间转换
    • 边缘检测
    • 图像平滑
    • 图像形态学
  6. 特征检测与描述
  7. 高级应用
    • 人脸识别
    • 目标检测
  8. 性能优化技巧
  9. 结论

1. OpenCV简介

1.1 开发历史

OpenCV是由Intel在1999年开始的一个项目,后来被Itseez公司接手,目前由其维护。Itseez被Autodesk收购后,OpenCV继续作为开源项目发展。

1.2 主要特性

  • 跨平台:支持Windows、Linux、Mac OS X等操作系统。
  • 免费开源:遵循BSD许可,允许商业和研究用途。
  • 丰富的功能:包括图像处理、视频分析、模式识别、机器学习等。
  • 高性能:利用多线程、硬件加速等技术提高性能。

1.3 架构

核心模块
  • core:基本运算和数据结构。
  • imgproc:图像处理函数。
  • highgui:GUI操作,如窗口管理、图像和视频捕获。
附加模块
  • features2d:特征检测和描述。
  • objdetect:目标检测。
  • calib3d:相机校准和3D重建。
  • ml:机器学习算法。
第三方插件
  • dnn:深度神经网络支持。
  • stereo:立体视觉。

2. OpenCV安装与配置

2.1 Python环境

确保已经安装了Python,并且版本为3.x。

2.2 安装OpenCV

通过pip安装OpenCV的Python接口:
pip install opencv-python
安装额外模块

某些高级功能可能需要额外的模块:

pip install opencv-contrib-python

2.3 测试安装

创建一个简单的Python脚本来测试安装是否成功:

import cv2

# 加载一张图像
image = cv2.imread('path/to/image.jpg')

# 显示图像
cv2.imshow('Image', image)
cv2.waitKey(0)
cv2.destroyAllWindows()

3. 图像基础

3.1 读取和显示图像

import cv2
import numpy as np

# 读取图像
img = cv2.imread('path/to/image.jpg')

# 显示图像
cv2.imshow('Image', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

3.2 保存图像

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

3.3 图像属性

# 获取图像尺寸
height, width, channels = img.shape

# 获取像素值
pixel_value = img[100, 100]

# 修改像素值
img[100, 100] = [255, 0, 0]  # 设置为红色

3.4 图像切片

# 获取图像的一部分
roi = img[50:150, 50:150]

3.5 图像缩放

resized_img = cv2.resize(img, (new_width, new_height))

3.6 图像旋转

height, width = img.shape[:2]
center = (width / 2, height / 2)
angle = 45
scale = 1.0

rotation_matrix = cv2.getRotationMatrix2D(center, angle, scale)
rotated_img = cv2.warpAffine(img, rotation_matrix, (width, height))

3.7 图像裁剪与拼接

# 裁剪图像
top_left = (50, 50)
bottom_right = (200, 200)
cropped_image = img[top_left[1]:bottom_right[1], top_left[0]:bottom_right[0]]

# 拼接图像
combined_image = np.hstack((img, cropped_image))

3.8 图像翻转

# 水平翻转
flipped_horizontal = cv2.flip(img, 1)

# 垂直翻转
flipped_vertical = cv2.flip(img, 0)

4. 视频处理

4.1 从文件读取视频

cap = cv2.VideoCapture('path/to/video.mp4')

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

4.2 从摄像头读取视频

cap = cv2.VideoCapture(0)  # 使用默认摄像头

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
cv2.destroyAllWindows()

4.3 视频录制

fourcc = cv2.VideoWriter_fourcc(*'XVID')
out = cv2.VideoWriter('output.avi', fourcc, 20.0, (width, height))

while cap.isOpened():
    ret, frame = cap.read()
    if not ret:
        break
    
    out.write(frame)
    cv2.imshow('Video', frame)
    if cv2.waitKey(1) & 0xFF == ord('q'):
        break

cap.release()
out.release()
cv2.destroyAllWindows()

4.4 视频帧率调整

cap = cv2.VideoCapture('path/to/video.mp4')

fps = cap.get(cv2.CAP_PROP_FPS)
print(f"Original FPS: {fps}")

# 调整帧率为30
cap.set(cv2.CAP_PROP_FPS, 30)

# 检查新的帧率
new_fps = cap.get(cv2.CAP_PROP_FPS)
print(f"New FPS: {new_fps}")

在这里插入图片描述

5. 图像处理

5.1 颜色空间转换

# RGB to Grayscale
gray_img = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# RGB to HSV
hsv_img = cv2.cvtColor(img, cv2.COLOR_BGR2HSV)

# RGB to LAB
lab_img = cv2.cvtColor(img, cv2.COLOR_BGR2LAB)

5.2 边缘检测

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

5.3 图像平滑

# 使用均值滤波
blur = cv2.blur(img, (5, 5))

# 使用高斯模糊
gaussian_blur = cv2.GaussianBlur(img, (5, 5), 0)

# 使用中值滤波
median_blur = cv2.medianBlur(img, 5)

# 使用双边滤波
bilateral_blur = cv2.bilateralFilter(img, 9, 75, 75)

5.4 图像形态学

kernel = cv2.getStructuringElement(cv2.MORPH_RECT, (5, 5))
erosion = cv2.erode(img, kernel, iterations=1)
dilation = cv2.dilate(img, kernel, iterations=1)

opening = cv2.morphologyEx(img, cv2.MORPH_OPEN, kernel)
closing = cv2.morphologyEx(img, cv2.MORPH_CLOSE, kernel)

5.5 图像分割

# 使用简单的阈值分割
_, thresh = cv2.threshold(gray_img, 0, 255, cv2.THRESH_BINARY_INV + cv2.THRESH_OTSU)

# 使用分水岭算法
sure_bg = cv2.dilate(thresh, kernel, iterations=3)
dist_transform = cv2.distanceTransform(thresh, cv2.DIST_L2, 5)
ret, sure_fg = cv2.threshold(dist_transform, 0.7*dist_transform.max(), 255, 0)
sure_fg = np.uint8(sure_fg)
unknown = cv2.subtract(sure_bg, sure_fg)
ret, markers = cv2.connectedComponents(sure_fg)
markers = markers + 1
markers[unknown==255] = 0
markers = cv2.watershed(img, markers)
img[markers == -1] = [255, 0, 0]

5.6 图像融合

# 使用加权融合
alpha = 0.5
beta = 1 - alpha
merged_image = cv2.addWeighted(img1, alpha, img2, beta, 0)

6. 特征检测与描述

6.1 SIFT (Scale-Invariant Feature Transform)

sift = cv2.SIFT_create()
keypoints, descriptors = sift.detectAndCompute(img, None)

6.2 SURF (Speeded Up Robust Features)

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

6.3 ORB (Oriented FAST and Rotated BRIEF)

orb = cv2.ORB_create()
keypoints, descriptors = orb.detectAndCompute(img, None)

6.4 特征匹配

# 创建BFMatcher对象
bf = cv2.BFMatcher(cv2.NORM_L2, crossCheck=True)

# 匹配描述符
matches = bf.match(descriptors1, descriptors2)

# 排序匹配结果
matches = sorted(matches, key=lambda x: x.distance)

# 绘制匹配结果
result_img = cv2.drawMatches(img1, keypoints1, img2, keypoints2, matches[:10], None, flags=cv2.DrawMatchesFlags_NOT_DRAW_SINGLE_POINTS)

6.5 特征点追踪

# 光流追踪
prev_gray = cv2.cvtColor(prev_frame, cv2.COLOR_BGR2GRAY)
next_gray = cv2.cvtColor(next_frame, cv2.COLOR_BGR2GRAY)

# 初始化特征点
prev_pts = cv2.goodFeaturesToTrack(prev_gray, maxCorners=100, qualityLevel=0.3, minDistance=7)

# 计算光流
next_pts, status, err = cv2.calcOpticalFlowPyrLK(prev_gray, next_gray, prev_pts, None)

# 追踪有效特征点
good_new = next_pts[status == 1]
good_old = prev_pts[status == 1]

6.6 特征点可视化

# 在图像上绘制特征点
for i, (new, old) in enumerate(zip(good_new, good_old)):
    a, b = new.ravel()
    c, d = old.ravel()
    mask = cv2.line(mask, (a, b), (c, d), (0, 255, 0), 2)
    frame = cv2.circle(frame, (a, b), 5, (0, 0, 255), -1)
img = cv2.add(frame, mask)

7. 高级应用

7.1 人脸识别

face_cascade = cv2.CascadeClassifier(cv2.data.haarcascades + 'haarcascade_frontalface_default.xml')

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), (255, 0, 0), 2)

7.2 目标检测

# 使用YOLO v3
net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')

blob = cv2.dnn.blobFromImage(img, 1/255, (416, 416), swapRB=True, crop=False)
net.setInput(blob)
outs = net.forward(net.getUnconnectedOutLayersNames())

class_ids = []
confidences = []
boxes = []

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, center_y, w, h = (detection[0:4] * np.array([img.shape[1], img.shape[0], img.shape[1], img.shape[0]])).astype('int')
            x, y = center_x - w // 2, center_y - h // 2
            boxes.append([x, y, w, h])
            confidences.append(float(confidence))
            class_ids.append(class_id)

indexes = cv2.dnn.NMSBoxes(boxes, confidences, 0.5, 0.4)
colors = np.random.uniform(0, 255, size=(len(class_ids), 3))

for i in range(len(boxes)):
    if i in indexes:
        x, y, w, h = boxes[i]
        label = str(classes[class_ids[i]])
        color = colors[i]
        cv2.rectangle(img, (x, y), (x + w, y + h), color, 2)
        cv2.putText(img, label, (x, y - 5), cv2.FONT_HERSHEY_SIMPLEX, 0.5, color, 2)

7.3 深度估计

# 使用立体匹配
stereo = cv2.StereoBM_create(numDisparities=16, blockSize=15)
disparity = stereo.compute(left_img, right_img)
depth = cv2.filterSpeckles(disparity, -1, 50, 2000)

8. 性能优化技巧

8.1 使用NumPy进行高效操作

# NumPy操作通常比OpenCV操作更快
mean = np.mean(img, axis=(0, 1))

8.2 减少不必要的内存复制

# 直接访问图像数据而不是复制
roi = img[50:150, 50:150, :]

8.3 并行处理

from concurrent.futures import ThreadPoolExecutor

def process_frame(frame):
    # 处理单个帧
    pass

frames = [...]  # 假设这是一个包含多个帧的列表
with ThreadPoolExecutor(max_workers=4) as executor:
    results = [executor.submit(process_frame, frame) for frame in frames]
    processed_frames = [future.result() for future in results]

8.4 GPU加速

# 使用cuDNN进行GPU加速
net.setPreferableBackend(cv2.dnn.DNN_BACKEND_CUDA)
net.setPreferableTarget(cv2.dnn.DNN_TARGET_CUDA)

8.5 缓存中间结果

# 缓存计算结果
cache = {}

def get_processed_image(image_name):
    if image_name in cache:
        return cache[image_name]
    else:
        img = cv2.imread(image_name)
        processed_img = ...  # 处理图像
        cache[image_name] = processed_img
        return processed_img

9. 结论

本文深入介绍了OpenCV的基本使用方法和一些高级功能。OpenCV是一个非常强大的工具,适用于各种计算机视觉任务。通过学习本文介绍的内容,您可以开始探索OpenCV的强大功能,并将它们应用到实际项目中。

标签:指南,img,Python,frame,cap,cv2,OpenCV,图像
From: https://blog.csdn.net/suifengme/article/details/141365032

相关文章

  • Python OpenCV精讲系列 - 高级图像处理技术(七)
    ......
  • Python 进阶 03 网络编程
    网络编程概述网络编程,又称套接字编程(Socket编程),是实现不同计算机上运行的程序间进行数据交互的关键技术。它允许程序通过网络发送和接收数据,无论这些程序是运行在同一台机器上还是分布在不同地理位置的计算机上。网络编程是现代软件开发中不可或缺的一部分,广泛应用于Web开发、......
  • DDoS 攻击与防护(二):DDoS 防护购买和使用入门指南,DDoS 防护服务有哪些应用场景?_ddos攻击
    前文回顾:《DDoS攻击与防护(一):如何识别DDoS攻击?DDoS防护ADS服务有哪些?》声明:本文由作者“白鹿第一帅”于CSDN社区原创首发,未经作者本人授权,禁止转载!爬虫、复制至第三方平台属于严重违法行为,侵权必究。亲爱的读者,如果你在第三方平台看到本声明,说明本文内容已被窃取,内......
  • 周也带你进阶OpenCV (1)--采样、直方图即均衡化、掩膜
    文章目录OpenCV高阶操作一、上、下采样1.上采样2.下采样3.恢复原图二、直方图1.plt.hist()绘图2.cv2.calcHist()绘图三、mask掩膜1.原图2.创建黑白图像3.掩膜4.绘制曲线图四、直方图均衡化1.直方图均衡化2.自适应直方图均衡化(局部直方图处理)总结......
  • 基于python+Django的学生成绩管理系统(源码+vue+前后端分离)
    收藏关注不迷路!!......
  • 全面掌握 Jest:从零开始的测试指南(上篇)
    随着JavaScript在前后端开发中的广泛应用,测试已成为保证代码质量的关键环节。为什么需要单元测试在我们的开发过程中,经常需要定义一些算法函数,例如将接口返回的数据转换成UI组件所需的格式。为了校验这些算法函数的健壮性,部分开发同学可能会手动定义几个输入样本进行初步校验,一......
  • 想转行AI大模型开发工程师?这本书是你的必读指南!!!《AI大模型开发之路》
     当前最热门的技术无疑是AI大模型。虽然它的应用前景广阔,但真正精通大模型技术的人还不多。然而,市场对大模型的需求却在不断增长,吸引了不少开发者想要转行进入这个领域。然而,面对新技术,许多人心中充满疑虑,担心自己无法掌握。笔者也是充满疑虑,然后直到我看到这本书籍,感觉受益匪......
  • 10_Python流程控制_循环
    循环循环是控制程序重复执行特定代码块的关键结构。Python提供了几种不同的循环结构,以满足不同的编程需求。While循环while循环会重复执行一个代码块,只要指定的条件为真。适用情况:不清楚具体的循环次数,或者当条件一直为真时一般用while。注意:条件中的变量在while迭代......
  • Python脚本生成可执行文件
    将python文件生产可执行文件,可以在其他不同的环境下使用,即使没有安装python的环境也可以使用,避免了python文件或脚本需要在安装了python的环境下才能使用,提高了便利性一.安装pyinstaller    将python脚本生成可执行文件,需要通过pyinstaller工具,需提前安装,安装方法为......
  • D10【python接口自动化学习】-python基础之内置数据类型
    day10列表学习日期:20240917学习目标:内置数据类型--列表:如何处理同类数据?学习笔记:列表的定义创建列表#创建列表colours=['red','blue','green']print(colours)#将列表打印出来['red','blue','green']print(type(colours))#<class&#......