双目摄像机(深度相机)——使用OpenCV打开双目摄像机

设备信息

我使用的是金乾象KS1A552-D双目摄像头。它由一根USB-typeC数据线向电脑传递双摄像头的视频数据。具体参数如下:

 计算机处理器为intel 9th Gen-i5、编译器为pycharm。

调用流程

调用的代码非常多,可以自行搜索,我只强调调用摄像头过程中遇到问题的地方。

 1.导入opencv包,创建左右窗口的名字

import cv2 as cv2
cv2.namedWindow('left')
cv2.namedWindow('right')

2.开启摄像头

camera = cv2.VideoCapture(1) 

一定一定要注意cv2.VideoCapture(1),这个“1”是会根据摄像头连接的序号不同的。我这里是“1”,你的可能是“0”“2”,如果在这一行报错,可以尝试修改这里。

3.摄像头参数设定

camera.set(cv2.CAP_PROP_FRAME_WIDTH, 2560) 
camera.set(cv2.CAP_PROP_FRAME_HEIGHT, 720) 
camera.set(cv2.CAP_PROP_FPS, 60)
camera.se
实现效果:http://v.youku.com/v_show/id_XMTU2Mzk0NjU3Ng==.html 如何在你的电脑上运行这个程序? 1,它需要cvblobslib这一个opencv的扩展库来实现检测物体与给物体画框的功能,具体安装信息请见: http://dsynflo.blogspot.com/2010/02/cvblobskib-with-opencv-installation.html,当你配置好cvblobslib之后,你可以用这一的程序进行测试:http://dl.dropbox.com/u/110310945/Blobs%20test.rar 2,视频中两个摄像头之间的距离是6cm,你可以根据你摄像头的型号,来选择合适的距离来达到最好的效果。 3,在进行测距之前,首先需要对摄像头进行标定,那么如何标定呢? 在stdafx.h中把"#define CALIBRATION 0"改成 “#define CALIBRATION 1”表示进行标定,标定之后,你就可以在工程目录下的"CalibFile" 文件夹中得到标定信息的文件。如果标定效果还不错,你就可以吧"#define CALIBRATION " 改成0,以后就不需要再标定,直接使用上一次的标定信息。你还需要把"#define ANALYSIS_MODE 1"这行代码放到stdafx.h中。 4,视频中使用的是10*7的棋牌格,共摄录40帧来计算摄像头的各种参数,如果你像使用其他棋盘格,可以在 "StereoFunctions.cpp"文件中修改相应参数。 5,如果你无法打开摄像头,可以在 "StereoGrabber.cpp"文件中修改代码“cvCaptureFromCAM(index)”中index的值。 6,About computing distance: it interpolates the relationship between depth-value and real-distance to third degree polynomial. So i used excel file "interpolation" for interpolation to find k1 to k4, you should find your own value of these parameters. 7,你可以通过调整控制窗口中各个参数的滑块,从而来得到更好的视差图。 8,在目录下的”distance“文件夹中,有计算距离信息的matlab代码。 9,如果你想了解基本的理论,可以看一下这个文档:http://scholar.lib.vt.edu/theses/available/etd-12232009-222118/unrestricted/Short_NJ_T_2009.pdf 视频中环境:vs2008,opencv2.1
### 使用 OpenCV 处理双目相机拍摄的照片 为了使用 OpenCV 处理双目相机拍摄的照片并生成深度图,需遵循一系列特定的操作流程。这不仅涉及到了解双目视觉原理,还需要掌握具体的编程实现。 #### 获取校准参数 在处理之前,必须先获得摄像机的固定物理属性,包括但不限于两只摄像头各自的焦距、光学中心以及两者间的距离(三维坐标)。这些数据对于后续计算至关重要[^2]。 #### 加载图像 假设已经通过双目相机获得了两张同步拍摄的不同视角下的图像,则可以利用 `cv::imread` 函数加载这两张图片: ```cpp #include <opencv2/opencv.hpp> // Load images from file or capture device. cv::Mat imgLeft = cv::imread("left_image.png"); cv::Mat imgRight = cv::imread("right_image.png"); if (imgLeft.empty() || imgRight.empty()) { std::cerr << "Error loading image!" << std::endl; } ``` #### 图像预处理 通常情况下,原始采集到的数据可能含有噪声或其他干扰因素,因此建议对输入图像执行必要的滤波和平滑操作来提高匹配精度。例如应用高斯模糊减少高频成分的影响: ```cpp cv::GaussianBlur(imgLeft, imgLeft, cv::Size(5, 5), 0); cv::GaussianBlur(imgRight, imgRight, cv::Size(5, 5), 0); ``` #### 计算视差图 接下来就是核心部分——基于立体匹配算法构建视差图。这里推荐采用半全局块匹配(SGBM),因为它能在效率与准确性之间取得良好平衡: ```cpp int numDisparities = 16 * 5; // Number of disparities must be divisible by 16 and greater than zero int blockSize = 9; cv::Ptr<cv::StereoSGBM> sgbm = cv:: StereoSGBM ::create( 0, // min disparity numDisparities, blockSize); sgbm->setPreFilterCap(63); sgbm->setUniquenessRatio(10); sgbm->setSpeckleWindowSize(100); sgbm->setSpeckleRange(32); sgbm->setDisp12MaxDiff(1); cv::Mat disp; sgbm->compute(imgLeft, imgRight, disp); ``` #### 转换为可视化形式 由于得到的结果是以像素位移表示的距离差异矩阵,所以还需进一步转换成更直观的形式供观察分析: ```cpp disp.convertTo(disp, CV_8U, 255/(numDisparities*16.)); imshow("disparity", disp); waitKey(); ``` 以上即完成了基本框架搭建工作;当然实际项目里还涉及到更多细节调整优化等问题待解决。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值