diff --git a/modules/videoio/src/cap_images.cpp b/modules/videoio/src/cap_images.cpp index 6b30c5c4b6..f472ff711b 100644 --- a/modules/videoio/src/cap_images.cpp +++ b/modules/videoio/src/cap_images.cpp @@ -113,16 +113,9 @@ void CvCapture_Images::close() bool CvCapture_Images::grabFrame() { - cv::String filename; - if (length == 1) - if (currentframe < length) - filename = filename_pattern; - else - { - return false; - } - else - filename = cv::format(filename_pattern.c_str(), (int)(firstframe + currentframe)); + if (length == 1 && currentframe >= length) + return false; + const cv::String filename = cv::format(filename_pattern.c_str(), (int)(firstframe + currentframe)); CV_Assert(!filename.empty()); if (grabbedInOpen) diff --git a/modules/videoio/test/test_images.cpp b/modules/videoio/test/test_images.cpp index ccf507a50d..c3782f2c5d 100644 --- a/modules/videoio/test/test_images.cpp +++ b/modules/videoio/test/test_images.cpp @@ -285,6 +285,21 @@ TEST(videoio_images, extract_pattern) EXPECT_THROW(cv::icvExtractPattern("1.png", NULL), cv::Exception); } +TEST(videoio_images, bug_26457) +{ + ImageCollection col; + col.generate(1u); + ASSERT_EQ(col.getCount(), 1u); + + VideoCapture cap(col.getFirstFilename(), CAP_IMAGES); + ASSERT_TRUE(cap.isOpened()); + + Mat img; + const bool read_res = cap.read(img); + EXPECT_TRUE(read_res); + EXPECT_MAT_N_DIFF(img, col.getFirstFrame(), 0); +} + // TODO: should writer overwrite files? // TODO: is clamping good for seeking? // TODO: missing files? E.g. 3, 4, 6, 7, 8 (should it finish OR jump over OR return empty frame?)