Какую кодировку изображений ожидает Aruco? - PullRequest
0 голосов
/ 23 мая 2018

Мое приложение получает изображения с камеры, которые могут иметь кодировку bayer_rggb8.Нужно ли конвертировать эти изображения в bgr8 / rgb8 / mono8?Или Aruco может обнаруживать маркеры в кодировке Байера cv::Mat s?

Я использую 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.Справа: изображение преобразовано / цвета интерполированы в BGR8 и помечены маркером.(Маркер был обнаружен на левом изображении.) enter image description here

1 Ответ

0 голосов
/ 23 мая 2018

Он принимает либо 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);
}
...