2014-12-02 47 views
-1

我有一個簡單的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的擴展。

謝謝。

回答

1

有東西在這裏很破:(?爲什麼連)

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

首先,創建一個無用的16位圖像,然後重新分配(化名)是指向你的原始圖像,然後你不要cvReleaseImage它(memleak)。

請停止使用opencv的棄用c-api。請。

任何小白拍攝到他的腳用這個(的主要原因之一擺脫它)

也,你只能使用〜30%的OpenCV中的功能,這樣(的opencv1.0設置)

再次,請停止使用opencv的棄用c-api。請。

+0

因爲他說他使用GTK + 2。0,我不得不懷疑OpenCV的Raspberry Pi版本是否提供了C++ API ...(我在Raspian中使用過GTK + 3.0,但是它在QEMU上,所以...) – andlabs 2014-12-02 13:51:53

+0

我希望這是一個純C項目,我只需要一種方法來快速從C中的網絡攝像頭獲取圖像。如果沒有OpenCv的快速簡便的方法,我會從我的項目中完全刪除OpenCv。 – DevNull 2014-12-02 14:32:54

+0

^^好主意! 。 – berak 2014-12-02 14:44:33

1

難道你忘了釋放img指針嗎?

此外,我在過去做過一個應用程序,該應用程序在磁盤上存儲未壓縮的圖像,並且過去變得呆滯。事實上,花費時間的是將圖像存儲在磁盤上,因爲它超過了文件系統層可以處理的最大帶寬。

所以試着看看是否可以存儲壓縮圖像(交易一些CPU來節省帶寬),或將圖像存儲在RAM中的隊列中,然後保存(在單獨的線程或閒置處理程序中)。當然,如果您拍攝的視頻太長,最終可能會出現內存不足的情況。我只有幾秒鐘的時間才能存儲,所以這個技巧。

相關問題