用c++写一个双目摄像头测距的程序
时间: 2023-09-11 11:09:23 浏览: 178
好的,双目摄像头测距是一种基于视差的三维重建方法,可以通过计算两个摄像头拍摄同一场景的图像之间的视差来得到场景中物体的深度信息。下面是一个简单的C++程序,可以实现基于OpenCV库的双目摄像头测距:
```c++
#include <iostream>
#include <opencv2/opencv.hpp>
using namespace std;
using namespace cv;
int main()
{
// 打开左右摄像头
VideoCapture cap_L(0);
VideoCapture cap_R(1);
if (!cap_L.isOpened() || !cap_R.isOpened()) {
cout << "无法打开摄像头" << endl;
return -1;
}
// 设置摄像头参数
cap_L.set(CAP_PROP_FRAME_WIDTH, 640);
cap_L.set(CAP_PROP_FRAME_HEIGHT, 480);
cap_R.set(CAP_PROP_FRAME_WIDTH, 640);
cap_R.set(CAP_PROP_FRAME_HEIGHT, 480);
// 创建窗口
namedWindow("Left", WINDOW_NORMAL);
namedWindow("Right", WINDOW_NORMAL);
// 创建StereoBM对象
int blockSize = 32;
int numDisparities = 64;
Ptr<StereoBM> bm = StereoBM::create(numDisparities, blockSize);
// 不断读取视频流
while (true) {
Mat frame_L, frame_R;
cap_L.read(frame_L);
cap_R.read(frame_R);
// 转换为灰度图
Mat gray_L, gray_R;
cvtColor(frame_L, gray_L, COLOR_BGR2GRAY);
cvtColor(frame_R, gray_R, COLOR_BGR2GRAY);
// 计算视差图
Mat disp;
bm->compute(gray_L, gray_R, disp);
// 归一化视差图
normalize(disp, disp, 0, 255, NORM_MINMAX, CV_8U);
// 显示图像
imshow("Left", frame_L);
imshow("Right", frame_R);
imshow("Disparity", disp);
// 等待按键事件
int key = waitKey(1);
if (key == 27) break; // 按下ESC键退出
}
// 释放资源
cap_L.release();
cap_R.release();
destroyAllWindows();
return 0;
}
```
这个程序会打开两个摄像头(左摄像头编号为0,右摄像头编号为1),通过计算视差图来得到深度信息,并将图像显示在窗口中。可以根据实际情况调整摄像头参数和StereoBM对象的参数来得到更好的效果。
阅读全文