单目视觉相机测距代码c++
时间: 2023-10-04 08:05:52 浏览: 165
以下是使用OpenCV库实现单目视觉相机测距的C++代码示例:
```c++
#include <opencv2/opencv.hpp>
#include <iostream>
using namespace cv;
using namespace std;
int main()
{
Mat frame, gray;
VideoCapture cap(0); //打开摄像头
if (!cap.isOpened())
{
cout << "Failed to open camera!" << endl;
return -1;
}
while (true)
{
cap >> frame; //读取帧
if (frame.empty())
{
cout << "Failed to capture frame!" << endl;
break;
}
cvtColor(frame, gray, COLOR_BGR2GRAY); //转为灰度图
//检测棋盘格角点
Size boardSize(8, 6); //棋盘格大小
vector<Point2f> corners; //角点数组
bool found = findChessboardCorners(gray, boardSize, corners);
if (found) //成功检测到角点
{
drawChessboardCorners(frame, boardSize, corners, found); //绘制角点
//计算相机内参和畸变系数
Mat K, distCoeffs;
vector<Vec3f> rvecs, tvecs;
vector<Point3f> objectPoints;
for (int i = 0; i < boardSize.height; i++)
{
for (int j = 0; j < boardSize.width; j++)
{
objectPoints.push_back(Point3f(j * 2.5, i * 2.5, 0)); //棋盘格上每个角点的实际坐标
}
}
calibrateCamera(vector<vector<Point3f>>(1, objectPoints), vector<vector<Point2f>>(1, corners), gray.size(), K, distCoeffs, rvecs, tvecs);
//计算相机到棋盘格平面的距离
Mat rvec, tvec;
solvePnP(objectPoints, corners, K, distCoeffs, rvec, tvec);
double distance = -tvec.at<double>(2); //相机到棋盘格平面的距离(单位:毫米)
//显示距离
putText(frame, format("Distance: %.2f mm", distance), Point(20, 50), FONT_HERSHEY_SIMPLEX, 1, Scalar(0, 255, 0), 2);
}
imshow("Camera", frame);
if (waitKey(30) == 27) //按ESC键退出
break;
}
return 0;
}
```
该代码使用棋盘格标定相机,计算相机内参和畸变系数,并使用solvePnP函数计算相机到棋盘格平面的距离。请注意,在实际应用中,需要对距离进行进一步的校准和误差修正。
阅读全文
相关推荐



















