OpenCV 是计算机视觉领域最经典、使用最广泛的开源库之一。
如果你想学习图像处理、视频分析、人脸识别、目标检测,甚至后面的 YOLO、OCR、机器人视觉,那么 OpenCV 几乎都是绕不开的一项基础技能。

这篇文章我们不讲太多复杂数学公式,直接从安装开始,一步一步把 OpenCV 4 跑起来。

在这里插入图片描述

本文主要使用:

Python 3
OpenCV 4
NumPy

学习完之后,你可以掌握:

读取图片
显示图片
保存图片
图片缩放
图片裁剪
颜色转换
灰度处理
二值化
模糊处理
边缘检测
轮廓检测
绘制图形
添加文字
读取视频
调用摄像头
人脸检测
简单目标追踪

一、OpenCV 是什么?

OpenCV 全称:

Open Source Computer Vision Library

翻译过来就是:

开源计算机视觉库

它最早由 Intel 开发,现在已经成为计算机视觉领域使用最广泛的工具之一。

OpenCV 可以干什么?

例如:

图片处理
视频处理
人脸检测
人脸识别
车牌识别
二维码识别
目标检测
目标追踪
姿态识别
工业视觉
机器人视觉
OCR

比如一张普通图片:

原始图片
   ↓
OpenCV
   ↓
灰度化
   ↓
去噪
   ↓
边缘检测
   ↓
轮廓识别
   ↓
目标定位

很多计算机视觉系统,本质上就是这样一步一步处理出来的。


二、安装 Python

首先确认电脑已经安装 Python。

执行:

python --version

或者:

python3 --version

例如:

Python 3.12.5

如果没有安装,可以直接下载安装 Python 3。

一般建议:

Python 3.10
Python 3.11
Python 3.12

这些版本兼容性都比较好。


三、创建项目

新建一个目录:

mkdir opencv-demo

进入目录:

cd opencv-demo

创建虚拟环境:

python -m venv venv

Mac / Linux 激活:

source venv/bin/activate

Windows:

venv\Scripts\activate

然后安装 OpenCV。


四、安装 OpenCV4

Python 中 OpenCV 的包名是:

opencv-python

安装:

pip install opencv-python

同时安装 NumPy:

pip install numpy

也可以一次安装:

pip install opencv-python numpy

验证安装。

创建:

test.py

代码:

import cv2

print(cv2.__version__)

运行:

python test.py

如果输出:

4.x.x

例如:

4.12.0

说明 OpenCV4 已经安装成功。


五、OpenCV 最核心的概念:图片其实是矩阵

这是学习 OpenCV 非常重要的一个概念。

我们看到的是:

一张图片

但是计算机看到的其实是:

数字矩阵

例如一张彩色图片:

import cv2

img = cv2.imread("cat.jpg")

print(img)

你会看到类似:

[
  [[123 45 67]
   [121 48 70]
   [119 50 72]]

  ...
]

每个像素通常包含三个数字。

OpenCV 默认使用:

BGR

也就是:

Blue
Green
Red

注意,不是常见的:

RGB

而是:

BGR

例如:

[255, 0, 0]

在 OpenCV 中表示:

蓝色

六、读取第一张图片

假设目录:

opencv-demo
│
├── main.py
└── cat.jpg

代码:

import cv2

img = cv2.imread("cat.jpg")

print(img)

读取图片使用:

cv2.imread()

七、显示图片

代码:

import cv2

img = cv2.imread("cat.jpg")

cv2.imshow("Image", img)

cv2.waitKey(0)

cv2.destroyAllWindows()

这里有三个重要的方法。

1. imshow

显示图片:

cv2.imshow("Image", img)

第一个参数:

窗口名称

第二个参数:

图片

2. waitKey

cv2.waitKey(0)

意思是:

等待键盘输入

如果写:

cv2.waitKey(1000)

表示:

等待 1000ms

也就是:

1 秒

3. destroyAllWindows

cv2.destroyAllWindows()

关闭所有 OpenCV 窗口。


八、查看图片尺寸

