跳到主要内容
极客日志极客日志面向AI+效率的开发者社区
首页博客GitHub 精选镜像工具UI配色美学隐私政策关于联系
搜索内容 / 工具 / 仓库 / 镜像...⌘K搜索
注册
博客列表
PythonAI算法

计算机视觉基础与实战应用指南

综述由AI生成计算机视觉作为人工智能的关键分支,旨在让机器理解图像。文章涵盖从基础概念到实战开发的全流程,包括图像预处理、增强滤波技术,以及 HOG、SIFT、ORB 等特征提取方法。重点解析了 LeNet、ResNet、YOLO 等经典模型架构,并提供基于 PyTorch 的训练代码与 OpenCV 工具库的使用示例。最后通过一个包含分类与检测功能的桌面应用案例,演示了如何将理论转化为实际可用的系统,适合希望快速掌握 CV 核心技术与工程落地的开发者参考。

全栈工匠发布于 2026/3/14更新于 2026/6/818 浏览
计算机视觉基础与实战应用指南

计算机视觉基础与实战应用

计算机视觉示意图

核心要点

  • 理解计算机视觉的基本概念和重要性
  • 掌握图像处理技术、特征提取方法及常用模型架构
  • 学会使用 OpenCV、PyTorch 等库进行开发
  • 通过实战项目,开发一个完整的计算机视觉应用

主要内容

  • 计算机视觉的基本概念
  • 图像处理技术(预处理、增强、滤波)
  • 特征提取方法(HOG、SIFT、ORB)
  • 常用模型与架构(LeNet、AlexNet、VGG、ResNet、YOLO)
  • 实战项目:计算机视觉应用开发

一、计算机视觉基础

1.1 基本概念

计算机视觉(Computer Vision)是人工智能的重要分支,旨在让计算机能够理解和解释图像内容,实现类似人类视觉的功能。

重要性
  1. 图像理解:识别物体、场景和动作
  2. 目标检测:定位图像中的物体
  3. 图像分类:对图像进行分类和标签化
  4. 语义分割:像素级的分割和标记
  5. 图像生成:生成新的图像内容
应用场景
  • 医疗领域:疾病诊断、医学影像分析
  • 汽车领域:自动驾驶、智能交通系统
  • 安防领域:视频监控、人脸识别
  • 电商领域:产品推荐、图像搜索

1.2 面临的挑战

  1. 图像质量:噪声、模糊等问题
  2. 物体多样性:大小、形状、颜色和姿态的变化
  3. 场景复杂性:光照、背景和遮挡的影响
  4. 数据稀疏性:某些领域数据稀缺
  5. 计算资源:需要大量算力支持

二、图像处理技术

2.1 图像预处理

预处理是 CV 的基础步骤,包括读取、调整尺寸、裁剪等操作。

代码实现

我们先用 OpenCV 看看如何处理这些基本操作:

import cv2
import numpy as np

