我正在尝试通过OpenCV的校准库和棋盘图案来校准Leap Moion设备,但找不到棋盘角。

我使用的是印在DIN A3纸上的9x6棋盘图案,然后将其安装在一张大白色桌子上。当我拍摄场景快照并将图像直接传递到OpenCV的findChessboardCorners函数中时,什么都没有找到。我首先想到,这可能是由于Leap Motion原始图像中出现了较大的黑色渐晕效果。我在文档中读到,深色背景对该功能不利,可能无法正常工作。因此,我想出了一种以编程方式“校正”此效果的方法,以使边缘变亮(请注意:实际场景中的更多光线完全没有帮助)。但是它仍然没有发现角落。

原始图像

c++ - 如何在Leap Motion上检测用于棋盘校准的棋盘?-LMLPHP

渐晕校正后

c++ - 如何在Leap Motion上检测用于棋盘校准的棋盘?-LMLPHP

这是一些代码

// 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);

我也尝试过稍微放大图像,但这仍然行不通。

有谁知道我在做什么错或我可以改善什么?

最佳答案

如果颜色造成了麻烦,您可以尝试通过掩盖白色来消除黑色背景,只保留棋盘区域(您可能要调查这个问题:klick!)。然后,一些直方图拉伸(stretch)/均衡(me!)将增加对比度,并有望解决您的问题。

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

关于c++ - 如何在Leap Motion上检测用于棋盘校准的棋盘?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/57094458/

10-12 22:45