C++利用OpenCV实现摄像头图像采集与拼接

雨后青山
雨后青山
发布时间:2026-10-16| 5人浏览过
原创

本文介绍如何使用 C++ 和 OpenCV 库在 Linux 环境下实现从 USB 摄像头实时采集单帧图像并完成拼接。内容涵盖环境配置、代码编译、核心函数解析及运行方法,适合需要进行简单图像处理或双目相机数据获取的开发者。

程序说明与背景

本程序旨在解决基于 C++ 的摄像头图像采集及拼接需求。主要功能包括:

  1. 实时采集:从连接的 USB 摄像头抓取单帧图像。
  2. 图像拼接:将两张或多张不同视角的单帧图像拼接成一张大图。
  3. 应用背景:最初设计用于支持利用 USB 双目摄像机进行双目测距的项目,可帮助快速获取左右眼图像。

程序分为两个主要部分:一是从双摄像头抓取并保存图像的源码;二是完成图像拼接的可执行程序。由于硬件限制,演示中使用了单个双目摄像机模拟两路输入,或将两个独立摄像头分别处理。

准备条件

在开始之前,请确保您的开发环境满足以下条件:

  • 操作系统:推荐 Ubuntu 14.04 或更高版本(兼容其他 Linux 发行版)。
  • 依赖库:已安装 OpenCV (建议 2.4.9 及以上版本) 和 pkg-config 工具。
  • 硬件:主机端口上已连接至少一个有效的 USB 摄像头。

项目结构与文件介绍

项目目录通常包含以下核心文件:

  • Camera_to_Frmae.cpp:负责从双摄像头实时抓取单帧图像的源码。
  • ImageJoint.cpp / ImageJoint2.cpp / ImageJoint3.cpp:分别用于完成两幅和三幅不同视角图像的拼接程序。
  • testusb.cpp:用于检测摄像头是否正常工作的测试程序。

代码编译指南

使用 g++ 编译器,并通过 pkg-config 自动获取 OpenCV 的头文件和链接库路径。假设源文件为 src.cpp,输出可执行文件为 dst,编译命令如下:

g++ -o dst src.cpp `pkg-config opencv --cflags --libs`

注意:命令行中的反引号 `` ` `` 是必须的,它用于执行命令替换。

核心代码解析

第1步:打开摄像头并设定参数

使用 VideoCapture 类初始化视频流,并通过 set()

void SetCam(int weigth, int height, int num)
{
    string a = "0";
    string Error;
    VideoCapture Cam(0); // 默认打开第一个摄像头
    
    /*设定缓冲区大小*/
    Cam.set(CV_CAP_PROP_FRAME_WIDTH, weigth);
    Cam.set(CV_CAP_PROP_FRAME_HEIGHT, height);

    // 检查摄像头是否成功打开
    while (!Cam.isOpened())
    {
        a = to_string(num);
        Error = "cannot open the camera!";
        // 错误处理逻辑...
    }
    
    // ... 后续捕获逻辑
}

第2步:读取帧并分割图像

在循环中,将读取到的整帧图像 (input_image) 根据坐标区域切割为左图和右图。这对于双目相机尤为重要,因为很多 USB 双目相机输出的是拼接好的宽图像。

// 假设 input_image 已包含一帧数据
leftImage = input_image(Rect(0, 0, input_image.size().width / 2, input_image.size().height));
rightImage = input_image(Rect(input_image.size().width / 2, 0, input_image.size().width / 2, input_image.size().height));

imshow("leftImage", leftImage);
imshow("rightImage", rightImage);

第3步:保存图像文件

通过 imwrite 将分割后的图像保存到指定路径。以下函数演示了如何按顺序编号保存图片:

void Save(int &imgnum, int amount)
{
    if (imgnum < amount)
    {
        string a = to_string(imgnum);
        int seat = floor((imgnum - 1) / 10);
        // 动态构建文件名路径... Left.replace(...) 逻辑略
        imwrite(Left, leftImage);
        imwrite(Right, rightImage);
        imgnum += 1;
    }
}

完整的主函数调用示例:

int main()
{
    const int weigth = 1280;
    const int height = 480;
    SetCam(weigth, height, 10);
    return 0;
}

程序的执行与退出

  1. 启动程序:在终端中运行编译生成的可执行文件,例如:./dst
  2. 观察效果:程序窗口会显示采集到的左右图像,并将结果保存至当前项目的 frame1 和 frame2 文件夹中。

如图所示,左侧为原始采集的左眼/左视角图像,右侧为右眼/右视角图像。

图像拼接效果

当使用专门的拼接程序(如 ImageJoint.cpp)时,系统会将上述保存的两张图像水平或垂直合并。以下是三张不同视角图像拼接后的效果图:

排错与建议

  • 摄像头无法打开:如果程序卡在 !Cam.isOpened() 循环,请检查 USB 接口供电是否充足,或者尝试更换摄像头索引(将 VideoCapture Cam(0) 改为 Cam(1) 等)。
  • 权限问题:在 Linux 下访问摄像头可能需要相应权限,确保用户属于 dialout 或 video 用户组。
  • 内存泄漏:长时间运行程序时,确保 waitKey() 被正确调用以刷新 GUI 事件队列,否则窗口可能会卡死。

以上就是基于 C++ 的摄像头图像采集及拼接程序的详细内容,更多关于 C++ OpenCV 图像处理及图像拼接的资料请关注本站其它相关文章!

相关标签:

免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。

Python 相关产品和应用

全部下载
Selenium

Selenium

4.51.0 · Windows

用于浏览器自动化和 Web 测试的 Python 工具。

scikit-learn

scikit-learn

1.9.1 · Windows

常用 Python 机器学习算法与模型评估工具库。

Black

Black

26.10.1 · Windows

强调一致性的 Python 自动代码格式化工具。

Ruff

Ruff

0.17.1 · macOS

由 Rust 编写的高速 Python 代码检查和格式化工具。

pytest

pytest

9.1.1 · Windows

简洁而强大的 Python 自动化测试框架。

FastAPI

FastAPI

0.146.0 · Windows

高性能 Python API 框架,支持类型提示和自动接口文档。

Flask

Flask

3.1.3 · Windows

轻量灵活的 Python Web 应用框架。

Django

Django

6.1.2 · Windows

成熟的 Python Web 框架,适合构建内容站点和业务系统。

Spyder

Spyder

6.1.7 · Windows

面向科学计算与数据分析的 Python 集成开发环境。

SciPy

SciPy

1.18.1 · Windows

面向科学、工程和技术计算的 Python 算法库。