C++利用OpenCV实现摄像头图像采集与拼接
本文介绍如何使用 C++ 和 OpenCV 库在 Linux 环境下实现从 USB 摄像头实时采集单帧图像并完成拼接。内容涵盖环境配置、代码编译、核心函数解析及运行方法,适合需要进行简单图像处理或双目相机数据获取的开发者。
程序说明与背景
本程序旨在解决基于 C++ 的摄像头图像采集及拼接需求。主要功能包括:
- 实时采集:从连接的 USB 摄像头抓取单帧图像。
- 图像拼接:将两张或多张不同视角的单帧图像拼接成一张大图。
- 应用背景:最初设计用于支持利用 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;
}
程序的执行与退出
- 启动程序:在终端中运行编译生成的可执行文件,例如:
./dst - 观察效果:程序窗口会显示采集到的左右图像,并将结果保存至当前项目的
frame1和frame2文件夹中。
如图所示,左侧为原始采集的左眼/左视角图像,右侧为右眼/右视角图像。
图像拼接效果
当使用专门的拼接程序(如 ImageJoint.cpp)时,系统会将上述保存的两张图像水平或垂直合并。以下是三张不同视角图像拼接后的效果图:
排错与建议
- 摄像头无法打开:如果程序卡在
!Cam.isOpened()循环,请检查 USB 接口供电是否充足,或者尝试更换摄像头索引(将VideoCapture Cam(0)改为Cam(1)等)。 - 权限问题:在 Linux 下访问摄像头可能需要相应权限,确保用户属于
dialout或video用户组。 - 内存泄漏:长时间运行程序时,确保
waitKey()被正确调用以刷新 GUI 事件队列,否则窗口可能会卡死。
以上就是基于 C++ 的摄像头图像采集及拼接程序的详细内容,更多关于 C++ OpenCV 图像处理及图像拼接的资料请关注本站其它相关文章!
本站声明
本文内容仅供参考,不代表本站观点。转载或引用请注明出处。如发现内容问题,请通过联系我们页面反馈。