可以这样:

import cv2

img = cv2.imread("cat.jpg")

print(img.shape)

输出可能是:

(1080, 1920, 3)

表示:

高度:1080
宽度:1920
通道:3

也就是:

1080 × 1920

的彩色图片。


九、获取某一个像素

例如:

pixel = img[100, 200]

print(pixel)

可能输出:

[120 85 200]

对应:

B = 120
G = 85
R = 200

注意坐标顺序。

OpenCV:

img[y, x]

也就是:

先高度
再宽度

不是:

x, y

这一点初学者非常容易搞错。


十、保存图片

保存图片非常简单:

cv2.imwrite("output.jpg", img)

完整示例:

import cv2

img = cv2.imread("cat.jpg")

cv2.imwrite("new-cat.jpg", img)

十一、修改图片大小

使用:

cv2.resize()

例如:

import cv2

img = cv2.imread("cat.jpg")

new_img = cv2.resize(img, (800, 600))

cv2.imshow("Image", new_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

这里:

800 = 宽
600 = 高

注意这个地方又变成:

(width, height)

十二、按照比例缩放图片

如果不希望把图片拉变形,可以按比例缩放。

例如缩小到:

50%

代码:

import cv2

img = cv2.imread("cat.jpg")

new_img = cv2.resize(
    img,
    None,
    fx=0.5,
    fy=0.5
)

cv2.imshow("Image", new_img)

cv2.waitKey(0)
cv2.destroyAllWindows()

这里:

fx = 水平方向缩放
fy = 垂直方向缩放

十三、裁剪图片

图片裁剪其实非常简单。

例如:

crop = img[100:500, 200:800]

完整代码:

import cv2

img = cv2.imread("cat.jpg")

crop = img[100:500, 200:800]

cv2.imshow("Crop", crop)

cv2.waitKey(0)
cv2.destroyAllWindows()

本质上就是 NumPy 数组切片。

格式:

img[y1:y2, x1:x2]

例如:

y:100 ~ 500
x:200 ~ 800

十四、图片颜色转换

OpenCV 非常常见的一个操作就是:

颜色空间转换

使用:

cv2.cvtColor()

十五、彩色图片转灰度图

代码:

import cv2

img = cv2.imread("cat.jpg")

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

cv2.imshow("Gray", gray)

cv2.waitKey(0)
cv2.destroyAllWindows()

原来:

BGR 三个通道

经过转换后:

只剩一个灰度通道

十六、BGR 转 RGB

如果使用:

Matplotlib
PIL

经常需要:

BGR → RGB

代码:

rgb = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2RGB
)

十七、图片模糊

图片模糊通常用于:

去噪

例如使用高斯模糊:

blur = cv2.GaussianBlur(
    img,
    (15, 15),
    0
)

完整示例:

import cv2

img = cv2.imread("cat.jpg")

blur = cv2.GaussianBlur(
    img,
    (15, 15),
    0
)

cv2.imshow("Blur", blur)

cv2.waitKey(0)
cv2.destroyAllWindows()

其中:

(15, 15)

叫:

卷积核大小

一般必须使用奇数:

3
5
7
9
11

数值越大:

图片越模糊

十八、二值化

二值化之后,一张图片通常只有两种像素:

0
255

也就是:

黑
白

代码:

import cv2

img = cv2.imread("cat.jpg")

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

_, binary = cv2.threshold(
    gray,
    127,
    255,
    cv2.THRESH_BINARY
)

cv2.imshow("Binary", binary)

cv2.waitKey(0)
cv2.destroyAllWindows()

这一步在:

OCR
车牌识别
文档识别
工业视觉
轮廓识别

中非常常见。


十九、自动二值化

127 是我们自己指定的阈值。

但是 OpenCV 也可以自动计算。

例如:

_, binary = cv2.threshold(
    gray,
    0,
    255,
    cv2.THRESH_BINARY + cv2.THRESH_OTSU
)

这个方法叫:

Otsu Threshold

即:

大津法

二十、边缘检测

OpenCV 最经典的边缘检测算法:

Canny

代码:

import cv2

img = cv2.imread("cat.jpg")

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

edges = cv2.Canny(
    gray,
    100,
    200
)

cv2.imshow("Edges", edges)

cv2.waitKey(0)
cv2.destroyAllWindows()

处理流程:

原图
 ↓
灰度图
 ↓
Canny
 ↓
边缘

你会发现:

猫的轮廓
桌子的轮廓
人物轮廓
物体边缘

都被提取出来了。


二十一、腐蚀与膨胀

计算机视觉中还有两个非常经典的操作:

腐蚀
膨胀

英文:

Erosion
Dilation

例如:

import cv2
import numpy as np

img = cv2.imread("cat.jpg")

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

kernel = np.ones((5, 5), np.uint8)

erosion = cv2.erode(
    gray,
    kernel,
    iterations=1
)

dilation = cv2.dilate(
    gray,
    kernel,
    iterations=1
)

简单理解。

腐蚀:

让白色区域变小

膨胀:

让白色区域变大

非常适合处理:

文字
二维码
轮廓
工业缺陷
OCR

二十二、在图片上画矩形

例如:

cv2.rectangle(
    img,
    (100, 100),
    (500, 400),
    (0, 255, 0),
    3
)

完整示例:

import cv2

img = cv2.imread("cat.jpg")

cv2.rectangle(
    img,
    (100, 100),
    (500, 400),
    (0, 255, 0),
    3
)

