2015-04-23 72 views
-1

假設我需要在Qt創建器中顯示openCV圖像。如何創建新類以部署opencv和對象的方法

我的圖像用cv :: Mat類型聲明,但openCV沒有允許將圖像放入Qt應用程序GUI的成員。此外,我希望我的代碼能夠使用以下語法:「image.displayinGUI()」(其中圖像是cv :: Mat類型)。我知道如何在Qt中顯示圖像,但我不知道在我的程序中合理地部署正確的設計模式(我認爲問題是在C++中繼承,但無法解決它。提醒,我不問任何問題確切的問題,比如Qt或者openCV,我想知道如何在不編輯舊代碼的情況下將新方法添加到舊對象中,您可以使用Qt,opencv expample或者C++中的任何東西來給出建議!

那麼,我該怎麼辦?

(我很抱歉因爲我的C++的新手,我的英語不是很好)

我寫了這個場景,但它沒有工作:

class usergui : public cv::Mat { 
public: 
    displayinGUI(QLabel* label) { 
     cv::Mat newimg = this->clone(); 
     cv::cvtColor(newimg , newimg , CV_BGR2RGB); 
     QImage image = QImage((const unsigned char*)newimg.data , newimg.cols , newimg.rows , QImage::Format_RGB888); 
     label->setPixmap(QPixmap::fromImage(image)); 
     label->resize(label->pixmap()->size()); 
    } 
} 



// in main program: 
/* ... */ 
cv::Mat myimage; 
myimage.imread("lenna.png"); 
myimage.displayinGUI(myQtlabel); // this cause an error: "cv::Mat has no member named "displayinGUI()" 
/* ...*/ 
+0

的可能重複[如何轉換OpenCV的CV ::墊的QImage(HTTP://計算器。 com/questions/5026965/how-to-convert-an-opencv-cvmat-to-qimage) – Kiran

+0

這只是一個例子。另外,我認爲使用類非常方便,特別是如果我想重用我的代碼! –

+0

「無需編輯舊代碼即可將新方法添加到舊對象」?這基本上是繼承的原因,你的**精確**問題是什麼? –

回答

0

編輯:對不起,沒有看到你的代碼示例的第二部分。

這是很容易,創造usergui例如不CV ::墊:

// in main program: 
/* ... */ 
usergui myimage; //<<<<change here 
myimage.imread("lenna.png"); 
myimage.displayinGUI(myQtlabel); // should work 
/* ...*/ 

OLD答:

爲什麼要一個GUI類從簡歷獲得::墊? 爲什麼要保存圖像數據的類對GUI有依賴性?

你應該在3個任務拆分此:

  1. 類持有CV ::墊圖像,其將(實用程序,非GUI) CV ::席子(非GUI)
  2. 類或函數而QImage
  3. 類顯示的東西(GUI)

所以,你會顯示在QLabel墊:

QImage matToImg(cv::Mat ); //TODO implement 

cv::Mat mat = imread("lena.png"); 
QLabel *label = new QLabel; 
label->setPixmap(QPixmap::fromImage(matToImg(mat))); 

我用下面的墊子QImage的轉換代碼(不提供任何擔保):

QImage IplImage2QImage(IplImage *iplImg) 
{ 
    int h = iplImg->height; 
    int w = iplImg->width; 
    int channels = iplImg->nChannels; 
    QImage qimg(w, h, QImage::Format_ARGB32); 
    char *data = iplImg->imageData; 

    for (int y = 0; y < h; y++, data += iplImg->widthStep) 
    { 
    for (int x = 0; x < w; x++) 
    { 
    char r, g, b, a = 0; 
    if (channels == 1) 
    { 
    r = data[x * channels]; 
    g = data[x * channels]; 
    b = data[x * channels]; 
    } 
    else if (channels == 3 || channels == 4) 
    { 
    r = data[x * channels + 2]; 
    g = data[x * channels + 1]; 
    b = data[x * channels]; 
    } 

    if (channels == 4) 
    { 
    a = data[x * channels + 3]; 
    qimg.setPixel(x, y, qRgba(r, g, b, a)); 
    } 
    else 
    { 
    qimg.setPixel(x, y, qRgb(r, g, b)); 
    } 
    } 
    } 
    return qimg; 
} 

QImage toQImage(const cv::Mat &src) 
{ 
    return IplImage2QImage(new IplImage(src)); 
} 
+0

請不要**推薦任何包含IplImages的東西 – berak

+0

謝謝。 ,我不能在你的代碼中使用「image.displayinGUI()」語法,我沒有問任何確切的問題,比如Qt或openCV。我想知道如何在不編輯舊代碼的情況下將新方法添加到舊對象中。 –

+0

@berak在將Mat轉換爲QImage之後,我從舊時代開始轉向這個解決方案。如果你建議工作代碼將cv :: Mat轉換爲QImage,我會非常感激。 –

相關問題