为什么有些 aruco 标记在我的标记表上无法被检测到,除非我覆盖了它的一部分?

问题描述 投票:0回答:1

我创建了一个包含 3 种尺寸的 6x6 标记的工作表,这些标记都是唯一的且不重叠。 (这个想法是有多种尺寸,这样我就可以近距离移动相机,并且仍然可以看到至少一个小标记,并且可以从远处看到大标记)

我使用来自 DetectorParameters() 函数的默认 openCV 配置。

问题是并非所有标记都能被检测到,如下所示。

现在,有趣的是,当我覆盖左下标记时,突然,底部的其余标记出现了。 (看检测手指)

覆盖底部的其余部分使顶部的出现。

(我也知道r和b被切换了,这对我的问题没有影响,黑白图像也会发生)

我的问题是,我可以做一些事情来检测所有这些,无论是明智的设置还是以不同的方式生成工作表?我更希望能够立即检测到所有这些,这样我就可以记住该模式,而不必在设备之间共享文件。

opencv 网站还提到了标记之间的汉明距离,感觉它是相关的,但是我没有找到任何关于其实际含义的解释。

对于每个想查看代码的人,即使我在第一段中说过,我正在做的事情:

在 GExtension c++ 文件中:

cv::aruco::Dictionary dict;
cv::aruco::DetectorParameters params;
cv::aruco::ArucoDetector detector;

void aruco_generateDictionary(DictionaryTypes d)
{
    dict = cv::aruco::getPredefinedDictionary(d);
    
    params = cv::aruco::DetectorParameters();
    detector = cv::aruco::ArucoDetector(dict, params);
}

int aruco_detectMarkers(Ref<Image> imgRef)
{
    // ERR_PRINT("test");
    if (!imgRef.is_valid())
    {
        ERR_PRINT("invalid reference");
        return -1;
    }

    detector.detectMarkers(Opencv::g2cvImage(imgRef, imgData), markerCorners, markerIDs);

    return markerIDs.size();
}

在戈多中:

func _ready():
    camera.set(CamWrapper.SCAN_PROP_FRAME_WIDTH, 1920)
    camera.set(CamWrapper.SCAN_PROP_FRAME_HEIGHT, 1080)
    
    camera.open(0, CamWrapper.CAP_DSHOW)
    detector.setMaxFeatures(6000)
    scanner.aruco_generateDictionary(Scannur.DICT_6X6_1000)

func _process(delta):
    var img = camera.getImage()
    
    img.convert(Image.FORMAT_L8)
    
    texture = ImageTexture.create_from_image(img)
    
    scanner.aruco_detectMarkers(img)
    
    for m in %PanelContainer2.get_children():
        %PanelContainer2.remove_child(m)
    
    for i in range(scanner.getMarkerCount()):
        #for j in range(4):
        var v = scanner.getCorner(i,0)
        var m = Label.new()
        m.text = " " + str(scanner.getMarker(i))
        m.add_theme_color_override("font_color", Color(1,0,0))
        m.position = v
        m.top_level = true
        %PanelContainer2.add_child(m)
c++ opencv computer-vision godot aruco
1个回答
0
投票

事实证明,错误从来没有出现在检测中,而且它检测到了所有错误。

实际的问题是 godot 本身,以及它如何对元素进行排序,因为一些标记编号将显示在图像/相机纹理下。

我隐藏其中一个标记导致其他标记弹出,我必须考虑更好的可视化。

但是如果有人偶然发现这个问题并且可能有类似的问题或想要了解检测工作,或者想要实现自己的:

本教程介绍了aruco检测的工作原理:https://docs.opencv.org/4.x/d5/dae/tutorial_aruco_detection.html

在 opencv 存储库中的正方形示例中,您将找到一个如何检测正方形本身的示例: https://github.com/opencv/opencv/blob/4.x/samples/python/squares.py 目录样本中也有其他语言的类似内容。

© www.soinside.com 2019 - 2024. All rights reserved.