def read_image(image_path):
    image = cv2.imread(image_path)
    return image

 ():
    cv2.imwrite(output_path, image)

 ():
    resized_image = cv2.resize(image, (width, height))
     resized_image

 ():
    adjusted_image = cv2.convertScaleAbs(image, alpha=alpha, beta=beta)
     adjusted_image

 ():
    cropped_image = image[y:y+height, x:x+width]
     cropped_image

 ():
    (h, w) = image.shape[:]
    center = (w // , h // )
    M = cv2.getRotationMatrix2D(center, angle, )
    rotated_image = cv2.warpAffine(image, M, (w, h))
     rotated_image
def
save_image
image, output_path
def
resize_image
image, width, height
return
def
adjust_brightness_contrast
image, alpha=1.0, beta=0.0
return
def
crop_image
image, x, y, width, height
return
def
rotate_image
image, angle
2
2
2
1.0
return

2.2 图像增强

增强旨在提高图像质量,常见方法有直方图均衡化和平滑滤波。

代码实现
import cv2
import numpy as np

def histogram_equalization(image):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    equalized_image = cv2.equalizeHist(gray_image)
    return equalized_image

def mean_filter(image, kernel_size=3):
    blurred_image = cv2.blur(image, (kernel_size, kernel_size))
    return blurred_image

def gaussian_filter(image, kernel_size=3, sigma=0):
    blurred_image = cv2.GaussianBlur(image, (kernel_size, kernel_size), sigma)
    return blurred_image

def median_filter(image, kernel_size=3):
    blurred_image = cv2.medianBlur(image, kernel_size)
    return blurred_image

2.3 图像滤波

滤波主要用于边缘检测,如 Sobel 算子和 Canny 算法。

代码实现
import cv2
import numpy as np

def sobel_edge_detection(image):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    sobel_x = cv2.Sobel(gray_image, cv2.CV_64F, 1, 0, ksize=3)
    sobel_y = cv2.Sobel(gray_image, cv2.CV_64F, 0, 1, ksize=3)
    sobel_combined = np.sqrt(sobel_x**2 + sobel_y**2)
    sobel_combined = np.uint8(sobel_combined / np.max(sobel_combined) * 255)
    return sobel_combined

def canny_edge_detection(image, threshold1=100, threshold2=200):
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    edges = cv2.Canny(gray_image, threshold1, threshold2)
    return edges

三、特征提取方法

3.1 HOG 特征

HOG(Histogram of Oriented Gradients)通过计算梯度方向直方图提取特征。

import cv2
import numpy as np

def extract_hog_features(image):
    hog = cv2.HOGDescriptor()
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    features = hog.compute(gray_image)
    return features

3.2 SIFT 特征

SIFT(Scale-Invariant Feature Transform)在不同尺度空间检测关键点。

import cv2
import numpy as np

def extract_sift_features(image):
    sift = cv2.SIFT_create()
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    keypoints, descriptors = sift.detectAndCompute(gray_image, None)
    return keypoints, descriptors

3.3 ORB 特征

ORB 结合 FAST 算法检测关键点和 BRIEF 算法计算描述符。

import cv2
import numpy as np

def extract_orb_features(image):
    orb = cv2.ORB_create()
    gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
    keypoints, descriptors = orb.detectAndCompute(gray_image, None)
    return keypoints, descriptors

四、常用模型与架构

4.1 传统机器学习模型

  • 支持向量机:寻找最优超平面分离样本
  • 决策树:构建决策树进行分类
  • 随机森林:组合多个决策树提升性能

4.2 深度学习模型

  • LeNet:早期卷积网络
  • AlexNet:经典深度结构,引入 ReLU
  • VGG:小卷积核加深网络
  • ResNet:残差连接解决梯度消失
  • YOLO:单次前向传播的目标检测

4.3 模型训练示例

这里展示如何使用 PyTorch 微调 ResNet 模型:

import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader
from torchvision import datasets, transforms, models

def train_resnet_model(data_dir, num_classes=2, batch_size=32, num_epochs=10, lr=0.001):
    # 数据预处理
    data_transforms = {
        'train': transforms.Compose([
            transforms.RandomResizedCrop(224),
            transforms.RandomHorizontalFlip(),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ]),
        'val': transforms.Compose([
            transforms.Resize(256),
            transforms.CenterCrop(224),
            transforms.ToTensor(),
            transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
        ])
    }
    
    image_datasets = {x: datasets.ImageFolder(f'{data_dir}/{x}', data_transforms[x]) for x in ['train', 'val']}
    dataloaders = {x: DataLoader(image_datasets[x], batch_size=batch_size, shuffle=True, num_workers=4) for x in ['train', 'val']}
    dataset_sizes = {x: len(image_datasets[x]) for x in ['train', 'val']}
    class_names = image_datasets['train'].classes
    
    # 加载模型
    model = models.resnet18(pretrained=True)
    num_ftrs = model.fc.in_features
    model.fc = nn.Linear(num_ftrs, num_classes)
    
    # 定义损失函数和优化器
    criterion = nn.CrossEntropyLoss()
    optimizer = optim.SGD(model.parameters(), lr=lr, momentum=0.9)
    scheduler = optim.lr_scheduler.StepLR(optimizer, step_size=7, gamma=0.1)
    
    # 训练模型
    for epoch in range(num_epochs):
        print(f'Epoch {epoch}/{num_epochs - 1}')
        print('-' * 10)
        for phase in ['train', 'val']:
            if phase == 'train':
                model.train()
            else:
                model.eval()
            running_loss = 0.0
            running_corrects = 0
            for inputs, labels in dataloaders[phase]:
                optimizer.zero_grad()
                with torch.set_grad_enabled(phase == 'train'):
                    outputs = model(inputs)
                    _, preds = torch.max(outputs, 1)
                    loss = criterion(outputs, labels)
                    if phase == 'train':
                        loss.backward()
                        optimizer.step()
                running_loss += loss.item() * inputs.size(0)
                running_corrects += torch.sum(preds == labels.data)
            if phase == 'train':
                scheduler.step()
            epoch_loss = running_loss / dataset_sizes[phase]
            epoch_acc = running_corrects.double() / dataset_sizes[phase]
            print(f'{phase} Loss: {epoch_loss:.4f} Acc: {epoch_acc:.4f}')
    print('Training complete')
    return model

五、实战项目:计算机视觉应用开发

5.1 需求分析

构建一个支持图像分类、目标检测和语义分割的桌面应用,提供友好的交互界面。

5.2 系统架构

采用分层设计:用户界面层、应用逻辑层、图像处理层和数据存储层。

5.3 系统实现

环境搭建
pip install opencv-python
pip install pillow
pip install torch torchvision
pip install tensorflow
图像输入模块
import tkinter as tk
from tkinter import filedialog
from PIL import Image, ImageTk

class ImageInputFrame(tk.Frame):
    def __init__(self, parent, on_image_selected):
        tk.Frame.__init__(self, parent)
        self.parent = parent
        self.on_image_selected = on_image_selected
        self.create_widgets()

    def create_widgets(self):
        self.image_label = tk.Label(self)
        self.image_label.pack(pady=10, padx=10, fill="both", expand=True)
        tk.Button(self, text="选择图像", command=self.select_image).pack(pady=10, padx=10)

    def select_image(self):
        file_path = filedialog.askopenfilename(filetypes=[("Image Files", "*.png *.jpg *.jpeg *.bmp")])
        if file_path:
            image = Image.open(file_path)
            image = image.resize((400, 300), Image.ANTIALIAS)
            photo = ImageTk.PhotoImage(image)
            self.image_label.configure(image=photo)
            self.image_label.image = photo
            self.on_image_selected(file_path)
图像分类功能
import torch
from torchvision import transforms, models
from PIL import Image

def classify_image(image_path, model_path, class_names):
    data_transforms = transforms.Compose([
        transforms.Resize(256),
        transforms.CenterCrop(224),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    image = Image.open(image_path)
    image = data_transforms(image)
    image = image.unsqueeze(0)
    
    model = models.resnet18()
    num_ftrs = model.fc.in_features
    model.fc = torch.nn.Linear(num_ftrs, len(class_names))
    model.load_state_dict(torch.load(model_path))
    model.eval()
    
    with torch.no_grad():
        outputs = model(image)
        _, preds = torch.max(outputs, 1)
    return class_names[preds[0]]
目标检测功能
import cv2
import numpy as np
import torch
from torchvision import transforms, models
from PIL import Image

def detect_objects(image_path, model_path, class_names):
    image = cv2.imread(image_path)
    image_rgb = cv2.cvtColor(image, cv2.COLOR_BGR2RGB)
    image_pil = Image.fromarray(image_rgb)
    
    data_transforms = transforms.Compose([
        transforms.Resize((416, 416)),
        transforms.ToTensor(),
        transforms.Normalize([0.485, 0.456, 0.406], [0.229, 0.224, 0.225])
    ])
    image_tensor = data_transforms(image_pil)
    image_tensor = image_tensor.unsqueeze(0)
    
    model = models.detection.fasterrcnn_resnet50_fpn(pretrained=False)
    in_features = model.roi_heads.box_predictor.cls_score.in_features
    model.roi_heads.box_predictor = models.detection.faster_rcnn.FastRCNNPredictor(in_features, len(class_names))
    model.load_state_dict(torch.load(model_path))
    model.eval()
    
    with torch.no_grad():
        outputs = model(image_tensor)
    
    boxes = outputs[0]['boxes'].cpu().numpy()
    scores = outputs[0]['scores'].cpu().numpy()
    labels = outputs[0]['labels'].cpu().numpy()
    
    for i in range(len(boxes)):
        if scores[i] > 0.5:
            box = boxes[i].astype(int)
            label = class_names[labels[i]]
            score = scores[i]
            cv2.rectangle(image, (box[0], box[1]), (box[2], box[3]), (0, 255, 0), 2)
            cv2.putText(image, f"{label}: {score:.2f}", (box[0], box[1]-10), cv2.FONT_HERSHEY_SIMPLEX, 0.9, (0, 255, 0), 2)
    return image
主程序入口
import tkinter as tk
from tkinter import ttk, messagebox, filedialog
from PIL import Image, ImageTk
from image_input_frame import ImageInputFrame
from result_frame import ResultFrame
from cv_functions import classify_image, detect_objects

class CVApp:
    def __init__(self, root):
        self.root = root
        self.root.title("计算机视觉应用")
        self.class_names = ['猫', '狗']
        self.model_path = 'model.pth'
        self.create_widgets()

    def create_widgets(self):
        self.image_input_frame = ImageInputFrame(self.root, self.process_image)
        self.image_input_frame.pack(pady=10, padx=10, fill="both", expand=True)
        
        function_frame = tk.LabelFrame(self.root, text="功能选择")
        function_frame.pack(pady=10, padx=10, fill="x")
        self.function_var = tk.StringVar()
        self.function_var.set("图像分类")
        tk.Radiobutton(function_frame, text="图像分类", variable=self.function_var, value="图像分类").grid(row=0, column=0, padx=5, pady=5)
        tk.Radiobutton(function_frame, text="目标检测", variable=self.function_var, value="目标检测").grid(row=0, column=1, padx=5, pady=5)
        
        self.result_frame = ResultFrame(self.root)
        self.result_frame.pack(pady=10, padx=10, fill="both", expand=True)
        
        self.output_image_label = tk.Label(self.root)
        self.output_image_label.pack(pady=10, padx=10, fill="both", expand=True)

    def process_image(self, image_path):
        function = self.function_var.get()
        try:
            if function == "图像分类":
                result = classify_image(image_path, self.model_path, self.class_names)
                self.result_frame.display_result(result)
            elif function == "目标检测":
                result_image = detect_objects(image_path, self.model_path, self.class_names)
                result_image = cv2.cvtColor(result_image, cv2.COLOR_BGR2RGB)
                result_image_pil = Image.fromarray(result_image)
                result_image_pil = result_image_pil.resize((400, 300), Image.ANTIALIAS)
                photo = ImageTk.PhotoImage(result_image_pil)
                self.output_image_label.configure(image=photo)
                self.output_image_label.image = photo
            else:
                raise ValueError("未知功能")
        except Exception as e:
            messagebox.showerror("错误", f"处理失败:{str(e)}")

if __name__ == "__main__":
    root = tk.Tk()
    app = CVApp(root)
    root.mainloop()

5.4 运行与测试

  1. 安装所需库
  2. 运行 cv_app.py
  3. 选择图像并指定功能
  4. 查看分类结果或检测结果

六、总结

本文梳理了计算机视觉的核心知识体系,从基础概念到工程落地。重点讲解了图像预处理、增强滤波以及 HOG、SIFT、ORB 等特征提取手段,并深入分析了 LeNet、ResNet、YOLO 等主流模型架构。通过 PyTorch 训练代码和 OpenCV 工具库的实际演示,展示了如何构建包含分类与检测功能的完整应用。希望读者能借此掌握 CV 关键技术,将理论转化为实际生产力。

目录

  1. 计算机视觉基础与实战应用
  2. 核心要点
  3. 主要内容
  4. 一、计算机视觉基础
  5. 1.1 基本概念
  6. 重要性
  7. 应用场景
  8. 1.2 面临的挑战
  9. 二、图像处理技术
  10. 2.1 图像预处理
  11. 代码实现
  12. 2.2 图像增强
  13. 代码实现
  14. 2.3 图像滤波
  15. 代码实现
  16. 三、特征提取方法
  17. 3.1 HOG 特征
  18. 3.2 SIFT 特征
  19. 3.3 ORB 特征
  20. 四、常用模型与架构
  21. 4.1 传统机器学习模型
  22. 4.2 深度学习模型
  23. 4.3 模型训练示例
  24. 五、实战项目:计算机视觉应用开发
  25. 5.1 需求分析
  26. 5.2 系统架构
  27. 5.3 系统实现
  28. 环境搭建
  29. 图像输入模块
  30. 图像分类功能
  31. 目标检测功能
  32. 主程序入口
  33. 5.4 运行与测试
  34. 六、总结
  • 💰 8折买阿里云服务器限时8折了解详情
  • Magick API 一键接入全球大模型注册送1000万token查看
  • 🤖 一键搭建Deepseek满血版了解详情
  • 一键打造专属AI 智能体了解详情
极客日志微信公众号二维码

微信扫一扫,关注极客日志

微信公众号「极客日志V2」,在微信中扫描左侧二维码关注。展示文案:极客日志V2 zeeklog

更多推荐文章

查看全部
  • Qwen3 与 Qwen Agent 智能体开发实战:接入 MCP 工具
  • PX4+ROS 无人机 Offboard 控制:模式解析与轨迹跟踪实战
  • AIGC 从创意到创造
  • DeepSeek 使用指南与高阶提示词技巧
  • Web 渗透测试实战:从信息收集到内网穿透
  • 深入理解 Xilinx FPGA 开发:Vivado 与 Vitis 流程对比
  • 使用 Docker 部署 OpenClaw 实践
  • MySQL 8.0 安装配置与连接实战指南
  • AI 自动化测试:接口测试全流程自动化的实现方法
  • 链表与 LinkedList
  • Glide 加载 WebP 动画时的缓存陷阱与精准清理方案
  • 30 个实用的 Python 编程技巧与最佳实践
  • 二叉树递归遍历与剪枝算法详解
  • Retrieval-based-Voice-Conversion-WebUI 跨平台语音转换框架使用指南
  • Python 帧对象:执行模型与运行期状态解析
  • 前端大屏展示技术指南
  • Vue3 + Python 体育赛事发布与在线购票选座系统设计
  • RoboBrain 2.0 具身大脑模型复现指南:统一感知、推理与规划
  • 宇树 Unitree 机器人 ROS 2 Humble 环境部署指南 (Go2/B2/H1)
  • Git 版本管理工具基础使用指南

相关免费在线工具

  • 加密/解密文本

    使用加密算法(如AES、TripleDES、Rabbit或RC4)加密和解密文本明文。 在线工具,加密/解密文本在线工具,online

  • RSA密钥对生成器

    生成新的随机RSA私钥和公钥pem证书。 在线工具,RSA密钥对生成器在线工具,online

  • Mermaid 预览与可视化编辑

    基于 Mermaid.js 实时预览流程图、时序图等图表,支持源码编辑与即时渲染。 在线工具,Mermaid 预览与可视化编辑在线工具,online

  • 随机西班牙地址生成器

    随机生成西班牙地址(支持马德里、加泰罗尼亚、安达卢西亚、瓦伦西亚筛选),支持数量快捷选择、显示全部与下载。 在线工具,随机西班牙地址生成器在线工具,online

  • Gemini 图片去水印

    基于开源反向 Alpha 混合算法去除 Gemini/Nano Banana 图片水印,支持批量处理与下载。 在线工具,Gemini 图片去水印在线工具,online

  • curl 转代码

    解析常见 curl 参数并生成 fetch、axios、PHP curl 或 Python requests 示例代码。 在线工具,curl 转代码在线工具,online