简介:本文系统讲解了如何使用Python和OpenCV实现计算机视觉核心功能,涵盖环境搭建、基础图像处理、特征提取、物体检测及实战案例,为开发者提供完整的技术实现路径。
计算机视觉作为人工智能的重要分支,通过模拟人类视觉系统实现图像/视频的获取、处理与分析。其技术栈包含图像预处理、特征提取、目标检测、语义分割等模块,广泛应用于工业质检、医疗影像、自动驾驶等领域。OpenCV(Open Source Computer Vision Library)作为跨平台计算机视觉库,提供超过2500种优化算法,支持C++/Python/Java等语言,其Python接口凭借简洁语法和高效性能成为开发者首选。
# 基础版本(不含额外模块)pip install opencv-python# 完整版本(含contrib模块)pip install opencv-contrib-python
import cv2print(cv2.__version__) # 应输出4.x+版本号img = cv2.imread('test.jpg')cv2.imshow('Test', img)cv2.waitKey(0)
# 图像读写与格式转换img = cv2.imread('input.jpg', cv2.IMREAD_COLOR) # 彩色模式gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY) # 转为灰度图cv2.imwrite('output.png', gray) # 保存图像# 几何变换rotated = cv2.rotate(img, cv2.ROTATE_90_CLOCKWISE) # 90度旋转resized = cv2.resize(img, (640, 480)) # 尺寸调整
equ = cv2.equalizeHist(gray)
# 高斯模糊(去噪)blurred = cv2.GaussianBlur(img, (5,5), 0)# 中值滤波(椒盐噪声处理)median = cv2.medianBlur(img, 5)
Canny算法三步骤:
edges = cv2.Canny(gray, 50, 150) # 阈值1,阈值2# 非极大值抑制与双阈值检测自动集成
# SIFT特征提取(需OpenCV-contrib)sift = cv2.SIFT_create()kp, des = sift.detectAndCompute(gray, None)# ORB特征(旋转不变性)orb = cv2.ORB_create(nfeatures=500)kp_orb, des_orb = orb.detectAndCompute(gray, None)
# FLANN快速匹配器配置FLANN_INDEX_KDTREE = 1index_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_matches = []for m, n in matches:if m.distance < 0.7 * n.distance:good_matches.append(m)
res = cv2.matchTemplate(img, template, cv2.TM_CCOEFF_NORMED)min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(res)
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')faces = face_cascade.detectMultiScale(gray, 1.1, 4)
# 加载预训练模型(需OpenCV DNN模块)net = cv2.dnn.readNetFromDarknet('yolov3.cfg', 'yolov3.weights')layer_names = net.getLayerNames()output_layers = [layer_names[i[0] - 1] for i in net.getUnconnectedOutLayers()]# 前向传播推理blob = cv2.dnn.blobFromImage(img, 0.00392, (416,416), (0,0,0), True, crop=False)net.setInput(blob)outs = net.forward(output_layers)
graph TDA[输入图像] --> B[预处理]B --> C[车牌定位]C --> D[字符分割]D --> E[字符识别]E --> F[结果输出]
def license_plate_recognition(img_path):# 1. 预处理img = cv2.imread(img_path)gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)_, binary = cv2.threshold(gray, 0, 255, cv2.THRESH_BINARY + cv2.THRESH_OTSU)# 2. 车牌定位(基于轮廓分析)contours, _ = cv2.findContours(binary, cv2.RETR_TREE, cv2.CHAIN_APPROX_SIMPLE)for cnt in contours:x,y,w,h = cv2.boundingRect(cnt)aspect_ratio = w / float(h)area = cv2.contourArea(cnt)if (aspect_ratio > 2 and aspect_ratio < 6) and area > 1000:plate = img[y:y+h, x:x+w]# 3. 字符分割与识别(简化版)plate_gray = cv2.cvtColor(plate, cv2.COLOR_BGR2GRAY)chars = cv2.split(plate_gray) # 实际需更复杂的分割算法# ... 后续OCR处理return "识别结果示例"
from threading import Threadclass VideoProcessor(Thread):def run(self):cap = cv2.VideoCapture(0)while True:ret, frame = cap.read()# 处理逻辑
cv2.UMat进行GPU加速服务化部署:通过Flask构建API接口
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/predict', methods=['POST'])def predict():file = request.files['image']img = cv2.imdecode(np.frombuffer(file.read(), np.uint8), cv2.IMREAD_COLOR)# 处理逻辑return jsonify({"result": "processed"})
进阶方向:
学习资源推荐:
通过系统掌握上述技术体系,开发者能够构建从基础图像处理到复杂视觉应用的完整解决方案。建议从实际项目切入,结合OpenCV官方示例进行二次开发,逐步积累工程经验。