Я пытаюсь читать несколько файлов изображений, названных 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, не дали ожидаемого результата.
Код, который вы написали, имеет несколько проблем, но если вы собираетесь читать изображения с диска, используйте 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 = ???;
}
Я не проверял это, но я уверен, что вы поняли эту идею.
cam.isOpened()
не работает, вернитесь . Создайте image
внутри цикла, а не снаружи. Убедитесь, что у пользователя есть разрешение на чтение файлов в этом месте. Убедитесь, что все файлы имеют одинаковое расширение и одинаковую схему именования.
используйте glob, как в glob(folderpath, vectorOfimages)
затем glob(folderpath, vectorOfimages)
к каждому из изображений как vectorOfimages[i]
.
vectorOfimages -
vector<String>
и путь к папке - это строка.
У меня была та же проблема, и videoCapture
не решает проблему.
VideoCapture
будет пытаться сохранить кадр вMat
независимо отMat
размера «s, поэтому , когда вы сохраняете первый образ,Mat
выделяется в соответствии с размером кулака изображения. Теперь все остальные изображения в вашем каталоге должны быть того же размера, что и первое, или меньше (если они меньше, они будут выглядеть плохо, но должны работать). Однако, если некоторые изображения больше первого,VideoCapture
просто не может сохранить их в том жеMat
выделенном для первого изображения, так как оно маленькое.