Lab1-2 OpenCV入门与实践——从基础操作到实时视频处理(二)
参考自同济大学蒋磊老师编写的IPMV实验说明
同济大学自动化专业IMPV课程学习记录 (包含知识点以及实验)
Lab0 实验环境准备与OpenCV Hello World
Lab1-1 OpenCV入门与实践——从基础操作到实时视频处理(一)
Lab1-2 OpenCV入门与实践——从基础操作到实时视频处理(二)
Lab2-1 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器!(一)
Lab2-2 从零玩转Eigen库:掌握线性代数与OpenCV互操作的神器!(二)
Lab4 Blending 线性混合与拉普拉斯金字塔混合对比
…
待更新
文章目录
0 任务
- 基础OpenCV操作
- 创建和操作图像数组(
Mat
) - 读取和显示图像(
imread
、imshow
) - 保存图像(
imwrite
) - 绘图和文本添加(
line
、circle
、putText
)
- 创建和操作图像数组(
- 实时视频处理
- 配置虚拟机以使用摄像头
- 获取并显示实时视频流
- 添加实时处理功能
- 灰度转换
- 颜色反转
- 直方图
- 边缘检测
2 实时视频处理
2.1 配置虚拟机以使用摄像头
在虚拟机中使用摄像头需要调整VMware的设置:
-
在VMware中,将USB控制器设置为“USB 3.1”;
-
启动Ubuntu虚拟机后,连接摄像头设备;
在 VMware 菜单中,找到可移动设备菜单中的摄像头,选择 “连接(从主机断开连接)”,然后摄像头就会连接到 VMware 中的 ubuntu。
-
使用
lsusb
命令检查摄像头是否被识别;
在 linux 终端中输入如下命令lsusb
-
运行 “Cheese” 应用程序测试摄像头(若 Cheese程序缺失,见文末)
如果视频闪烁,请选择首选项将分辨率更改为 640x480。
2.2 获取并显示实时视频
通过 OpenCV 的 VideoCapture 类,可以轻松获取摄像头视频流并显示。
2.2.1 参考代码
#include "opencv2/highgui.hpp"
#include <iostream>
int main(int argc, char *argv[])
{
// 打开默认摄像头
cv::VideoCapture input_stream(0);
if(!input_stream.isOpened())
{
std::cerr << "Could not open camera!\n";
return EXIT_FAILURE;
}
// 创建显示窗口
const std::string window_title = "Lab 1:Intro to OpenCV";
cv::namedWindow(window_title, cv::WINDOW_NORMAL);
cv::Mat frame;
while(true)
{
input_stream >> frame;// 读取一帧
if(frame.empty())
{
break;// 如果帧为空,退出循环}
cv::imshow("cam", frame);// 显示帧
// 按下任意键退出
if(cv::waitKey(15) >=0)
{
break;
}
}
// 释放摄像头资源
input_stream.release();
return 0;
}
运行结果:
2.2.2 函数说明
cv::VideoCapture
类
功能: 用于从摄像头或视频文件中捕获视频帧。
代码片段
cv::VideoCapture input_stream(0);
参数说明
0
:表示默认摄像头(通常是电脑的内置摄像头)。如果有多个摄像头,可以尝试1
、2
等
示例
cv::VideoCapture cap(0); // 打开默认摄像头
if (!cap.isOpened()) {
std::cerr << "无法打开摄像头!" << std::endl;
return -1;
}
isOpened()
:检查摄像头或视频文件是否成功打开。>>
:从摄像头或视频文件中读取一帧图像。std::cerr
:将错误信息输出到标准错误流(通常是控制台或终端)。
2.3 添加实时处理功能
在实时视频流中,可以添加各种图像处理功能,例如:
- 灰度转换: 将彩色视频转换为灰度视频。
- 反色处理: 反转视频的颜色。
- 显示直方图和实时视频:
- 边缘检测: 使用Canny算法检测视频中的边缘。
借助搜索引擎或 DeepSeek 尝试实现以上处理功能。
下面详细给出实现代码与解释。
2.3.1 灰度转换
cv::cvtColor()
函数
函数功能:将图像从一种颜色空间转换到另一种颜色空间
cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY);
参数说明
参数顺序 | 参数示例 | 含义 |
---|---|---|
1 | frame | 输入图像,此处彩色图像 |
2 | gray_frame | 输出图像,此处灰度图像 |
3 | cv::COLOR_BGR2GRAY | 颜色转换标志,此处从BGR彩色空间转换到灰度空间 |
示例代码
#include "opencv2/highgui.hpp"
#include "opencv2/imgproc.hpp"
#include <iostream>
int main(){
// Open Camera
cv::VideoCapture input_stream(0);
// check
if(! input_stream.isOpened()){
std::cerr<<"Could not open camera\n";
return EXIT_FAILURE;
}
// Create Display Window
const std::string window_tile = "Grayscale Video";
cv::namedWindow(window_tile,cv::WINDOW_NORMAL);
cv::Mat frame,gray_frame;
while (true){
// Capture a frame
input_stream >> frame;
if(frame.empty()){
break;
}
// Convert color to gray
cv::cvtColor(frame, gray_frame, cv::COLOR_BGR2GRAY);
// display gray frames
cv::imshow(window_tile, gray_frame);
// Press the Esc key to Exit
if(cv::waitKey(15) == 27){
break;
}
}
// Release resource