Я думаю, что у меня есть хорошее решение этой проблемы.Я создаю вспомогательный массив Mat с нулями с таким же разрешением, как у камеры.Я назначаю его массиву Mat, которому сразу после присваиваем кадр, снятый камерой, и в конце проверяю норму этого массива.Если он равен нулю, это означает, что новый кадр не был снят с камеры.
VideoCapture cap(0);
if(!cap.isOpened()) return -1;
Mat frame;
cap >> frame;
Mat emptyFrame = Mat::zeros(CV_CAP_PROP_FRAME_WIDTH, CV_CAP_PROP_FRAME_HEIGHT, CV_32F);
for(;;)
{
frame = emptyFrame;
cap >> frame;
if (norm(frame) == 0) break;
}