【IPMV】Lab1-2 OpenCV入门与实践——从基础操作到实时视频处理(二)

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
    • 读取和显示图像(imreadimshow
    • 保存图像(imwrite
    • 绘图和文本添加(linecircleputText
  • 实时视频处理
    • 配置虚拟机以使用摄像头
    • 获取并显示实时视频流
    • 添加实时处理功能
      • 灰度转换
      • 颜色反转
      • 直方图
      • 边缘检测

2 实时视频处理

2.1 配置虚拟机以使用摄像头

在虚拟机中使用摄像头需要调整VMware的设置:

  1. 在VMware中,将USB控制器设置为“USB 3.1”;
    USB设置

  2. 启动Ubuntu虚拟机后,连接摄像头设备;
    在 VMware 菜单中,找到可移动设备菜单中的摄像头,选择 “连接(从主机断开连接)”,然后摄像头就会连接到 VMware 中的 ubuntu。
    虚拟机连接摄像头

  3. 使用lsusb命令检查摄像头是否被识别;
    在 linux 终端中输入如下命令

    lsusb
    

    lsusb检查

  4. 运行 “Cheese” 应用程序测试摄像头(若 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 函数说明
  1. cv::VideoCapture

功能: 用于从摄像头或视频文件中捕获视频帧。

代码片段

cv::VideoCapture input_stream(0);

参数说明

  • 0:表示默认摄像头(通常是电脑的内置摄像头)。如果有多个摄像头,可以尝试 12

示例

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
   
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值