2、OpenCV基础:安装OpenCV-Python库,读取并显示摄像头画面,理解帧率与分辨率的概念
好,咱们正式开始动手了。
这一章,说白了就是让你先把摄像头“叫醒”,然后看看它长什么样。我见过不少新手,一上来就搞什么人脸识别、目标跟踪,结果连摄像头都没调通,折腾半天发现是驱动问题。嗯,咱们先把地基打牢。
2.1 安装OpenCV-Python库
OpenCV,全称Open Source Computer Vision Library,是计算机视觉领域最常用的库之一。我个人习惯用Python版本,因为它上手快,调试也方便。
安装其实就一行命令。打开你的终端(Windows下是cmd或PowerShell,macOS/Linux下是终端),输入:
pip install opencv-python
如果你需要用到一些额外的算法模块(比如人脸识别),可以再装一个:
pip install opencv-contrib-python
装完之后,怎么验证呢?打开Python交互环境,或者写个简单的脚本:
import cv2
print(cv2.__version__)
如果输出了类似 4.8.0 这样的版本号,那就说明安装成功了。
2.2 读取并显示摄像头画面
安装好了,咱们来写第一段真正的代码。目标很简单:打开摄像头,把画面显示出来。
import cv2
# 打开摄像头,参数0表示第一个摄像头
cap = cv2.VideoCapture(0)
if not cap.isOpened():
print("无法打开摄像头")
exit()
while True:
# 逐帧读取
ret, frame = cap.read()
if not ret:
print("无法接收帧,可能摄像头断开")
break
# 显示画面
cv2.imshow('Camera', frame)
# 按 'q' 键退出
if cv2.waitKey(1) & 0xFF == ord('q'):
break
# 释放资源
cap.release()
cv2.destroyAllWindows()
这段代码,你跑一下试试。应该会弹出一个窗口,显示你摄像头拍到的画面。
我来解释一下关键点:
cv2.VideoCapture(0):0代表默认摄像头。如果你有多个摄像头,可以试试1、2……cap.read():返回两个值。第一个是布尔值,告诉你读取成功没有;第二个是图像数据(也就是一帧)。cv2.imshow():显示图像。第一个参数是窗口名字,第二个是图像数据。cv2.waitKey(1):等待键盘输入。参数1表示等待1毫秒。这个函数很关键,它让OpenCV有机会刷新窗口。你想想看,如果没有这一行,窗口可能会卡死。
cap.release() 和 cv2.destroyAllWindows()。我曾经在开发一个监控系统时,忘了释放摄像头资源,结果程序崩溃后摄像头一直被占用,重启电脑才解决。
2.3 理解帧率与分辨率
好,画面出来了。但你可能发现画面有点卡,或者画质不太对。这就涉及到两个核心概念:帧率和分辨率。
2.3.1 帧率(FPS)
帧率,全称Frames Per Second,也就是每秒显示的帧数。说白了,就是画面每秒刷新多少次。
常见的帧率:
- 15 FPS:勉强能看,但明显卡顿
- 30 FPS:流畅,大多数视频的标准
- 60 FPS:非常流畅,适合游戏或高速运动场景
怎么获取当前摄像头的帧率呢?OpenCV提供了方法:
fps = cap.get(cv2.CAP_PROP_FPS)
print(f"帧率: {fps}")
但要注意,这个值不一定是真实的。有些摄像头返回的是理论值,实际跑起来可能达不到。我习惯自己算:
import time
prev_time = time.time()
frame_count = 0
while True:
ret, frame = cap.read()
frame_count += 1
current_time = time.time()
elapsed_time = current_time - prev_time
if elapsed_time >= 1.0:
fps = frame_count / elapsed_time
print(f"实际帧率: {fps:.2f}")
prev_time = current_time
frame_count = 0
# 显示画面...
这样算出来的才是真实帧率。我在做实时视频处理时,经常用这个方法来监控性能。
2.3.2 分辨率
分辨率,就是图像的宽和高,单位是像素。常见的分辨率有:
| 名称 | 宽(像素) | 高(像素) |
|---|---|---|
| VGA | 640 | 480 |
| HD | 1280 | 720 |
| Full HD | 1920 | 1080 |
| 4K | 3840 | 2160 |
获取当前分辨率:
width = int(cap.get(cv2.CAP_PROP_FRAME_WIDTH))
height = int(cap.get(cv2.CAP_PROP_FRAME_HEIGHT))
print(f"分辨率: {width} x {height}")
如果你想修改分辨率,可以这样:
cap.set(cv2.CAP_PROP_FRAME_WIDTH, 1280)
cap.set(cv2.CAP_PROP_FRAME_HEIGHT, 720)
2.4 实战小练习
光看不练假把式。我给你留个小任务:
- 打开摄像头,显示画面
- 在画面左上角显示当前帧率(用
cv2.putText()) - 按 'r' 键切换分辨率(比如从640x480切换到1280x720)
- 按 'q' 键退出
提示:cv2.putText() 的用法是这样的:
cv2.putText(frame, f"FPS: {fps:.2f}", (10, 30),
cv2.FONT_HERSHEY_SIMPLEX, 1, (0, 255, 0), 2)
这个练习做完,你对帧率和分辨率的理解就会更深刻。我在带新人时,这个练习是必做的,效果很好。
2.5 本章总结
咱们这一章,做了三件事:
- 安装了OpenCV-Python库
- 写代码打开了摄像头,并显示了画面
- 理解了帧率和分辨率的概念,以及如何获取和设置它们
下一章,咱们会深入一点,讲讲如何对摄像头画面做基本的图像处理。比如转成灰度图、调整亮度对比度这些。准备好了吗?
好,这一章就到这儿。动手试试吧,有问题随时回来翻翻。