cv2.imshow("Image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

参数分别是:

图片
左上角坐标
右下角坐标
颜色
线宽

二十三、画圆

代码:

cv2.circle(
    img,
    (300, 300),
    100,
    (0, 0, 255),
    3
)

解释:

(300,300) = 圆心

100 = 半径

(0,0,255) = 红色

3 = 线宽

二十四、画直线

代码:

cv2.line(
    img,
    (100, 100),
    (600, 500),
    (255, 0, 0),
    5
)

二十五、在图片上写文字

代码:

cv2.putText(
    img,
    "OpenCV4",
    (100, 100),
    cv2.FONT_HERSHEY_SIMPLEX,
    2,
    (0, 255, 0),
    3
)

完整代码:

import cv2

img = cv2.imread("cat.jpg")

cv2.putText(
    img,
    "OpenCV4",
    (100, 100),
    cv2.FONT_HERSHEY_SIMPLEX,
    2,
    (0, 255, 0),
    3
)

cv2.imshow("Image", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

以后 YOLO 检测框中的:

person
car
cat
dog

这些文字,本质上也可以使用这种方式绘制。


二十六、轮廓检测

轮廓检测是 OpenCV 中非常重要的一部分。

例如我们先:

灰度化
 ↓
二值化
 ↓
寻找轮廓

代码:

import cv2

img = cv2.imread("test.jpg")

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

_, binary = cv2.threshold(
    gray,
    127,
    255,
    cv2.THRESH_BINARY
)

contours, hierarchy = cv2.findContours(
    binary,
    cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE
)

print("轮廓数量:", len(contours))

绘制轮廓:

cv2.drawContours(
    img,
    contours,
    -1,
    (0, 255, 0),
    2
)

完整:

import cv2

img = cv2.imread("test.jpg")

gray = cv2.cvtColor(
    img,
    cv2.COLOR_BGR2GRAY
)

_, binary = cv2.threshold(
    gray,
    127,
    255,
    cv2.THRESH_BINARY
)

contours, _ = cv2.findContours(
    binary,
    cv2.RETR_EXTERNAL,
    cv2.CHAIN_APPROX_SIMPLE
)

cv2.drawContours(
    img,
    contours,
    -1,
    (0, 255, 0),
    2
)

cv2.imshow("Contours", img)

cv2.waitKey(0)
cv2.destroyAllWindows()

二十七、给轮廓画检测框

找到轮廓之后,可以得到它的矩形位置。

例如:

for contour in contours:

    x, y, w, h = cv2.boundingRect(contour)

    cv2.rectangle(
        img,
        (x, y),
        (x + w, y + h),
        (0, 255, 0),
        2
    )

这已经非常接近:

目标检测

的感觉了。

例如:

┌──────────────┐
│              │
│     物体      │
│              │
└──────────────┘

二十八、计算轮廓面积

可以使用:

area = cv2.contourArea(contour)

例如:

for contour in contours:

    area = cv2.contourArea(contour)

    if area > 1000:

        x, y, w, h = cv2.boundingRect(contour)

        cv2.rectangle(
            img,
            (x, y),
            (x + w, y + h),
            (0, 255, 0),
            2
        )

这样就可以过滤:

小噪点

只保留:

较大的目标

二十九、读取视频

OpenCV 不只能处理图片,还可以处理视频。

例如:

import cv2

cap = cv2.VideoCapture("video.mp4")

while True:

    ret, frame = cap.read()

    if not ret:
        break

    cv2.imshow("Video", frame)

    if cv2.waitKey(30) & 0xFF == ord("q"):
        break

cap.release()

cv2.destroyAllWindows()

理解这段代码非常重要。

视频其实就是:

图片
图片
图片
图片
图片
图片

连续快速播放。

例如:

30 FPS

就是:

每秒播放 30 张图片

所以 OpenCV 处理视频,本质上就是:

while True:

    读取一帧

    处理这一帧

    显示这一帧

三十、打开电脑摄像头

把:

cv2.VideoCapture("video.mp4")

改成:

cv2.VideoCapture(0)

就可以读取电脑摄像头。

完整代码:

import cv2

cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()

    if not ret:
        break

    cv2.imshow("Camera", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()

cv2.destroyAllWindows()

运行之后:

摄像头
   ↓
OpenCV
   ↓
实时视频

按:

Q

退出程序。


三十一、摄像头实时灰度处理

我们再做一个简单实时处理。

import cv2

cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()

    if not ret:
        break

    gray = cv2.cvtColor(
        frame,
        cv2.COLOR_BGR2GRAY
    )

    cv2.imshow("Gray Camera", gray)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()

cv2.destroyAllWindows()

这个时候整个摄像头画面就会实时变成:

黑白

这就是最基本的:

实时计算机视觉

三十二、摄像头实时边缘检测

继续升级:

import cv2

cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()

    if not ret:
        break

    gray = cv2.cvtColor(
        frame,
        cv2.COLOR_BGR2GRAY
    )

    edges = cv2.Canny(
        gray,
        100,
        200
    )

    cv2.imshow("Edge Camera", edges)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()

cv2.destroyAllWindows()

现在摄像头中的:

人物
桌子
电脑
手机

都会变成边缘轮廓。


三十三、OpenCV 实现人脸检测

接下来做一个真正有意思的例子:

人脸检测

OpenCV 自带经典的人脸检测器:

Haar Cascade

代码:

import cv2

face_cascade = cv2.CascadeClassifier(
    cv2.data.haarcascades +
    "haarcascade_frontalface_default.xml"
)

cap = cv2.VideoCapture(0)

while True:

    ret, frame = cap.read()

    if not ret:
        break

    gray = cv2.cvtColor(
        frame,
        cv2.COLOR_BGR2GRAY
    )

    faces = face_cascade.detectMultiScale(
        gray,
        scaleFactor=1.1,
        minNeighbors=5
    )

    for x, y, w, h in faces:

        cv2.rectangle(
            frame,
            (x, y),
            (x + w, y + h),
            (0, 255, 0),
            2
        )

    cv2.imshow(
        "Face Detection",
        frame
    )

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()

cv2.destroyAllWindows()

运行之后:

摄像头识别人脸
         ↓
计算人脸位置
         ↓
得到 x y w h
         ↓
画矩形框

效果类似:

┌────────────────┐
│                │
│     人脸        │
│                │
└────────────────┘

三十四、理解目标检测最基本的数据结构

不管是:

OpenCV
YOLO
SSD
Faster R-CNN
RT-DETR

最终目标检测通常都会返回:

x
y
width
height
class
confidence

例如:

{
    "class": "person",
    "confidence": 0.95,
    "x": 100,
    "y": 150,
    "width": 200,
    "height": 400
}

然后程序做:

检测目标
   ↓
获取坐标
   ↓
画框
   ↓
写类别
   ↓
显示置信度

所以前面学习:

cv2.rectangle()

和:

cv2.putText()

其实就是在为:

YOLO 目标检测

打基础。


三十五、保存摄像头视频

OpenCV 还可以录像。

例如:

import cv2

cap = cv2.VideoCapture(0)

fourcc = cv2.VideoWriter_fourcc(*"mp4v")

out = cv2.VideoWriter(
    "output.mp4",
    fourcc,
    20.0,
    (640, 480)
)

while True:

    ret, frame = cap.read()

    if not ret:
        break

    out.write(frame)

    cv2.imshow("Camera", frame)

    if cv2.waitKey(1) & 0xFF == ord("q"):
        break

cap.release()
out.release()

cv2.destroyAllWindows()

这样:

摄像头视频

就会被保存到:

output.mp4

三十六、实战:检测画面中移动的物体

接下来我们做一个稍微完整一点的 Demo。

目标:

摄像头
 ↓
检测运动
 ↓
找到运动物体
 ↓
画矩形框

代码:

import cv2

cap = cv2.VideoCapture(0)

ret, frame1 = cap.read()

ret, frame2 = cap.read()

while True:

    diff = cv2.absdiff(
        frame1,
        frame2
    )

    gray = cv2.cvtColor(
        diff,
        cv2.COLOR_BGR2GRAY
    )

    blur = cv2.GaussianBlur(
        gray,
        (5, 5),
        0
    )

    _, thresh = cv2.threshold(
        blur,
        20,
        255,
        cv2.THRESH_BINARY
    )

    dilated = cv2.dilate(
        thresh,
        None,
        iterations=3
    )

    contours, _ = cv2.findContours(
        dilated,
        cv2.RETR_TREE,
        cv2.CHAIN_APPROX_SIMPLE
    )

    for contour in contours:

        if cv2.contourArea(contour) < 1000:
            continue

        x, y, w, h = cv2.boundingRect(
            contour
        )

        cv2.rectangle(
            frame1,
            (x, y),
            (x + w, y + h),
            (0, 255, 0),
            2
        )

    cv2.imshow(
        "Motion Detection",
        frame1
    )

    frame1 = frame2

    ret, frame2 = cap.read()

    if not ret:
        break

    if cv2.waitKey(40) & 0xFF == ord("q"):
        break

cap.release()

cv2.destroyAllWindows()

它的原理其实并不复杂。

连续获得两张图片:

Frame 1

Frame 2

计算:

Frame1 - Frame2

如果两个地方完全一样:

差值 ≈ 0

如果某一个物体移动了:

差值很大

所以流程就是:

摄像头

 ↓

Frame1

 ↓

Frame2

 ↓

计算差异

 ↓

灰度处理

 ↓

模糊去噪

 ↓

二值化

 ↓

寻找轮廓

 ↓

过滤小区域

 ↓

画检测框

这其实已经是一个非常简单的:

监控移动检测系统

三十七、OpenCV4 学习路线

如果你是第一次学习 OpenCV,我建议按照下面这个路线。

第一阶段:

Python
 ↓
NumPy
 ↓
OpenCV

掌握:

图片读取
图片保存
图片尺寸
图片裁剪
图片缩放

第二阶段:

灰度化
二值化
模糊
边缘检测
腐蚀
膨胀

第三阶段:

轮廓检测
图像特征
颜色识别
模板匹配

第四阶段:

视频读取
摄像头
运动检测
目标追踪

第五阶段:

OpenCV
   +
深度学习

进入:

YOLO
OCR
人脸识别
姿态识别
机器人视觉

三十八、OpenCV 和 YOLO 是什么关系?

很多初学者会有一个疑问:

现在都有 YOLO 了,
为什么还学 OpenCV?

实际上:

OpenCV 和 YOLO

并不是竞争关系。

更多时候是:

YOLO
  +
OpenCV

YOLO 负责:

识别目标

OpenCV 负责:

读取视频
图片预处理
摄像头调用
画检测框
图片裁剪
视频编码
结果展示

例如:

摄像头
 ↓
OpenCV
 ↓
YOLO
 ↓
目标检测
 ↓
OpenCV
 ↓
画框
 ↓
显示视频

所以做实际 AI 视觉项目的时候:

OpenCV 往往依然是基础设施。

三十九、OpenCV、Pillow 和 NumPy 的关系

这三个库经常一起出现。

NumPy

负责:

矩阵计算

因为图片本质上就是:

NumPy Array

Pillow

更加偏向:

普通图片编辑

例如:

图片格式转换
加水印
缩放
裁剪
文字

OpenCV

更加偏向:

计算机视觉
视频
摄像头
图像识别

简单理解:

NumPy
  ↓
数据基础

Pillow
  ↓
图片编辑

OpenCV
  ↓
计算机视觉

四十、OpenCV 最值得记住的 API

初学阶段不需要把 OpenCV 几百个 API 都学会。

先记住下面这些。

读取图片:

cv2.imread()

显示图片:

cv2.imshow()

保存图片:

cv2.imwrite()

修改大小:

cv2.resize()

颜色转换:

cv2.cvtColor()

模糊:

cv2.GaussianBlur()

二值化:

cv2.threshold()

边缘检测:

cv2.Canny()

寻找轮廓:

cv2.findContours()

画矩形:

cv2.rectangle()

写文字:

cv2.putText()

读取视频:

cv2.VideoCapture()

录像:

cv2.VideoWriter()

如果把这些掌握了,OpenCV 基础已经基本入门。


四十一、建议的项目目录

后面真正做项目的时候,可以这样组织:

opencv-project
│
├── images
│   ├── cat.jpg
│   └── dog.jpg
│
├── videos
│   └── demo.mp4
│
├── output
│   ├── result.jpg
│   └── result.mp4
│
├── src
│   ├── image_demo.py
│   ├── video_demo.py
│   └── face_demo.py
│
├── requirements.txt
│
└── README.md

requirements.txt:

opencv-python
numpy

安装:

pip install -r requirements.txt

四十二、一个非常重要的学习方法

OpenCV 最大的问题是:

API 太多

很多初学者容易陷入一个误区:

我要把所有 API 学完。

其实完全没有必要。

真正正确的方式是:

先做项目
 ↓
遇到问题
 ↓
寻找 OpenCV API
 ↓
解决问题

例如你想做:

摄像头检测红色物体

那么你只需要学习:

VideoCapture
cvtColor
inRange
findContours
rectangle

如果你想做:

运动监控

那就学习:

VideoCapture
absdiff
threshold
findContours

如果你想做:

YOLO 摄像头识别

就学习:

VideoCapture
resize
rectangle
putText

所以:

OpenCV 并不是背 API。

而是解决视觉问题的工具箱。

总结

如果把 OpenCV 整个学习过程压缩成一条路线,大概就是:

读取图片

 ↓

理解图片是矩阵

 ↓

灰度处理

 ↓

模糊与去噪

 ↓

二值化

 ↓

边缘检测

 ↓

轮廓检测

 ↓

视频处理

 ↓

摄像头

 ↓

目标检测

 ↓

YOLO / OCR / 视觉 AI

OpenCV4 本身并不难。

真正关键的是理解:

一张图片在计算机眼里就是一个数字矩阵。

而所谓计算机视觉,本质上就是:

不断加工这些数字,
最终从数字里找到我们真正关心的信息。

如果你准备进入:

YOLO
OCR
人脸识别
无人机视觉
具身智能
机器人
工业视觉

那么 OpenCV 都非常值得先学一遍。

它就像视觉 AI 世界里的:

Hello World + 基础工具箱

先把 OpenCV 玩熟,后面再进入深度学习视觉模型,你会轻松很多。

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