У меня есть простое графическое приложение, которое я написал в 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.
спасибо.
Поскольку он говорит, что использует GTK + 2.0, мне нужно задаться вопросом, предлагают ли версии OpenCV версии Raspberry Pi даже API C++ ... (Я использовал GTK + 3.0 в Raspian, но это было на QEMU, поэтому ...) – andlabs
Я хотел, чтобы это было чисто C проект, и мне просто нужен способ быстро получить изображение с веб-камеры на C. Если есть быстрый и простой способ сделать это без OpenCv, я полностью удалю OpenCv из моего проекта. – DevNull
^^ хорошая идея! , – berak