Aruco 期望什么图像编码?

What image encoding does Aruco expect?

我的应用程序接收可以具有 bayer_rggb8 编码的相机图像。我需要将这些图像转换为 bgr8/rgb8/mono8 吗?或者 Aruco 可以检测拜耳编码 cv::Mats 中的标记吗?

我正在使用 Aruco 3.0.10。下面是我正在使用的函数。

    /**Detects the markers in the image passed
        *
        * If you provide information about the camera parameters and the size of the marker, then, the extrinsics of
     * the markers are detected
        *
        * @param input input color image
        * @param detectedMarkers output vector with the markers detected
        * @param camParams Camera parameters
        * @param markerSizeMeters size of the marker sides expressed in meters
        * @param setYPerperdicular If set the Y axis will be perpendicular to the surface. Otherwise, it will be the
     * Z axis
        */
    void detect(const cv::Mat& input, std::vector<Marker>& detectedMarkers, CameraParameters camParams,
                float markerSizeMeters = -1, bool setYPerperdicular = false);

我试图只给它 bayer_rggb8 编码图像,这似乎有效(它检测标记)。但我想知道这是否可行,或者我是否只是幸运地获得了我的测试图像。

左:原图,误显示为brg8。右:图像 converted/color 插值到 BGR8 并用标记注释。 (在左侧图像上检测到标记。)

它接受 CV_8UC1 灰度图像 (​​mono8) 或 CV_8UC3 彩色图像 (bgr8)。它不适用于拜耳编码垫。


如有疑问,请检查源代码。

您可以看到aruco.cpp第一个操作是将图像转换为灰度:

_convertToGrey(_image.getMat(), grey);

函数_convertToGray接受CV_8UC1(已经可以)或CV_8UC3(转换为灰度):

static void _convertToGrey(InputArray _in, OutputArray _out) {

    CV_Assert(_in.getMat().channels() == 1 || _in.getMat().channels() == 3);

    _out.create(_in.getMat().size(), CV_8UC1);
    if(_in.getMat().type() == CV_8UC3)
        cvtColor(_in.getMat(), _out.getMat(), COLOR_BGR2GRAY);
    else
        _in.getMat().copyTo(_out);
}