首页 > 编程知识 正文

基于Python的计算机视觉项目用法介绍

时间:2023-11-22 10:48:01 阅读:287839 作者:QAVP

本文将从多个方面详细阐述基于Python的计算机视觉项目,包括图像处理、物体检测、人脸识别和图像分割等。

一、图像处理

1、图像读取和显示

使用OpenCV库可以轻松读取和显示图像,在Python中的代码如下:

import cv2

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

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

其中,imread()函数读取图像,imshow()函数显示图像,waitKey()表示等待键盘输入,destroyAllWindows()表示关闭所有窗口。

2、图像缩放

图像缩放可以使用resize()函数实现,示例代码如下:

import cv2

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

# 图像缩放
resized_img = cv2.resize(img, (img.shape[0]//2, img.shape[1]//2))

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

其中,shape属性可以获取图像的尺寸信息,resize()函数可以将图像缩小到原来的1/2。

二、物体检测

1、Haar特征分类器检测人脸

Haar特征分类器是一种基于Haar特征的物体检测方法,可以很好地应用于人脸检测。使用OpenCV库中的CascadeClassifier类可以实现人脸检测,代码如下:

import cv2

# 读取图像
img = cv2.imread('face.jpg')

# 加载分类器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')

# 人脸检测
faces = face_cascade.detectMultiScale(img, scaleFactor=1.1, minNeighbors=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()

其中,CascadeClassifier类接收一个训练好的xml分类器文件,detectMultiScale()函数可以返回检测到的目标的位置和大小,rectangle()函数可以绘制矩形框。

2、YOLOv5进行物体检测

YOLOv5是一种端到端的目标检测算法,可训练性和检测精度都很高。通过使用第三方Python库ultralytics/yolov5,我们可以轻松地对图像进行物体检测。示例代码如下:

import cv2
from PIL import Image
import torch
import numpy as np
from yolov5.models.experimental import attempt_load
from yolov5.utils.general import non_max_suppression
from yolov5.utils.torch_utils import select_device

# 加载模型
weights = 'yolov5s.pt'
device = select_device('')
model = attempt_load(weights, map_location=device)
model.eval()

# 读取图像
img = cv2.imread('person.jpg')

# 图像转换
img = Image.fromarray(cv2.cvtColor(img, cv2.COLOR_BGR2RGB))

# 模型推理
inference_size = 640
img = img.resize((inference_size, inference_size), resample=Image.BILINEAR)
img_tensor = torch.tensor(np.array(img)).float().unsqueeze(0).permute(0, 3, 1, 2) / 255.0
pred = model(img_tensor)[0]
pred = non_max_suppression(pred, 0.4, 0.5)

# 绘制矩形框
for i, det in enumerate(pred):
    det[:, :4] = det[:, :4].clip(0, img_tensor.shape[3])
    for *xyxy, conf, cls in reversed(det):
        label = model.names[int(cls)]
        c1, c2 = (int(xyxy[0]), int(xyxy[1])), (int(xyxy[2]), int(xyxy[3]))
        cv2.rectangle(np.array(img), c1, c2, (0, 0, 255), 2)

# 显示图像
cv2.imshow('object detection', np.array(img))
cv2.waitKey(0)
cv2.destroyAllWindows()

使用第三方Python库ultralytics/yolov5可以轻松加载预训练模型,在执行推理之前,需要将图像转换为模型要求的格式,推理完成后,可以绘制矩形框标记出检测到的物体。

三、人脸识别

1、基于dlib的人脸识别

dlib是一种基于C++的工具包,具有强大的人脸检测和识别功能。通过Python的dlib库可以实现人脸识别,示例代码如下:

import cv2
import dlib

# 加载人脸检测器和识别器
detector = dlib.get_frontal_face_detector()
predictor = dlib.shape_predictor('shape_predictor_68_face_landmarks.dat')
facerec = dlib.face_recognition_model_v1('dlib_face_recognition_resnet_model_v1.dat')

# 读取图像
img = cv2.imread('face.jpg')

# 人脸检测
dets = detector(img, 1)

# 提取特征向量
for k, d in enumerate(dets):
    shape = predictor(img, d)
    face_descriptor = facerec.compute_face_descriptor(img, shape)
    print(face_descriptor)

在这个例子中,需要加载三个文件:人脸检测器、68个关键点定位器和128维的人脸嵌入文件。通过detector函数可以检测到图像中的人脸区域,predictor函数可以定位到人脸68个特征点的位置,facerec函数可以计算128维的人脸嵌入特征向量。

2、基于OpenCV的人脸识别

除了使用dlib库之外,OpenCV自己也有人脸识别的功能,采用的是基于特征脸(Eigenface)、Fisher脸(Fisherface)和局部二值模式直方图(Local Binary Patterns Histograms,LBPH)的三种算法。代码如下:

import cv2

# 加载分类器和识别器
face_cascade = cv2.CascadeClassifier('haarcascade_frontalface_default.xml')
recognizer = cv2.face.LBPHFaceRecognizer_create()

# 读取图像
img = cv2.imread('face.jpg')

# 灰度处理
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 人脸检测
faces = face_cascade.detectMultiScale(gray, 1.1, 4)

# 训练模型
face_samples, face_labels = [], []
for (x, y, w, h) in faces:
    face_roi = gray[y:y+h, x:x+w]
    face_samples.append(face_roi)
    face_labels.append(1)
recognizer.train(face_samples, np.array(face_labels))

# 人脸识别
for (x, y, w, h) in faces:
    face_roi = gray[y:y+h, x:x+w]
    label, confidence = recognizer.predict(face_roi)
    print(label, confidence)

在这个例子中,识别器是LBPHFaceRecognizer,可以通过train()函数训练模型,通过predict()函数进行识别。可以看到,OpenCV的人脸识别方法比dlib更简单易用。

四、图像分割

1、基于K-Means算法的图像分割

K-Means算法是一种聚类算法,可以应用于图像分割。示例代码如下:

import cv2
import numpy as np

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

# 图像转换
gray = cv2.cvtColor(img, cv2.COLOR_BGR2GRAY)

# 像素值转换
data = gray.reshape((-1, 1))
data = np.float32(data)

# K-Means聚类
K = 2
criteria = (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0)
flags = cv2.KMEANS_RANDOM_CENTERS
compactness, labels, centers = cv2.kmeans(data, K, None, criteria, 10, flags)

# 图像重构
new_img = centers[labels].reshape(img.shape)

# 显示图像
cv2.imshow('segmentation', new_img)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,需要对图像进行灰度处理,将每一个像素点的灰度值作为K-Means聚类的输入,K-Means方法求解每个像素属于哪个类别,然后将同一类别的像素点赋予一个新的灰度值,从而实现图片的分割。

2、基于Unet的图像分割

Unet是一种经典的图像分割网络,具有良好的分割效果和解释性。通过使用第三方Python库keras-unet可以直接调用Unet模型。示例代码如下:

import cv2
import numpy as np
from keras.models import load_model
from keras_unet.models import custom_objects

# 读取图像
img = cv2.imread('image.jpg')
img = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 图像预处理
img = cv2.resize(img, (256, 256), interpolation=cv2.INTER_AREA)
img = img / 255.0
img = np.expand_dims(img, axis=0)

# 加载模型
model = load_model('unet.hdf5', custom_objects=custom_objects())

# 预测结果
pred = model.predict(img)[0]
pred = np.where(pred > 0.5, 1, 0)

# 显示结果
cv2.imshow('segmentation', pred*255)
cv2.waitKey(0)
cv2.destroyAllWindows()

在这个例子中,需要进行图像预处理,将图片缩小到256x256的大小,将所有像素值除以255.0以将像素值归一化到[0, 1]范围内。使用keras-unet库可以轻松加载预训练的Unet模型,在预测时需要将预处理后的图像输入到模型中,模型输出预测结果,然后将结果通过二值化的方式转换成黑白图像。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。