【Ubuntu系统中OpenCV安装与配置指南】:从零到一打造计算机视觉环境
发布时间: 2024-08-06 05:17:50 阅读量: 72 订阅数: 21
![【Ubuntu系统中OpenCV安装与配置指南】:从零到一打造计算机视觉环境](https://i1.hdslb.com/bfs/archive/222e4c58d1eba363e6aee5c2546f36b56f44d59f.png@960w_540h_1c.webp)
# 1. Ubuntu系统简介**
Ubuntu是一个基于Debian的Linux发行版,以其易用性、稳定性和广泛的软件支持而闻名。它适用于各种用例,包括桌面计算、服务器部署和云计算。
Ubuntu系统采用GNOME桌面环境,提供直观的用户界面和丰富的功能。它还支持各种第三方应用程序,使其高度可定制。Ubuntu的包管理系统apt-get允许用户轻松安装、更新和删除软件包。
Ubuntu是一个开源操作系统,这意味着它的源代码对公众开放。这使得开发人员能够创建自定义版本,并为系统贡献改进。Ubuntu社区活跃且支持,提供文档、论坛和在线资源,帮助用户解决问题并充分利用系统。
# 2.1 OpenCV概述和应用领域
### 2.1.1 OpenCV的起源和发展
OpenCV(Open Source Computer Vision Library)是一个开源的计算机视觉库,由英特尔公司于1999年创立。它最初是为了满足英特尔研究实验室的内部需求而开发的,但后来被开源并成为计算机视觉领域最流行的库之一。
OpenCV经历了多次重大版本更新,包括:
- OpenCV 1.0(2006年):最初版本,提供图像处理和计算机视觉的基本功能。
- OpenCV 2.0(2009年):增加了对多核处理和GPU加速的支持。
- OpenCV 3.0(2015年):引入了对深度学习的支持,并改进了图像处理和计算机视觉算法。
- OpenCV 4.0(2018年):进一步增强了深度学习功能,并增加了对移动平台的支持。
### 2.1.2 OpenCV的应用场景和优势
OpenCV广泛应用于各种计算机视觉领域,包括:
- **图像处理:**图像读取、显示、转换、增强、分割、目标检测等。
- **计算机视觉:**特征提取、匹配、物体识别、跟踪、机器学习在计算机视觉中的应用等。
- **机器人视觉:**机器人导航、避障、目标识别等。
- **安防监控:**人脸识别、目标跟踪、异常检测等。
- **医疗影像分析:**医学图像分割、疾病诊断、手术规划等。
OpenCV的优势包括:
- **开源和免费:**可供任何人免费使用和修改。
- **跨平台:**支持Windows、Linux、macOS、iOS和Android等多个平台。
- **丰富的算法:**提供数百种图像处理和计算机视觉算法。
- **社区支持:**拥有庞大的用户社区和丰富的文档和教程。
- **持续更新:**定期发布新版本,添加新功能和改进现有功能。
# 3.1 Ubuntu系统环境准备
#### 3.1.1 系统版本和依赖库的安装
在开始安装OpenCV之前,需要确保Ubuntu系统满足以下要求:
- Ubuntu 18.04或更高版本
- 至少4GB内存
- 至少20GB可用磁盘空间
安装必要的依赖库:
```shell
sudo apt update
sudo apt install build-essential cmake pkg-config
```
#### 3.1.2 编译环境的搭建
OpenCV需要一个编译环境才能从源代码进行安装。安装以下编译工具:
```shell
sudo apt install gcc g++ make
```
### 3.2 OpenCV安装方法
#### 3.2.1 源码编译安装
从OpenCV官方网站下载最新版本的OpenCV源代码。解压源代码包并进入源代码目录:
```shell
tar -xzvf opencv-4.6.0.tar.gz
cd opencv-4.6.0
```
配置OpenCV构建选项:
```shell
cmake -D CMAKE_BUILD_TYPE=Release -D CMAKE_INSTALL_PREFIX=/usr/local
```
编译和安装OpenCV:
```shell
make
sudo make install
```
#### 3.2.2 包管理工具安装
也可以使用Ubuntu的包管理工具apt-get安装OpenCV:
```shell
sudo apt install libopencv-dev
```
### 3.3 OpenCV配置与环境变量设置
#### 3.3.1 OpenCV库路径和头文件路径的设置
将OpenCV库路径和头文件路径添加到环境变量中:
```shell
echo 'export LD_LIBRARY_PATH=/usr/local/lib' >> ~/.bashrc
echo 'export C_INCLUDE_PATH=/usr/local/include' >> ~/.bashrc
source ~/.bashrc
```
#### 3.3.2 OpenCV环境变量的配置
设置OPENCV_DIR环境变量,指向OpenCV安装目录:
```shell
echo 'export OPENCV_DIR=/usr/local' >> ~/.bashrc
source ~/.bashrc
```
现在,OpenCV已成功安装并配置在Ubuntu系统中。
# 4. OpenCV实践应用
### 4.1 图像处理实战
#### 4.1.1 图像读取和显示
```python
import cv2
# 读取图像
image = cv2.imread("image.jpg")
# 显示图像
cv2.imshow("Image", image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
**代码逻辑逐行解读:**
1. `cv2.imread("image.jpg")`:读取指定路径的图像文件,并将其存储在`image`变量中。
2. `cv2.imshow("Image", image)`:创建一个窗口并显示`image`图像,窗口标题为"Image"。
3. `cv2.waitKey(0)`:等待用户按下任意键,然后继续执行程序。
4. `cv2.destroyAllWindows()`:关闭所有打开的窗口。
#### 4.1.2 图像转换和增强
```python
# 图像灰度化
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 图像二值化
binary_image = cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)[1]
# 图像锐化
sharpened_image = cv2.filter2D(image, -1, np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]))
```
**代码逻辑逐行解读:**
1. `cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)`:将彩色图像转换为灰度图像,存储在`gray_image`变量中。
2. `cv2.threshold(gray_image, 127, 255, cv2.THRESH_BINARY)[1]`:对灰度图像进行二值化处理,阈值设为127,高于阈值的像素值设为255(白色),低于阈值的像素值设为0(黑色),结果存储在`binary_image`变量中。
3. `cv2.filter2D(image, -1, np.array([[0, -1, 0], [-1, 5, -1], [0, -1, 0]]))`:使用拉普拉斯算子对图像进行锐化处理,结果存储在`sharpened_image`变量中。
#### 4.1.3 图像分割和目标检测
```python
# 图像分割:使用K-Means聚类
segmented_image = cv2.kmeans(image, 3, None, (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0), 10)[1]
# 目标检测:使用Haar级联分类器
face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
faces = face_cascade.detectMultiScale(image, 1.1, 4)
# 绘制边界框
for (x, y, w, h) in faces:
cv2.rectangle(image, (x, y), (x+w, y+h), (0, 255, 0), 2)
```
**代码逻辑逐行解读:**
1. `cv2.kmeans(image, 3, None, (cv2.TERM_CRITERIA_EPS + cv2.TERM_CRITERIA_MAX_ITER, 10, 1.0), 10)[1]`:使用K-Means聚类算法将图像分割为3个簇,结果存储在`segmented_image`变量中。
2. `face_cascade = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")`:加载Haar级联分类器,用于检测人脸。
3. `faces = face_cascade.detectMultiScale(image, 1.1, 4)`:在图像中检测人脸,并返回人脸的边界框坐标,存储在`faces`变量中。
4. `for (x, y, w, h) in faces:`:遍历检测到的人脸,并绘制边界框。
### 4.2 计算机视觉实战
#### 4.2.1 特征提取和匹配
```python
# 特征提取:使用ORB算法
orb = cv2.ORB_create()
keypoints1, descriptors1 = orb.detectAndCompute(image1, None)
keypoints2, descriptors2 = orb.detectAndCompute(image2, None)
# 特征匹配:使用BFMatcher算法
bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)
matches = bf.match(descriptors1, descriptors2)
# 绘制匹配点
match_image = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches, None)
```
**代码逻辑逐行解读:**
1. `orb = cv2.ORB_create()`:创建ORB特征提取器。
2. `keypoints1, descriptors1 = orb.detectAndCompute(image1, None)`:在`image1`中提取特征点和描述符,存储在`keypoints1`和`descriptors1`变量中。
3. `keypoints2, descriptors2 = orb.detectAndCompute(image2, None)`:在`image2`中提取特征点和描述符,存储在`keypoints2`和`descriptors2`变量中。
4. `bf = cv2.BFMatcher(cv2.NORM_HAMMING, crossCheck=True)`:创建BFMatcher匹配器,使用汉明距离度量和交叉检查。
5. `matches = bf.match(descriptors1, descriptors2)`:匹配`image1`和`image2`中的特征点,返回匹配结果存储在`matches`变量中。
6. `match_image = cv2.drawMatches(image1, keypoints1, image2, keypoints2, matches, None)`:绘制匹配点,并将结果存储在`match_image`变量中。
#### 4.2.2 物体识别和跟踪
```python
# 物体识别:使用SVM算法
svm = cv2.ml.SVM_create()
svm.train(train_data, cv2.ml.ROW_SAMPLE, labels)
# 物体跟踪:使用KCF算法
tracker = cv2.TrackerKCF_create()
tracker.init(image, bounding_box)
# 跟踪物体
while True:
ret, frame = cap.read()
if ret:
success, bounding_box = tracker.update(frame)
if success:
cv2.rectangle(frame, (int(bounding_box[0]), int(bounding_box[1])), (int(bounding_box[0] + bounding_box[2]), int(bounding_box[1] + bounding_box[3])), (0, 255, 0), 2)
cv2.imshow("Frame", frame)
if cv2.waitKey(1) & 0xFF == ord("q"):
break
else:
break
```
**代码逻辑逐行解读:**
1. `svm = cv2.ml.SVM_create()`:创建SVM分类器。
2. `svm.train(train_data, cv2.ml.ROW_SAMPLE, labels)`:使用训练数据训练SVM分类器。
3. `tracker = cv2.TrackerKCF_create()`:创建KCF跟踪器。
4. `tracker.init(image, bounding_box)`:使用图像和边界框初始化跟踪器。
5. `while True:`:进入跟踪循环。
6. `ret, frame = cap.read()`:读取视频帧。
7. `if ret:`:如果帧读取成功,则继续执行。
8. `success, bounding_box = tracker.update(frame)`:更新跟踪器,并获取更新后的边界框。
9. `if success:`:如果跟踪成功,则绘制边界框。
10. `cv2.imshow("Frame", frame)`:显示跟踪结果。
11. `if cv2.waitKey(1) & 0xFF == ord("q"):`:检查用户是否按下`q`键退出。
12. `else:`:如果帧读取失败,则退出循环。
#### 4.2.3 机器学习在计算机视觉中的应用
**图像分类:**
```python
# 加载数据
data = load_data()
# 划分数据集
X_train, X_test, y_train, y_test = train_test_split(data["features"], data["labels"], test_size=0.2)
# 训练模型
model = train_model(X_train, y_train)
# 评估模型
accuracy = evaluate_model(model, X_test, y_test)
```
**目标检测:**
```python
# 加载数据
data = load_data()
# 划分数据集
X_train,
# 5. **5.1 OpenCV与其他语言的集成**
OpenCV不仅可以与C++语言集成,还支持与其他编程语言集成,例如Python和Java。这使得开发者可以根据自己的偏好和项目需求选择合适的语言。
**5.1.1 OpenCV与Python集成**
Python是一种流行的高级编程语言,以其易用性和丰富的库而闻名。通过使用Python绑定,可以将OpenCV函数和对象无缝地集成到Python代码中。
```python
import cv2
# 读取图像
image = cv2.imread('image.jpg')
# 转换图像为灰度图像
gray_image = cv2.cvtColor(image, cv2.COLOR_BGR2GRAY)
# 显示图像
cv2.imshow('Gray Image', gray_image)
cv2.waitKey(0)
cv2.destroyAllWindows()
```
**5.1.2 OpenCV与C++集成**
C++是OpenCV的原生语言,提供了对库的直接访问。通过使用C++头文件和库,开发者可以完全控制OpenCV函数和对象。
```cpp
#include <opencv2/opencv.hpp>
using namespace cv;
int main() {
// 读取图像
Mat image = imread("image.jpg");
// 转换图像为灰度图像
Mat gray_image;
cvtColor(image, gray_image, COLOR_BGR2GRAY);
// 显示图像
imshow("Gray Image", gray_image);
waitKey(0);
destroyAllWindows();
return 0;
}
```
通过与其他语言的集成,OpenCV可以应用于更广泛的领域,满足不同开发者的需求。
0
0