develop #21
@ -1278,7 +1278,7 @@ Mat get_magic_wand_image(Mat src,int x,int y,float max,float min)
|
|||||||
return matDst;
|
return matDst;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool camera_calibration(Mat gray,cv::Size patternSize,cv::Mat& cameraMatrix,cv::Mat& distCoeffs)
|
bool camera_calibration(Mat gray,cv::Size patternSize,float grid_size,cv::Mat& cameraMatrix,cv::Mat& distCoeffs,float& pixel_size)
|
||||||
{
|
{
|
||||||
if(gray.type() != CV_8UC1)
|
if(gray.type() != CV_8UC1)
|
||||||
{
|
{
|
||||||
@ -1310,12 +1310,46 @@ bool camera_calibration(Mat gray,cv::Size patternSize,cv::Mat& cameraMatrix,cv::
|
|||||||
cameraMatrix = cv::Mat::eye(3, 3, CV_64F); // 相机矩阵初始化
|
cameraMatrix = cv::Mat::eye(3, 3, CV_64F); // 相机矩阵初始化
|
||||||
distCoeffs = cv::Mat::zeros(8, 1, CV_64F); // 畸变系数初始化
|
distCoeffs = cv::Mat::zeros(8, 1, CV_64F); // 畸变系数初始化
|
||||||
std::vector<cv::Mat> rvecs, tvecs;
|
std::vector<cv::Mat> rvecs, tvecs;
|
||||||
int calibrationFlags = cv::CALIB_ZERO_TANGENT_DIST + // 假设无切向畸变
|
int calibrationFlags = 0;
|
||||||
cv::CALIB_FIX_K4 + // 固定第四个畸变参数(通常为0)
|
|
||||||
cv::CALIB_FIX_K5; // 固定第五个畸变参数(通常为0)
|
|
||||||
calibrationFlags = 0;
|
|
||||||
TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 30, DBL_EPSILON);
|
TermCriteria criteria = TermCriteria(TermCriteria::MAX_ITER + TermCriteria::EPS, 30, DBL_EPSILON);
|
||||||
cv::calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs,calibrationFlags,criteria);
|
cv::calibrateCamera(objectPoints, imagePoints, gray.size(), cameraMatrix, distCoeffs, rvecs, tvecs,calibrationFlags,criteria);
|
||||||
|
|
||||||
|
vector<Point2f> undistortedCorners;
|
||||||
|
undistortPoints(corners, undistortedCorners, cameraMatrix, distCoeffs);
|
||||||
|
|
||||||
|
std::vector<cv::Point3f> homogeneousPoints;
|
||||||
|
for (const auto& p : undistortedCorners) {
|
||||||
|
homogeneousPoints.push_back(cv::Point3f(p.x, p.y, 1.0f)); // 将 (x, y) 转换为 (x, y, 1)
|
||||||
|
}
|
||||||
|
std::vector<cv::Point2f> pixelPoints;
|
||||||
|
for (const auto& p : homogeneousPoints) {
|
||||||
|
cv::Mat pointMat = (cv::Mat_<double>(3, 1) << p.x, p.y, p.z);
|
||||||
|
cv::Mat transformedPoint = cameraMatrix * pointMat;
|
||||||
|
float x = transformedPoint.at<double>(0, 0) / transformedPoint.at<double>(2, 0);
|
||||||
|
float y = transformedPoint.at<double>(1, 0) / transformedPoint.at<double>(2, 0);
|
||||||
|
pixelPoints.push_back(cv::Point2f(x, y));
|
||||||
|
}
|
||||||
|
int numCols = patternSize.width;
|
||||||
|
int numRows = patternSize.height;
|
||||||
|
float meanSideLength = 0;
|
||||||
|
int num = 0;
|
||||||
|
for (int i = 0; i < (patternSize.height - 1); ++i) {
|
||||||
|
for (int j = 0; j < (patternSize.width - 1); ++j) {
|
||||||
|
int index = i * patternSize.width + j;
|
||||||
|
if (j + 1 < numCols) {
|
||||||
|
float width = static_cast<float>(norm(pixelPoints[index] - pixelPoints[index + 1]));
|
||||||
|
meanSideLength+=(width);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
if (i + 1 < patternSize.height) {
|
||||||
|
float height = static_cast<float>(norm(pixelPoints[index] - pixelPoints[index + numCols]));
|
||||||
|
meanSideLength+=(height);
|
||||||
|
num++;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
meanSideLength /= num;
|
||||||
|
pixel_size = grid_size/meanSideLength;
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user