Обновление изображений Cimg и отображение из функций обратного вызова

#c #cimg

#c #cimg

Вопрос:

Я пишу некоторый код на C для отображения изображений, полученных с камеры. В коде функция обратного вызова будет вызываться камерой каждый раз, когда появляется новое изображение, и я получу указатель в памяти, где хранится изображение. Теперь я хочу использовать CImg для отображения изображения каждый раз, когда оно проходит (например, видео), и, возможно, использовать функции в CImg для управления изображением.

Я думал определить экземпляр Cimg из указателя в функции обратного вызова и отправить указатель CImg display функции обратного вызова. Таким образом, каждый раз, когда вызывается функция обратного вызова, экземпляр перезаписывается, а затем отображается новое изображение.

 struct data {
    CImgDisplay* disp;
};


int callBack(int Nimg, data *pointersPassedIn){
    auto   disp = pointersPassedIn->disp;
    int   width,height;
    getParameter(WIDTH, amp;width);//Retrieve height and width of the image from camera
    getParameter(HEIGHT, amp;height);
    unsigned short* imgPtr = (unsigned short*)getImagePtr(Nimg);//Retrieve image pointer from camera, as 16-bit image, use unsigned short
    CImg <unsigned short> img(imgPtr ,width,height);
    disp->render(img);
    disp->paint();
    return 0 ;
};

int main(){
    int width,height;
    getParameter(WIDTH, amp;width);
    getParameter(HEIGHT, amp;height);
    CImgDisplay disp(width,height);
    registerCallBack(amp;disp);//will add amp;disp to struct data and send it to call back function
    aquire();
    while (!disp.is_closed()){
        ;
    }
    stopAquire();
};
  

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

Спасибо

Комментарии:

1. Ну, вы получаете только одно изображение и отображаете его до тех пор, пока окно не будет закрыто. Попробуйте сделать это внутри цикла, т. Е. Получить изображение и обновить отображение. На самом деле, вы можете захотеть сделать это многопоточным: сохранить поток с графическим интерфейсом, воспроизводящий текущее изображение, и выполнить выборку, обработку и т.д. в другом потоке, который доставляет окончательное изображение в поток GUI.

2. Спасибо за ваш ответ. Если код работает правильно (если я не определяю экземпляр CImg и не отображаю его при обратном вызове), камера вызывает функции обратного вызова несколько раз (со скоростью 3 кадра в секунду), и я могу видеть это, потому что я заставил функцию обратного вызова выводить на консоль каждый раз, когда она вызывается. Но с определенным экземпляром Cimg программа завершает работу при втором вызове функции обратного вызова. Кроме того, спасибо за многопоточное предложение, я не знаю, как это сделать, но я перечислю его в качестве своего будущего исследования.

3. Хм, хорошо. Я только что увидел, что в вашем обратном вызове image фактически не определено и это ìmg вообще не используется. Пожалуйста, исправьте это.

4. Спасибо, что указали на это. Исправлено.

5. Хорошо. В документации для CImgDisplay говорится, что «Не следует использовать для обычных целей CImgDisplay, поскольку display() более полезен». Это не решит вашу проблему, но сделает код короче, а более короткий код в целом более свободен от ошибок, чем более длинный код 😉