如何在 Leap Motion 上检测用于相机校准的棋盘?

Posted

技术标签:

【中文标题】如何在 Leap Motion 上检测用于相机校准的棋盘?【英文标题】:How to detect a chessboard for camera calibration on the Leap Motion? 【发布时间】:2019-07-18 12:26:55 【问题描述】:

我正在尝试通过 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);

我也尝试将图像放大一点,但这仍然不起作用。

有没有人知道我做错了什么或者我可以改进什么?

【问题讨论】:

【参考方案1】:

如果颜色引起了麻烦,您可以尝试通过将黑色背景遮盖为白色来去除黑色背景,只留下棋盘区域(您可能想研究这个问题:klick!)。然后,一些直方图拉伸/均衡 (me!) 会增加对比度并有望解决您的问题。

我最近在 Python 中做了类似的事情——在增加了对比度并丢失了不好的信息之后——它就像一个魅力。文档条目末尾的注释 - 我认为您指的是? (please!) - 支持这种方法。

【讨论】:

谢谢您的回答。直方图均衡有很大帮助。但是,我需要添加一些进一步的图像预处理,例如缩放、锐化和获取感兴趣区域 (ROI)。尽管如此,在任何场景中都不会检测到该图案,但前提是它与相机镜头非常平行。

以上是关于如何在 Leap Motion 上检测用于相机校准的棋盘?的主要内容,如果未能解决你的问题,请参考以下文章

强大的相机校准

基于unity3D游戏引擎与leap motion体感控制器的体感音乐交互类游戏

如何利用Leap Motion创建支持手势操控的Web游戏

如何把leapmotion连到手机上

如何利用Leap Motion创建支持手势操控的Web游戏

如何在Unity中开发Leap Motion桌面版(Non-VR)APP