fixed problem with non 4:3 cameras (ticket #142)

pull/13383/head
Vadim Pisarevsky 14 years ago
parent 873b72edd9
commit 108fc3f4fe
  1. 13
      modules/highgui/src/cap_dshow.cpp

@ -2893,7 +2893,7 @@ public:
protected: protected:
void init(); void init();
int index; int index, width, height;
IplImage* frame; IplImage* frame;
static videoInput VI; static videoInput VI;
}; };
@ -2911,6 +2911,7 @@ CvCaptureCAM_DShow::CvCaptureCAM_DShow()
{ {
index = -1; index = -1;
frame = 0; frame = 0;
width = height = -1;
} }
void CvCaptureCAM_DShow::close() void CvCaptureCAM_DShow::close()
@ -2921,6 +2922,7 @@ void CvCaptureCAM_DShow::close()
index = -1; index = -1;
cvReleaseImage(&frame); cvReleaseImage(&frame);
} }
width = height = -1;
} }
// Initialize camera input // Initialize camera input
@ -2977,28 +2979,29 @@ double CvCaptureCAM_DShow::getProperty( int property_id )
bool CvCaptureCAM_DShow::setProperty( int property_id, double value ) bool CvCaptureCAM_DShow::setProperty( int property_id, double value )
{ {
int width = 0, height = 0;
switch( property_id ) switch( property_id )
{ {
case CV_CAP_PROP_FRAME_WIDTH: case CV_CAP_PROP_FRAME_WIDTH:
width = cvRound(value); width = cvRound(value);
height = width*3/4;
break; break;
case CV_CAP_PROP_FRAME_HEIGHT: case CV_CAP_PROP_FRAME_HEIGHT:
height = cvRound(value); height = cvRound(value);
width = height*4/3;
default: default:
return false; return false;
} }
if( width > 0 && height > 0 )
{
if( width != VI.getWidth(index) || height != VI.getHeight(index) ) if( width != VI.getWidth(index) || height != VI.getHeight(index) )
{ {
VI.stopDevice(index); VI.stopDevice(index);
VI.setupDevice(index, width, height); VI.setupDevice(index, width, height);
} }
width = height = -1;
return VI.isDeviceSetup(index); return VI.isDeviceSetup(index);
} }
return true;
}
CvCapture* cvCreateCameraCapture_DShow( int index ) CvCapture* cvCreateCameraCapture_DShow( int index )

Loading…
Cancel
Save