Кажется, нет решения. Разрешение может быть увеличено до [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 .
События ActiveX обрабатываются через COM, так что вам нужно немного покопаться к сожалению .
С COM нужно помнить, что все обрабатывается через интерфейсы , поэтому обычно вам нужно создать два интерфейса: один для любых свойств и один для ваших событий.
Ключом для событий является маркировка вашего класса атрибутом ComSourceInterfaces, который описывается MSDN как «Определяет список интерфейсов, которые являются представлены как источники событий COM для атрибутированного класса. "
Эта простая структура классов должна работать на вас (она была для меня в прошлом).
namespace MyActiveX
{
[Guid("Your-GUID") ,InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IActiveXEvents
{
[DispId(1)]
void OnMouseClick(int index);
}
[Guid("Another-GUID"),InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
public interface IActiveX
{
//[DispId(1)]
// Any properties you want here like this
// string aProperty { get; set; }
}
[ComVisible(true)]
[Guid("Yet-Another-GUID"), ClassInterface(ClassInterfaceType.None)]
[ProgId("MyActiveX")]
[ComSourceInterfaces(typeof(IActiveXEvents))]
public partial class MyActiveX : UserControl, IActiveX
{
public delegate void OnMouseClickHandler(int index);
public event OnMouseClickHandler OnMouseClick;
// Dummy Method to use when firing the event
private void MyActiveX_nMouseClick(int index)
{
}
public MyActiveX()
{
InitializeComponent();
// Bind event
this.OnMouseClick = new OnMouseClickHandler(this.MyActiveX_MouseClick)
}
public void FireTheEvent()
{
int index = -1;
this.OnMouseClick(index);
}
}
}
Если вам не нужны какие-либо свойства, вы можете просто исключить интерфейс IActiveX . Также, если вы собираетесь использовать событие Click, вам нужно будет пометить его как новый , чтобы передать его в COM.