我有一個簡單的GUI應用程序,我使用C編寫的RaspBerry PI,同時使用GTK + 2.0來處理實際的UI渲染。到目前爲止,該應用程序非常簡單,只需幾個按鈕即可測試我編寫的簡單函數。一個按鈕導致一個線程被喚醒,它將文本輸出到控制檯,然後返回到睡眠狀態,而另一個按鈕通過鎖定互斥鎖,更改狀態變量,然後再次解鎖互斥鎖,提早停止該操作。迄今爲止相當簡單的東西。使用這種線程方法的重點是,我不會在長時間函數調用期間「鎖定」UI,強制用戶在UI再次可用之前完成對I/O操作的阻止。GTK應用程序在使用OpenCV時不會刷新UI
如果我在我的線程處理循環中調用以下函數,我遇到了一些問題。
#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
的警告,但仍設法獲取圖像並將它們保存到我的文件中。但是,我的GUI變得呆滯,有時會掛起。如果它沒有完全掛起,那麼窗口就會變成空白,我必須隨機點擊整個UI區域,直到我點擊按鈕通常所在的位置,並且UI最終再次重新渲染,而不是顯示白色空的佈局。
我該如何着手解決這個問題?在OpenCv中使用它作爲Gtk + 2.0應用程序的一部分時,會出現一些怪癖嗎?我原本將我的項目設置爲GTK3.0應用程序,但由於GTK中的某些檢查阻止將多個版本包含在單個應用程序中,所以它無法運行,並且似乎OpenCv是GTK + 2.0的擴展。
謝謝。
因爲他說他使用GTK + 2。0,我不得不懷疑OpenCV的Raspberry Pi版本是否提供了C++ API ...(我在Raspian中使用過GTK + 3.0,但是它在QEMU上,所以...) – andlabs 2014-12-02 13:51:53
我希望這是一個純C項目,我只需要一種方法來快速從C中的網絡攝像頭獲取圖像。如果沒有OpenCv的快速簡便的方法,我會從我的項目中完全刪除OpenCv。 – DevNull 2014-12-02 14:32:54
^^好主意! 。 – berak 2014-12-02 14:44:33