您的位置:

探索OpenCV:从基础到实践

一、OpenCV介绍

OpenCV是一款跨平台的计算机视觉库,它提供了各种各样的函数,用于图像、视频处理和机器学习。OpenCV最初是由英特尔公司开发的,以C++语言编写而成,但现已得到支持多种编程语言(如Python、Java等)的扩展。

OpenCV生态系统从2.x版本开始就已经被广泛应用。如今,它常用于人脸检测、图像分割、图像跟踪等方面,同时也是许多研究人员和工程师的首选。

下面给出一个简单的例子,展示如何使用OpenCV读取并显示图像。这是OpenCV的入门的第一步——加载图像。

import cv2 as cv

img = cv.imread('example.jpg', 1)
cv.imshow('image', img)
cv.waitKey(0)
cv.destroyAllWindows()

代码中,cv2.imread函数可以读取一张图像,并以numpy数组的形式存储。其中,1表示读取为彩色图像,0表示读取为灰度图像;'example.jpg'表示要读取的图像路径。

cv.imshow函数可用于显示图像,第一个参数指定窗口名字,第二个参数指定要显示的图像。cv.waitKey函数则等待特定时间(以毫秒计)来查看是否有任何键盘事件,如果按下任何按键,则返回键的ASCII值,否则返回-1。cv.destroyAllWindows函数清除所有高GUI窗口。

二、基本图像处理

OpenCV提供的基础函数使得图像处理变得更加简单。下面我们看看一些最常用的图像处理函数。

1. 图像调整

import cv2 as cv

img = cv.imread('example.jpg', 1)

# 缩小一倍
img_resized = cv.resize(img,(int(img.shape[1]/2), int(img.shape[0]/2)))
cv.imshow('resized', img_resized)

# 水平翻转
img_flipped = cv.flip(img, 1)
cv.imshow('flipped', img_flipped)

# 调整亮度
M = np.ones(img.shape, dtype='uint8') * 75
img_bright = cv.add(img, M)
cv.imshow('bright', img_bright)

cv.waitKey(0)
cv.destroyAllWindows()

代码中,cv.resize函数可以缩小或放大图像,第一个参数指定要改变的图像,第二个参数为新图片的width和height。cv.flip函数可以水平、垂直或水平垂直翻转图片,第一个参数是要翻转的图像,第二个参数是指定翻转类型。

图像的对比度和亮度可以用add函数来调整,M为输入图像,表示要强制增加的每个像素的值。OpenCV允许使用numpy来操作每个像素。

2. 图像滤波

import cv2 as cv
import numpy as np

img = cv.imread('example.jpg', 1)

# 高斯滤波
img_blur = cv.GaussianBlur(img, (5,5), 0)
cv.imshow('blur', img_blur)

# 中值滤波
img_median = cv.medianBlur(img, 5)
cv.imshow('median', img_median)

# 边缘检测
img_gray = cv.cvtColor(img, cv.COLOR_BGR2GRAY)
img_edges = cv.Canny(img_gray, 50, 150)
cv.imshow('edges', img_edges)

cv.waitKey(0)
cv.destroyAllWindows()

代码中,cv.GaussianBlur函数实现高斯滤波,第一个参数为输入图像,第二个参数是一个元组ksize,表示内核大小。第三个参数是标准差,为0时表示自动计算。cv.medianBlur函数实现中值滤波,第一个参数为输入图像,第二个参数为内核大小。cv.Canny函数用于自动的边缘检测策略,第一个参数是输入图像,后两个参数的阈值大小和比率。

三、实际应用

下面是一个实际应用的例子:简单的人脸检测。

首先需要下载并导入计算机视觉库Dlib和OpenCV。

!pip install dlib

以下是人脸检测的代码示例

import cv2
import dlib

detector = dlib.get_frontal_face_detector()

# 加载图片
img = cv2.imread('example.jpg', 1)
img_rgb = cv2.cvtColor(img, cv2.COLOR_BGR2RGB)

# 人脸检测
faces = detector(img_rgb)

# 框出人脸
for face in faces:
    x1, y1 = face.left(), face.top()
    x2, y2 = face.right(), face.bottom()
    cv2.rectangle(img, (x1, y1), (x2, y2), (0, 255, 0), 10)

# 显示结果
cv2.imshow('result', img)
cv2.waitKey(0)
cv2.destroyAllWindows()

代码中,首先使用dlib.get_frontal_face_detector()函数创建一个默认的人脸检测器。然后加载一张图片,并将其转换为RGB格式。接着使用detector函数检测人脸,结果将存储在一个list中。最后,使用cv2.rectangle函数将人脸框起来。

总结

本文通过介绍OpenCV基本功能以及实际应用,对其功能进行了详细的阐述,希望可以帮助读者更好地了解和使用OpenCV。