Удивленный никто не упомянул об этом:
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()
Кажется, нет решения. Разрешение может быть увеличено до [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 .
Я использую 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
cvQueryFrame(capture);
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_WIDTH, any_supported_size );
cvSetCaptureProperty( capture, CV_CAP_PROP_FRAME_HEIGHT, any_supported_size);
cvQueryFrame(capture);
должно хватить!
Я настоятельно рекомендую использовать lib VideoInput , он поддерживает любое устройство DirectShow (даже несколько устройств одновременно) и более настраивается. Вы проведете пять минут, заставляют его играть с OpenCV.
Я сделал обработку изображений в Linux прежде и пропустил OpenCV, созданный при закрытых дверях функциональность, потому что это (поскольку Вы обнаружили), неполный.
В зависимости от Вашей ОС у Вас может быть больше удачи при движении прямо в аппаратные средства через нормальные каналы в противоположность через openCV. Если Вы используете Linux, video4linux, или video4linux2 должен предоставить Вам относительно тривиальный доступ к веб-камерам USB, и можно использовать libavc1394 для firewire. В зависимости от устройства и качества примера кода Вы следуете, необходимо быть в состоянии получить устройство, работающее с параметрами, которые Вы хотите через час или два.
Отредактированный для добавления: Вы самостоятельно если его Windows. Я предполагаю, что это не намного более трудно, но я никогда не делал его.