c++ - 如何在 Leap Motion 上检测用于相机校准的棋盘?
问题描述
我正在尝试通过 OpenCV 的校准库和棋盘图案来校准 Leap Moion 设备,但它没有找到棋盘角。
我使用的是印在 DIN A3 纸上的 9x6 棋盘图案,该纸又安装在一张白色的大桌子上。当我拍摄场景快照并将图像直接传递给 OpenCV 的findChessboardCorners
函数时,什么也找不到。我首先想到,这可能是因为 Leap Motion 的原始图像中存在较大的黑色渐晕效果。我在文档中读到深色背景对该功能不利,并且可能无法正常工作。所以我想出了一种以编程方式“纠正”这种效果的方法,使边缘变得更亮(注意:实际场景中更多的光根本没有帮助)。但它仍然没有检测到角落。
原始图像
暗角校正后
这是一些代码
// img is the leap motion's raw image
leapMat.create(240, 640, CV_8UC1);
leapMat.data = const_cast<uchar*>(img.data());
// Vignetting correction
Mat leapMat_vig;
leapMat.copyTo(leapMat_vig);
for (int i = 0; i < leapMat_vig.rows; i++)
{
for (int j = 0; j < leapMat_vig.cols; j++)
{
double u = (double)(i - leapMat_vig.rows / 2) / leapMat_vig.rows;
double v = (double)(j - leapMat_vig.cols / 2) / leapMat_vig.cols;
double w = pow(u, 2) + pow(v, 2);
leapMat_vig.at<uchar>(i, j) += w * 2 * 255;
}
}
vector<Point2f> foundPoints;
// findChessboardCorners is not detecting my chessboard pattern
const auto found = findChessboardCorners(leapMat_vig, Size(6, 9), foundPoints, CALIB_CB_ADAPTIVE_THRESH + CALIB_CB_NORMALIZE_IMAGE + CALIB_CB_FAST_CHECK);
我也尝试将图像放大一点,但这仍然不起作用。
有谁知道我做错了什么或者我可以改进什么?
解决方案
推荐阅读
- excel - 使用 VBA 过滤和移动数据
- standardization - 使用 for 循环标准化数据框
- azure-container-instances - 如何在 Azure 的 Docker 映像中打开开发人员服务端点?
- reactjs - 单元测试子 React 组件时出错
- json - 如何使用 Terraform 在 AWS DMS 上加入多个 JSON 文件以进行表映射?
- c++ - 如何在 if 语句中比较 string* 和 const char*?
- python - 在python中使用explode时如何修复没有匹配元素计数的列
- firebase - 如何连接 Firebase 与 IntelliJ 社区版(Kotlin 控制台应用程序)
- reactjs - 如何使用 makeStore 函数动态确定 redux 工具包中的 RootState 类型
- javascript - 如果单击按钮时特定的“div”是“display:block”,那么父“div”如何淡出?