From e4985f604a411eb3e953182a0f72030654de3329 Mon Sep 17 00:00:00 2001 From: Tsukasa Sugiura Date: Thu, 1 Dec 2016 00:55:00 +0900 Subject: [PATCH 1/3] Add support image save parameters in VideoWriter Add support image save parameters in cv::VideoWriter. This change will become available setting same parameters as cv::imwrite() to cv::VideoWriter::set( cv::IMWRITE_*, value ). --- modules/videoio/src/cap_images.cpp | 14 +++++++++++++- 1 file changed, 13 insertions(+), 1 deletion(-) diff --git a/modules/videoio/src/cap_images.cpp b/modules/videoio/src/cap_images.cpp index e379561593..922a5767b3 100644 --- a/modules/videoio/src/cap_images.cpp +++ b/modules/videoio/src/cap_images.cpp @@ -332,18 +332,20 @@ public: virtual bool open( const char* _filename ); virtual void close(); + virtual bool setProperty( int, double ); virtual bool writeFrame( const IplImage* ); protected: char* filename; unsigned currentframe; + std::vector params; }; bool CvVideoWriter_Images::writeFrame( const IplImage* image ) { char str[_MAX_PATH]; sprintf(str, filename, currentframe); - int ret = cvSaveImage(str, image); + int ret = cvSaveImage(str, image, ¶ms[0]); currentframe++; @@ -358,6 +360,7 @@ void CvVideoWriter_Images::close() filename = 0; } currentframe = 0; + params.clear(); } @@ -380,6 +383,15 @@ bool CvVideoWriter_Images::open( const char* _filename ) } currentframe = offset; + params.clear(); + return true; +} + + +bool CvVideoWriter_Images::setProperty( int id, double value ) +{ + params.push_back( id ); + params.push_back( static_cast( value ) ); return true; } From c560ff23ade974d3d365bf4c2f14c2fc39025765 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 1 Dec 2016 15:24:36 +0300 Subject: [PATCH 2/3] videoio: images: fix buffer overflow problem --- modules/videoio/src/cap_images.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/modules/videoio/src/cap_images.cpp b/modules/videoio/src/cap_images.cpp index 922a5767b3..455418624b 100644 --- a/modules/videoio/src/cap_images.cpp +++ b/modules/videoio/src/cap_images.cpp @@ -345,7 +345,10 @@ bool CvVideoWriter_Images::writeFrame( const IplImage* image ) { char str[_MAX_PATH]; sprintf(str, filename, currentframe); - int ret = cvSaveImage(str, image, ¶ms[0]); + std::vector image_params = params; + image_params.push_back(0); // append parameters 'stop' mark + image_params.push_back(0); + int ret = cvSaveImage(str, image, &image_params[0]); currentframe++; From e547bbbc3f66064d5aaf497de6eeeb54d5a9f5b1 Mon Sep 17 00:00:00 2001 From: Alexander Alekhin Date: Thu, 1 Dec 2016 15:17:33 +0300 Subject: [PATCH 3/3] videoio: preserve conflict with common properties Usage: writer.set(cv::CAP_PROP_IMAGES_BASE + cv::IMWRITE_JPEG_QUALITY, 80); --- modules/videoio/include/opencv2/videoio.hpp | 14 ++++++++++++++ modules/videoio/src/cap_images.cpp | 10 +++++++--- 2 files changed, 21 insertions(+), 3 deletions(-) diff --git a/modules/videoio/include/opencv2/videoio.hpp b/modules/videoio/include/opencv2/videoio.hpp index c38875f7d2..458e63d843 100644 --- a/modules/videoio/include/opencv2/videoio.hpp +++ b/modules/videoio/include/opencv2/videoio.hpp @@ -556,6 +556,20 @@ enum { CAP_PROP_GPHOTO2_PREVIEW = 17001, //!< Capture only preview fro //! @} gPhoto2 + +/** @name Images backend + @{ +*/ + +/** @brief Images backend properties + +*/ +enum { CAP_PROP_IMAGES_BASE = 18000, + CAP_PROP_IMAGES_LAST = 19000 // excluding + }; + +//! @} Images + //! @} videoio_flags_others diff --git a/modules/videoio/src/cap_images.cpp b/modules/videoio/src/cap_images.cpp index 455418624b..f87c5544d2 100644 --- a/modules/videoio/src/cap_images.cpp +++ b/modules/videoio/src/cap_images.cpp @@ -393,9 +393,13 @@ bool CvVideoWriter_Images::open( const char* _filename ) bool CvVideoWriter_Images::setProperty( int id, double value ) { - params.push_back( id ); - params.push_back( static_cast( value ) ); - return true; + if (id >= cv::CAP_PROP_IMAGES_BASE && id < cv::CAP_PROP_IMAGES_LAST) + { + params.push_back( id - cv::CAP_PROP_IMAGES_BASE ); + params.push_back( static_cast( value ) ); + return true; + } + return false; // not supported }