Я занимаюсь проектом для поиска через базу данных изображений, и когда я нахожу результаты для некоторых запросов - 5 изображений базы данных, я хотел бы визуально отображать результаты. Я не сохраняю все изображения в памяти, поэтому сначала загружаю изображение, чтобы отобразить его.OpenCV - закрытие окна отображения изображения
У меня было что-то простое в виду, в псевдокоде:
for image 1..5
load images
display image in a window
wait for any keypress
close the window
Вот фрагмент моего кода в C++
используя OpenCV
для этой цели:
IplImage *img;
for (int i=0; i < 5; ++i){
img = cvLoadImage(images[i].name.c_str(),1);
cvShowImage(("Match" + images[i].name).c_str(), img);
cvWaitKey(0);
cvDestroyWindow(("Match" + images[i].name).c_str());
// sleep(1);
cvReleaseImage(&img);
}
images
массив используется здесь делает не так такие существуют в моем коде, но, ради вопроса, он содержит Имена Файлов изображений относительно текущей текущей рабочей точки программы, если ее член name
. Я храню имена изображений немного по-другому в своем проекте.
Код почти Работы: Я могу выполнять итерацию через 4/5 изображений ОК, но когда отображается последнее изображение и нажата клавиша, изображение становится серым, и я не могу закрыть окно изображения, моей заявки.
Моя первая идея заключалась в том, что из-за оптимизации времени компиляции cvReleaseImage
выпускает изображение до cvDestroyWindow
, и это как-то заставляет его замораживать. Но я попытался добавить некоторое время ожидания (отсюда прокомментировал строку sleep(1)
моего кода), и это не помогло.
Я вызываю эту функцию отображения из своего консольного приложения, и когда изображение зависает, элемент управления возвращается обратно в мое приложение, и я могу продолжать использовать его (но окно изображения все еще заморожено в фоновом режиме).
Можете ли вы дать мне какие-либо предложения о том, как исправить это?
EDIT
Я разговаривал с некоторыми людьми, занимающихся компьютерным зрением и OpenCV на регулярной основе с задавая вопрос, и до сих пор нет идей.
Я также нашел аналогичный stackoverflow question, но до сих пор нет принятого ответа. В результате Google просто дает похожие вопросы, но ответов нет.
Любые идеи о том, что попробовать (даже если они не являются полным решением), очень ценятся.
Что вы можете рассказать нам о массиве изображений? можете ли вы опубликовать свой код создания и назначения? Кстати, вы отметили это как C++, так почему вы используете старый стиль C opencv? – Boaz
Стиль C OpenCv - это потому, что мне пришлось использовать библиотеку C, которая использует OpenCV с моим кодом, а некоторые данные находятся в структурах данных OpenCV в стиле C. Это si фактически фрагмент гораздо большего кода, и я обращаюсь к именам своих изображений по-разному. Ради вопроса, массив изображений содержит пути к картинке в элементе .name (я обновлю вопрос) – penelope
Вы пытались 'cvDestroyAllWindows()'? Если это так, и это не сработает, то есть странная ошибка в вашем коде где-нибудь (может быть, не в выше) или в OpenCv. Если он работает, там где-то есть простая ошибка. – Florian