allow specifying apiPreference in VideoCapture when opening a file. Add

a separate function instead of an overload not to change the ABI.

rename VideoCapture paramter 'device' to 'index' in CPP to reflect that
it allows specifying the API.
update comments to explain how to specify the API.
This commit is contained in:
Pavel Rojtberg 2015-05-12 17:43:28 +02:00
parent cd8143be0a
commit 41d8c4d879
3 changed files with 92 additions and 44 deletions

View File

@ -90,7 +90,10 @@ enum { CAP_ANY = 0, // autodetect
CAP_INTELPERC = 1500, // Intel Perceptual Computing SDK CAP_INTELPERC = 1500, // Intel Perceptual Computing SDK
CAP_OPENNI2 = 1600, // OpenNI2 (for Kinect) CAP_OPENNI2 = 1600, // OpenNI2 (for Kinect)
CAP_OPENNI2_ASUS = 1610, // OpenNI2 (for Asus Xtion and Occipital Structure sensors) CAP_OPENNI2_ASUS = 1610, // OpenNI2 (for Asus Xtion and Occipital Structure sensors)
CAP_GPHOTO2 = 1700 // gPhoto2 connection CAP_GPHOTO2 = 1700, // gPhoto2 connection
CAP_GSTREAMER = 1800, // GStreamer
CAP_FFMPEG = 1900, // FFMPEG
CAP_IMAGES = 2000 // OpenCV Image Sequence (e.g. img_%02d.jpg)
}; };
// generic properties (based on DC1394 properties) // generic properties (based on DC1394 properties)
@ -398,10 +401,19 @@ public:
CV_WRAP VideoCapture(const String& filename); CV_WRAP VideoCapture(const String& filename);
/** @overload /** @overload
@param device id of the opened video capturing device (i.e. a camera index). If there is a single @param filename name of the opened video file (eg. video.avi) or image sequence (eg.
camera connected, just pass 0. img_%02d.jpg, which will read samples like img_00.jpg, img_01.jpg, img_02.jpg, ...)
@param apiPreference preferred Capture API to use. Can be used to enforce a specific reader
implementation if multiple are available: e.g. CAP_FFMPEG or CAP_IMAGES
*/ */
CV_WRAP VideoCapture(int device); CV_WRAP VideoCapture(const String& filename, int apiPreference);
/** @overload
@param index = camera_id + domain_offset (CAP_*). id of the video capturing device to open. If there is a single
camera connected, just pass 0. Advanced Usage: to open Camera 1 using the MS Media Foundation API: index = 1 + CAP_MSMF
*/
CV_WRAP VideoCapture(int index);
virtual ~VideoCapture(); virtual ~VideoCapture();
@ -415,9 +427,10 @@ public:
CV_WRAP virtual bool open(const String& filename); CV_WRAP virtual bool open(const String& filename);
/** @overload /** @overload
@param device id of the opened video capturing device (i.e. a camera index). @param index = camera_id + domain_offset (CAP_*). id of the video capturing device to open. If there is a single
camera connected, just pass 0. Advanced Usage: to open Camera 1 using the MS Media Foundation API: index = 1 + CAP_MSMF
*/ */
CV_WRAP virtual bool open(int device); CV_WRAP virtual bool open(int index);
/** @brief Returns true if video capturing has been initialized already. /** @brief Returns true if video capturing has been initialized already.
@ -541,6 +554,18 @@ public:
*/ */
CV_WRAP virtual double get(int propId) const; CV_WRAP virtual double get(int propId) const;
/** @overload
@param filename name of the opened video file (eg. video.avi) or image sequence (eg.
img_%02d.jpg, which will read samples like img_00.jpg, img_01.jpg, img_02.jpg, ...)
@param apiPreference preferred Capture API to use. Can be used to enforce a specific reader
implementation if multiple are available: e.g. CAP_FFMPEG or CAP_IMAGES
The methods first call VideoCapture::release to close the already opened file or camera.
*/
CV_WRAP virtual bool open(const String& filename, int apiPreference);
protected: protected:
Ptr<CvCapture> cap; Ptr<CvCapture> cap;
Ptr<IVideoCapture> icap; Ptr<IVideoCapture> icap;

View File

@ -63,6 +63,9 @@ typedef struct CvCapture CvCapture;
/* start capturing frames from video file */ /* start capturing frames from video file */
CVAPI(CvCapture*) cvCreateFileCapture( const char* filename ); CVAPI(CvCapture*) cvCreateFileCapture( const char* filename );
/* start capturing frames from video file. allows specifying a preferred API to use */
CVAPI(CvCapture*) cvCreateFileCaptureWithPreference( const char* filename , int apiPreference);
enum enum
{ {
CV_CAP_ANY =0, // autodetect CV_CAP_ANY =0, // autodetect
@ -111,8 +114,10 @@ enum
CV_CAP_INTELPERC = 1500, // Intel Perceptual Computing CV_CAP_INTELPERC = 1500, // Intel Perceptual Computing
CV_CAP_OPENNI2 = 1600, // OpenNI2 (for Kinect) CV_CAP_OPENNI2 = 1600, // OpenNI2 (for Kinect)
CV_CAP_GPHOTO2 = 1700,
CV_CAP_GPHOTO2 = 1700 CV_CAP_GSTREAMER = 1800, // GStreamer
CV_CAP_FFMPEG = 1900, // FFMPEG
CV_CAP_IMAGES = 2000 // OpenCV Image Sequence (e.g. img_%02d.jpg)
}; };
/* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */ /* start capturing frames from camera: index = camera_index + domain_offset (CV_CAP_*) */

View File

@ -359,56 +359,64 @@ CV_IMPL CvCapture * cvCreateCameraCapture (int index)
* Videoreader dispatching method: it tries to find the first * Videoreader dispatching method: it tries to find the first
* API that can access a given filename. * API that can access a given filename.
*/ */
CV_IMPL CvCapture * cvCreateFileCapture (const char * filename) CV_IMPL CvCapture * cvCreateFileCaptureWithPreference (const char * filename, int apiPreference)
{ {
CvCapture * result = 0; CvCapture * result = 0;
switch(apiPreference) {
default:
case CV_CAP_FFMPEG:
#ifdef HAVE_FFMPEG #ifdef HAVE_FFMPEG
if (! result) if (! result)
result = cvCreateFileCapture_FFMPEG_proxy (filename); result = cvCreateFileCapture_FFMPEG_proxy (filename);
#endif #endif
case CV_CAP_VFW:
#ifdef HAVE_VFW #ifdef HAVE_VFW
if (! result) if (! result)
result = cvCreateFileCapture_VFW (filename); result = cvCreateFileCapture_VFW (filename);
#endif #endif
case CV_CAP_MSMF:
#ifdef HAVE_MSMF #ifdef HAVE_MSMF
if (! result) if (! result)
result = cvCreateFileCapture_MSMF (filename); result = cvCreateFileCapture_MSMF (filename);
#endif #endif
#ifdef HAVE_XINE #ifdef HAVE_XINE
if (! result) if (! result)
result = cvCreateFileCapture_XINE (filename); result = cvCreateFileCapture_XINE (filename);
#endif #endif
case CV_CAP_GSTREAMER:
#ifdef HAVE_GSTREAMER #ifdef HAVE_GSTREAMER
if (! result) if (! result)
result = cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename); result = cvCreateCapture_GStreamer (CV_CAP_GSTREAMER_FILE, filename);
#endif #endif
case CV_CAP_QT:
#if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT) #if defined(HAVE_QUICKTIME) || defined(HAVE_QTKIT)
if (! result) if (! result)
result = cvCreateFileCapture_QT (filename); result = cvCreateFileCapture_QT (filename);
#endif #endif
case CV_CAP_AVFOUNDATION:
#ifdef HAVE_AVFOUNDATION #ifdef HAVE_AVFOUNDATION
if (! result) if (! result)
result = cvCreateFileCapture_AVFoundation (filename); result = cvCreateFileCapture_AVFoundation (filename);
#endif #endif
case CV_CAP_OPENNI:
#ifdef HAVE_OPENNI #ifdef HAVE_OPENNI
if (! result) if (! result)
result = cvCreateFileCapture_OpenNI (filename); result = cvCreateFileCapture_OpenNI (filename);
#endif #endif
case CV_CAP_IMAGES:
if (! result) if (! result)
result = cvCreateFileCapture_Images (filename); result = cvCreateFileCapture_Images (filename);
}
return result; return result;
} }
CV_IMPL CvCapture * cvCreateFileCapture (const char * filename)
{
return cvCreateFileCaptureWithPreference(filename, CV_CAP_ANY);
}
/** /**
* Videowriter dispatching method: it tries to find the first * Videowriter dispatching method: it tries to find the first
* API that can write a given stream. * API that can write a given stream.
@ -615,14 +623,19 @@ static Ptr<IVideoWriter> IVideoWriter_create(const String& filename, int _fourcc
VideoCapture::VideoCapture() VideoCapture::VideoCapture()
{} {}
VideoCapture::VideoCapture(const String& filename) VideoCapture::VideoCapture(const String& filename, int apiPreference)
{ {
open(filename); open(filename, apiPreference);
} }
VideoCapture::VideoCapture(int device) VideoCapture::VideoCapture(const String& filename)
{ {
open(device); open(filename, CAP_ANY);
}
VideoCapture::VideoCapture(int index)
{
open(index);
} }
VideoCapture::~VideoCapture() VideoCapture::~VideoCapture()
@ -631,24 +644,29 @@ VideoCapture::~VideoCapture()
cap.release(); cap.release();
} }
bool VideoCapture::open(const String& filename) bool VideoCapture::open(const String& filename, int apiPreference)
{ {
if (isOpened()) release(); if (isOpened()) release();
icap = IVideoCapture_create(filename); icap = IVideoCapture_create(filename);
if (!icap.empty()) if (!icap.empty())
return true; return true;
cap.reset(cvCreateFileCapture(filename.c_str())); cap.reset(cvCreateFileCaptureWithPreference(filename.c_str(), apiPreference));
return isOpened(); return isOpened();
} }
bool VideoCapture::open(int device) bool VideoCapture::open(const String& filename)
{
return open(filename, CAP_ANY);
}
bool VideoCapture::open(int index)
{ {
if (isOpened()) release(); if (isOpened()) release();
icap = IVideoCapture_create(device); icap = IVideoCapture_create(index);
if (!icap.empty()) if (!icap.empty())
return true; return true;
cap.reset(cvCreateCameraCapture(device)); cap.reset(cvCreateCameraCapture(index));
return isOpened(); return isOpened();
} }