Увеличение разрешения захвата изображения камерой в OpenCV

Удивленный никто не упомянул об этом:

public Task BlahAsync()
{
    // ...
}

int result = BlahAsync().GetAwaiter().GetResult();

Не так хорошо, как некоторые из других методов здесь, но он имеет следующие преимущества:

  • )
  • не будет содержать никаких исключений, которые были выбраны в AggregateException (например Result)
  • работает как для Task, так и для Task ( попробуйте сами! )

Кроме того, поскольку GetAwaiter утиный, это должно работать для любого объекта, который возвращается из async (например, ConfiguredAwaitable или YieldAwaitable), а не только Задачи.


edit: Обратите внимание, что этот подход (или использование .Result) возможен в тупик, если вы не убедитесь добавлять .ConfigureAwait(false) каждый раз, когда вы ожидаете, для всех асинхронных методов, которые могут быть достигнуты с BlahAsync() (а не только с теми, которые он вызывает напрямую). Объяснение .

// In BlahAsync() body
await FooAsync(); // BAD!
await FooAsync().ConfigureAwait(false); // Good... but make sure FooAsync() and
                                        // all its descendants use ConfigureAwait(false)
                                        // too. Then you can be sure that
                                        // BlahAsync().GetAwaiter().GetResult()
                                        // won't deadlock.

Если вы слишком ленивы, чтобы добавить .ConfigureAwait(false) повсюду, и вы не заботитесь о производительности, вы также можете сделать

Task.Run(() => BlahAsync()).GetAwaiter().GetResult()

51
задан Mark Biek 31 August 2008 в 01:40
поделиться

5 ответов

Кажется, нет решения. Разрешение может быть увеличено до [1 110] 640x480 использование этот взлом совместно использованный на lifebelt77. Вот воспроизведенные детали:

Добавляют к [1 111] highgui.h:

#define CV_CAP_PROP_DIALOG_DISPLAY 8
#define CV_CAP_PROP_DIALOG_FORMAT 9
#define CV_CAP_PROP_DIALOG_SOURCE 10
#define CV_CAP_PROP_DIALOG_COMPRESSION 11
#define CV_CAP_PROP_FRAME_WIDTH_HEIGHT 12

Добавляют функцию icvSetPropertyCAM_VFW к [1 113] cvcap.cpp:

static int icvSetPropertyCAM_VFW( CvCaptureCAM_VFW* capture, int property_id, double value )
{
    int result = -1;
    CAPSTATUS capstat;
    CAPTUREPARMS capparam;
    BITMAPINFO btmp;

    switch( property_id )
    {
        case CV_CAP_PROP_DIALOG_DISPLAY:
            result = capDlgVideoDisplay(capture->capWnd);
            //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEODISPLAY,0,0);
            break;

        case CV_CAP_PROP_DIALOG_FORMAT:
            result = capDlgVideoFormat(capture->capWnd);
            //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOFORMAT,0,0);
            break;

        case CV_CAP_PROP_DIALOG_SOURCE:
            result = capDlgVideoSource(capture->capWnd);
            //SendMessage(capture->capWnd,WM_CAP_DLG_VIDEOSOURCE,0,0);
            break;

        case CV_CAP_PROP_DIALOG_COMPRESSION:
            result = capDlgVideoCompression(capture->capWnd);
            break;

        case CV_CAP_PROP_FRAME_WIDTH_HEIGHT:
            capGetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO));
            btmp.bmiHeader.biWidth = floor(value/1000);
            btmp.bmiHeader.biHeight = value-floor(value/1000)*1000;
            btmp.bmiHeader.biSizeImage = btmp.bmiHeader.biHeight *
            btmp.bmiHeader.biWidth * btmp.bmiHeader.biPlanes *
            btmp.bmiHeader.biBitCount / 8;
            capSetVideoFormat(capture->capWnd, &btmp, sizeof(BITMAPINFO));
            break;

        default:
            break;
    }

    return result;
}

и редактирование captureCAM_VFW_vtable как следующее:

static CvCaptureVTable captureCAM_VFW_vtable =
{
6,
(CvCaptureCloseFunc)icvCloseCAM_VFW,
(CvCaptureGrabFrameFunc)icvGrabFrameCAM_VFW,
(CvCaptureRetrieveFrameFunc)icvRetrieveFrameCAM_VFW,
(CvCaptureGetPropertyFunc)icvGetPropertyCAM_VFW,
(CvCaptureSetPropertyFunc)icvSetPropertyCAM_VFW, // was NULL
(CvCaptureGetDescriptionFunc)0
};

Теперь восстановил highgui.dll .

17
ответ дан Ashwin Nanjappa 7 November 2019 в 20:14
поделиться

Я использую openCV 1.1pre1 в соответствии с Windows (videoinput, библиотекой пользуется по умолчанию эта версия openCv под окнами).

С этими инструкциями я могу установить разрешение камеры. Обратите внимание, что я называю старый cvCreateCameraCapture вместо cvCaptureFromCam.

capture = cvCreateCameraCapture(cameraIndex);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, 640 );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, 480 );


videoFrame = cvQueryFrame(capture);

Я протестировал его с Logitech, Доверием и веб-камерами Philips

42
ответ дан oxilumin 7 November 2019 в 10:14
поделиться
cvQueryFrame(capture);

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size );

cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size);

cvQueryFrame(capture);

должно хватить!

-3
ответ дан 7 November 2019 в 10:14
поделиться

Я настоятельно рекомендую использовать lib VideoInput , он поддерживает любое устройство DirectShow (даже несколько устройств одновременно) и более настраивается. Вы проведете пять минут, заставляют его играть с OpenCV.

5
ответ дан martjno 7 November 2019 в 20:14
поделиться

Я сделал обработку изображений в Linux прежде и пропустил OpenCV, созданный при закрытых дверях функциональность, потому что это (поскольку Вы обнаружили), неполный.

В зависимости от Вашей ОС у Вас может быть больше удачи при движении прямо в аппаратные средства через нормальные каналы в противоположность через openCV. Если Вы используете Linux, video4linux, или video4linux2 должен предоставить Вам относительно тривиальный доступ к веб-камерам USB, и можно использовать libavc1394 для firewire. В зависимости от устройства и качества примера кода Вы следуете, необходимо быть в состоянии получить устройство, работающее с параметрами, которые Вы хотите через час или два.

Отредактированный для добавления: Вы самостоятельно если его Windows. Я предполагаю, что это не намного более трудно, но я никогда не делал его.

5
ответ дан Louis Brandy 7 November 2019 в 20:14
поделиться
Другие вопросы по тегам:

Похожие вопросы: