#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() более полезен». Это не решит вашу проблему, но сделает код короче, а более короткий код в целом более свободен от ошибок, чем более длинный код 😉