2014-12-02 3 views
-1

У меня есть простое графическое приложение, которое я написал в C для RaspBerry PI при использовании GTK + 2.0 для обработки фактического отображения пользовательского интерфейса. Приложение до сих пор довольно просто, с несколькими кнопками для тестирования простых функций, которые я написал. Одна кнопка вызывает пробуждение потока, который печатает текст на консоли, и снова возвращается в режим сна, а другая кнопка останавливает эту операцию раньше, блокируя мьютекс, изменяя переменную состояния, а затем снова открывая мьютекс. Достаточно простой материал. Точка использования этого многопоточного подхода заключается в том, что я никогда не «блокирую» пользовательский интерфейс во время долгого вызова функции, заставляя пользователя блокироваться при выполнении операций ввода-вывода до того, как пользовательский интерфейс снова будет использоваться.Приложение GTK не обновляет пользовательский интерфейс при использовании OpenCV

Если я вызываю следующую функцию в цикле обработки потока, я сталкиваюсь с рядом проблем.

#include <opencv2/objdetect/objdetect.hpp> 
#include <opencv2/highgui/highgui.hpp> 
#include <opencv2/imgproc/imgproc.hpp> 

#include <stdio.h> 
#include <errno.h> 

using namespace std; 
using namespace cv; 

#define PROJECT_NAME  "CAMERA_MODULE" // Include before liblog 
#include <log.h> 

int cameraAcquireImage(char* pathToImage) { 
    if (!pathToImage) { 
     logError("Invalid input"); 
     return (-EINVAL); 
    } 
    int iErr = 0; 
    CvCapture *capture = NULL; 
    IplImage *frame, *img; 

    //0=default, -1=any camera, 1..99=your camera 
    capture = cvCaptureFromCAM(CV_CAP_ANY); 
    if(!capture) { 
     logError("No camera interface detected"); 
     iErr = (-EIO); 
    } 
    if (!iErr) { 
     if ((frame = cvQueryFrame(capture)) == NULL) { 
     logError("ERROR: frame is null..."); 
     iErr = (-EIO); 
     } 
    } 
    if (!iErr) { 
     CvSize size = cvSize(100, 100); 
     if ((img = cvCreateImage(size, IPL_DEPTH_16S, 1)) != NULL) { 
     img = frame; 
     cvSaveImage(pathToImage, img); 
     } 
    } 
    if (capture) { 
     cvReleaseCapture(&capture); 
    } 
    return 0; 
} 

Функция использует простой код OpenCV, чтобы сделать снимок с веб-камеры, подключенной к моей Raspberry PI. Он выдает предупреждения VIDIOC_QUERYMENU: Invalid argument на консоль, но все же удается получить изображения и сохранить их в файл для меня. Однако мой графический интерфейс становится вялым, а иногда и зависает. Если он не зависает, окно исчезает, и я должен случайно щелкнуть по всей области пользовательского интерфейса, пока не нажмем на кнопку, где обычно будет расположена кнопка, и пользовательский интерфейс, наконец, повторно отображает, а не показывает белый пустой макет.

Как я могу это решить? Является ли это некоторой причудой в OpenCv при использовании ее как части приложения Gtk + 2.0? Первоначально у меня была настройка моего проекта в качестве приложения GTK3.0, но он не запускался из-за некоторой проверки в GTK, предотвращающей включение нескольких версий в одно приложение, и кажется, что OpenCv является расширением GTK + 2.0.

спасибо.

ответ

1

есть что-то совершенно сломан здесь: (? Почему даже)

CvSize size = cvSize(100, 100); 
    if ((img = cvCreateImage(size, IPL_DEPTH_16S, 1)) != NULL) { 
    img = frame; 
    cvSaveImage(pathToImage, img); 
    } 

первых, вы создаете бесполезное 16-битное изображение, то вы переназначить (псевдоним), что указатель на исходное изображение, а затем не cvReleaseImage it (memleak).

, пожалуйста, прекратите использование устаревшего c-api opencv. Пожалуйста.

любой нуб будет стрелять в ногу с помощью этого (одна из главных причин, чтобы избавиться от него)

также, вы можете использовать только ~ 30% функциональности OpenCV в этот путь (в opencv1.0 set)

еще раз, пожалуйста, прекратите использование устаревшего c-api opencv. Пожалуйста.

+0

Поскольку он говорит, что использует GTK + 2.0, мне нужно задаться вопросом, предлагают ли версии OpenCV версии Raspberry Pi даже API C++ ... (Я использовал GTK + 3.0 в Raspian, но это было на QEMU, поэтому ...) – andlabs

+0

Я хотел, чтобы это было чисто C проект, и мне просто нужен способ быстро получить изображение с веб-камеры на C. Если есть быстрый и простой способ сделать это без OpenCv, я полностью удалю OpenCv из моего проекта. – DevNull

+0

^^ хорошая идея! , – berak

1

Вы не забыли оставить свой отзыв? img pointer?

Кроме того, в прошлом я использовал приложение, которое хранило несжатые изображения на диске, а вещи стали вялыми. Фактически, на то, что требовалось, было хранение изображений на диске, поскольку оно превышало максимальную пропускную способность того, что мог обрабатывать уровень файловой системы.

Так что попробуйте посмотреть, можете ли вы вместо этого сохранить сжатые изображения (торгуя некоторым процессором для экономии полосы пропускания) или сохранить свои изображения в ОЗУ в очереди и затем сохранить их (в отдельном потоке или в режиме простоя). Конечно, если видео, которое вы снимаете, слишком длинное, вы можете получить условие «Без памяти». У меня были только несколько секунд для хранения, так что это было трюк.

Смежные вопросы