Можно ли по параметрам драйвера камеры определить снимает ли она в перевёрнутом режиме, или нет?

247
16 июля 2017, 12:06

Некоторые веб-камеры выдают перевёрнутые кадры, как правило из-за кривых драйверов.

На данный момент программа определяет "перевёртышей" выполняя поиск лица в кадре средствами OpenCV, но так как вебка - не профессиональная зеркальная камера, на кадре могут быть помехи, в результате которых лицо может найтись и в перевёрнутом кадре.

Можно ли средствами vfwcap32 или DirectShow по каким-либо параметрам драйвера определить, что камера перевёрнута? Если да, - что это за параметры и какими функциями WinAPI к ним достучаться?

Answer 1

Когда-то сталкивался с подобной проблемой при использовании Qt и OpenCV в одной связке. Причём кадры "переворачивались" исключительно на Windows для одной и той же вебкамеры.

В Qt имеется класс QVideoSurfaceFormat, который по перечислению Direction позволяет определить направление для рисования кадра: сверху вниз или снизу вверх. В исходниках Qt для плагина DirectShow в файле directshowmediatype.cpp имеется следующий метод:

QVideoSurfaceFormat::Direction DirectShowMediaType::scanLineDirection(QVideoFrame::PixelFormat pixelFormat, const BITMAPINFOHEADER &bmiHeader)
{
    /* MSDN http://msdn.microsoft.com/en-us/library/windows/desktop/dd318229(v=vs.85).aspx */
    /* For uncompressed RGB bitmaps:
     *    if biHeight is positive, the bitmap is a bottom-up DIB with the origin at the lower left corner.
     *    If biHeight is negative, the bitmap is a top-down DIB with the origin at the upper left corner.
     *
     * For YUV bitmaps:
     *    the bitmap is always top-down, regardless of the sign of biHeight.
     *    Decoders should offer YUV formats with postive biHeight, but for backward compatibility they should accept YUV formats with either positive or negative biHeight.
     *
     * For compressed formats:
     *    biHeight must be positive, regardless of image orientation.
     */
    switch (pixelFormat)
    {
    case QVideoFrame::Format_ARGB32:
    case QVideoFrame::Format_RGB32:
    case QVideoFrame::Format_RGB24:
    case QVideoFrame::Format_RGB565:
    case QVideoFrame::Format_RGB555:
        return bmiHeader.biHeight < 0
            ? QVideoSurfaceFormat::TopToBottom
            : QVideoSurfaceFormat::BottomToTop;
    default:
        return QVideoSurfaceFormat::TopToBottom;
    }
}

Соответственно, если имеется доступ к структуре BITMAPINFOHEADER, то вероятно можно определить, является ли кадр "перевёрнутым".

READ ALSO
Использование функции getche()

Использование функции getche()

Пытаюсь добиться от программы, чтобы она подсчитывала количество букв и словVisual Studio выводит ошибку, указывая на getche()

238
Условие с присваиванием

Условие с присваиванием

Программа выводит количество букв и словПочему, если ch = _getche() вынести из условия цикла в его тело, то в cout нужно указывать не chcount a (chcount - 1)?

201
Фиксация блока чекбоксом [требует правки]

Фиксация блока чекбоксом [требует правки]

При hover'e появляется панель с checkbox'oм, при нажатии на который панель фиксируется,а при снятии срабатывает hover

218
Пустая ячейка во flexbox

Пустая ячейка во flexbox

Есть обычный flebox с элементами:

316