各位大佬好,萌新有一个问题请教。官方Demo生成的标定板是(150,150,150)的灰色的,之前打印的误差有点大。为了提高精度,我定制了一款黑白的标定板。在系统标定(第5步)时,投射出的投影仪标定图案和标定板重合,所以总是不成功,该如何解决?是不是这步的标定不能用黑白板?谢谢!
This thread has been locked.
If you have a related question, please click the "Ask a related question" button in the top right corner. The newly created question will be automatically linked to this question.
各位大佬好,萌新有一个问题请教。官方Demo生成的标定板是(150,150,150)的灰色的,之前打印的误差有点大。为了提高精度,我定制了一款黑白的标定板。在系统标定(第5步)时,投射出的投影仪标定图案和标定板重合,所以总是不成功,该如何解决?是不是这步的标定不能用黑白板?谢谢!
在 DLP-ALC-LIGHTCRAFTER-SDK-2.0\DLP-ALC-LIGHTCRAFTER-SDK\src\calibration
calibration_camera.cpp
749行有检测checker board的function,反馈每个对应的错误信息的.
Calibration::Camera::AddCalibrationBoard
// Check the image resolution
this->debug_.Msg("Checking calibration image resolution...");
unsigned int rows = 0;
unsigned int cols = 0;
calib_image.GetRows(&rows);
calib_image.GetColumns(&cols);
if((rows != this->image_rows_.Get()) ||
(cols != this->image_columns_.Get())){
return ret.AddError(CALIBRATION_IMAGE_RESOLUTION_INVALID);
}
// Copy the image
this->debug_.Msg("Copying calibration image...");
dlp::Image temp_calibration_image;
temp_calibration_image.Create(calib_image);
// If the image is RGB convert it to greyscale
this->debug_.Msg("Converting calibration image to monochrome...");
if(temp_calibration_image.ConvertToMonochrome().hasErrors())
return ret.AddError(CALIBRATION_IMAGE_CONVERT_TO_MONO_FAILED);
// Convert dlp::Image to cv::Mat
cv::Mat calibration_image_cv;
temp_calibration_image.GetOpenCVData(&calibration_image_cv);
// Look for the chessboard (checkerboard corners
this->debug_.Msg("Looking for chessboard corners in calibration image...");
std::vector<cv::Point2f> board_feature_locations_xy;
cv::Size board_feature_size(this->board_columns_.Get(),this->board_rows_.Get());
if (cv::findChessboardCorners(calibration_image_cv,
board_feature_size,
board_feature_locations_xy,
CV_CALIB_CB_ADAPTIVE_THRESH | CV_CALIB_CB_FILTER_QUADS )){
this->debug_.Msg("Chessboard corners found");
this->debug_.Msg("Refining corner locations...");
// Board was found. Refine the corner positions
// NOTE : Many of these arguments would be good parameter settings for calibration
cv::cornerSubPix(calibration_image_cv,
board_feature_locations_xy,
cv::Size(11, 11),
cv::Size(-1, -1),
cv::TermCriteria(CV_TERMCRIT_EPS | CV_TERMCRIT_ITER, 30, 0.1));
// Return success as true and increment counter
(*success) = true;
this->board_number_successes_++;
// Add this calibration image's corners to the list
this->image_points_xy_.push_back(board_feature_locations_xy);
this->object_points_xyz_.push_back(this->calibration_board_feature_points_xyz_);
this->debug_.Msg("Calibration image added");
}
else{
this->debug_.Msg("No chessboard corners found in calibration image");
(*success) = false;
ret.AddError(CALIBRATION_BOARD_NOT_DETECTED);
}
// Release the cv image
calibration_image_cv.release();
return ret;
DLP_3D_SDK_DLP4500.pdf按照提示的信息更改,通常的问题点参考附件.