折腾了结构光视觉已有一个月之久了,代码不易,且调且珍惜啊!遇到的主要问题如下:
1.OpenCV的速度真心慢,无论是相移还是格雷码,开源的要慎重啊!
2.立体矫正之后的图片进行三维重建,Failed!这个问题很致命,目前一直没搞懂,问题出在哪,继续摸索吧!
核心代码如下,参考OpenCV3.1的例子:
// 初始化
size_t numberOfPatternImages = graycode_Decoder->getNumberOfPatternImages();//42
vector<vector<Mat>> captured_pattern;
captured_pattern.resize(2);
captured_pattern[0].resize(numberOfPatternImages);
captured_pattern[1].resize(numberOfPatternImages);
// 全白图像,白色图案编码
Mat color = imread(imagelist[numberOfPatternImages], IMREAD_COLOR);
Size imagesSize = color.size();
// 立体校正
Mat R1, R2, P1, P2, Q;
Rect validRoi[2];
stereoRectify(cam1intrinsics, cam1distCoeffs, cam2intrinsics, cam2distCoeffs, imagesSize, R, T, R1, R2, P1, P2, Q,
0, -1, imagesSize, &validRoi[0], &validRoi[1]);
Mat map1x, map1y, map2x, map2y;
initUndistortRectifyMap(cam1intrinsics, cam1distCoeffs, R1, P1, imagesSize, CV_32FC1, map1x, map1y);
initUndistortRectifyMap(cam2intrinsics, cam2distCoeffs, R2, P2, imagesSize, CV_32FC1, map2x, map2y);
// 导入图像
for (size_t i = 0; i < numberOfPatternImages; i++)
{
// 0-41
captured_pattern[0][i] = imread(imagelist[i], IMREAD_GRAYSCALE);
// 44-87
captured_pattern[1][i] = imread(imagelist[i + numberOfPatternImages + 2], IMREAD_GRAYSCALE);
if ((!captured_pattern[0][i].data) || (!captured_pattern[1][i].data))
{
return;
}
remap(captured_pattern[1][i], captured_pattern[1][i], map1x, map1y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
remap(captured_pattern[0][i], captured_pattern[0][i], map2x, map2y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
}
// 导入全白全黑背景图案
vector<Mat> blackImages;
vector<Mat> whiteImages;
blackImages.resize(2);
whiteImages.resize(2);
whiteImages[0] = imread(imagelist[numberOfPatternImages], IMREAD_GRAYSCALE);//42
blackImages[0] = imread(imagelist[numberOfPatternImages + 1], IMREAD_GRAYSCALE);//43
whiteImages[1] = imread(imagelist[2 * numberOfPatternImages + 2], IMREAD_GRAYSCALE);//86
blackImages[1] = imread(imagelist[2 * numberOfPatternImages + 2 + 1], IMREAD_GRAYSCALE);//87
//INTER_NEAREST, BORDER_CONSTANT, Scalar());
remap(color, color, map2x, map2y, INTER_NEAREST, BORDER_CONSTANT, Scalar());
remap(whiteImages[0], whiteImages[0], map2x, map2y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
remap(whiteImages[1], whiteImages[1], map1x, map1y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
remap(blackImages[0], blackImages[0], map2x, map2y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
remap(blackImages[1], blackImages[1], map1x, map1y, CV_INTER_LINEAR, BORDER_CONSTANT, Scalar(0, 0, 0));
// 解码
Mat disparityMap;
bool decoded = graycode_Decoder->decode(captured_pattern, disparityMap, blackImages, whiteImages, structured_light::DECODE_3D_UNDERWORLD);