Чтение изображений в каталоге с помощью VideoCapture не работает

0

Я пытаюсь читать несколько файлов изображений, названных 001.jpg, 002.jpg, 003.jpg и далее, используя OpenCV в Linux и отображая их в окне после некоторой задержки. Вот мой код -

int main(int argc, char ** argv){
    cv::VideoCapture cam("/home/bikz05/Desktop/dataset/%03d.jpg");
    if (!cam.isOpened())
        cout << "Capture is not opened";
    cv::Mat image;
    const string Window = "Image Number";
    namedWindow(Window, CV_WINDOW_NORMAL);
    while(true) {
        cam >> image;
        if (!image.data) {
            std::cout << "Preview Ends" << std::endl;
            break;
        }
        cv::imshow(Window, image);
        waitKey(1000);
    }
    return 0;
}

В первой строке основной функции я даже попытался использовать

cv::VideoCapture cam("/home/bikz05/Desktop/dataset/001.jpg");

Я даже пытался разместить изображения в той же папке, что и двоичный, даже это не помогло.

В обоих случаях отображается только первое изображение, а затем программа выходит из системы. Заметьте, он не заканчивается.

PS - Ответы, предоставленные на Stack Exchange и opencv.org, не дали ожидаемого результата.

  • 0
    VideoCapture будет пытаться сохранить кадр в Mat независимо от Mat размера «s, поэтому , когда вы сохраняете первый образ, Mat выделяется в соответствии с размером кулака изображения. Теперь все остальные изображения в вашем каталоге должны быть того же размера, что и первое, или меньше (если они меньше, они будут выглядеть плохо, но должны работать). Однако, если некоторые изображения больше первого, VideoCapture просто не может сохранить их в том же Mat выделенном для первого изображения, так как оно маленькое.
  • 0
    Нет, ваши рассуждения ошибочны. Прежде чем опубликовать этот вопрос, я попытался сохранить 001.jpg и 002.jpg одно и то же изображение. Но код не работал.
Показать ещё 11 комментариев
Теги:
opencv

2 ответа

2

Код, который вы написали, имеет несколько проблем, но если вы собираетесь читать изображения с диска, используйте cv::imread() вместо cv::VideoCapture:

std::string filename = "/home/bikz05/Desktop/dataset/001.jpg";
const std::string Window = "Image Number";
cv::namedWindow(Window, CV_WINDOW_NORMAL);
while (true) 
{
    cv::Mat image = cv::imread(filename.c_str());
    if (!image.data) 
    {
        std::cout << "!!! File not found: " << filename << std::endl;
        break;
    }

    cv::imshow(Window, image);
    cv::waitKey(1000);

    // And before the loop ends, update filename with the next image:
    // filename = ???;
}

Я не проверял это, но я уверен, что вы поняли эту идею.

  • 0
    Я знаю, как читать это с imread, но я хотел сделать это с VideoCapture. Я мог бы сделать это и другим методом, но я хотел сделать это с помощью VideoCapture. Кстати, какие проблемы с кодом?
  • 0
    Если cam.isOpened() не работает, вернитесь . Создайте image внутри цикла, а не снаружи. Убедитесь, что у пользователя есть разрешение на чтение файлов в этом месте. Убедитесь, что все файлы имеют одинаковое расширение и одинаковую схему именования.
Показать ещё 4 комментария
1

используйте glob, как в glob(folderpath, vectorOfimages) затем glob(folderpath, vectorOfimages) к каждому из изображений как vectorOfimages[i].

vectorOfimages -

 vector<String>

и путь к папке - это строка.

У меня была та же проблема, и videoCapture не решает проблему.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню