2014-03-13 54 views
1

我有一個顯示縮略圖圖像的窗口。當我點擊圖片時,它將被選中或取消選擇。如果取消選擇,則圖像變灰,如果選擇了圖像,則會顯示原始圖像。如何清除openCV中的窗口內容

要做到這一點,需要使用原始圖像或灰色圖像重新繪製窗口。我遇到的問題不是獲得一個清除​​的窗口,只要我點擊我只是覆蓋現有的內容與新的內容。

下面是我繪製縮略圖並將其顯示在窗口中的示例,每次單擊圖像時都會調用此函數,並且我要重新繪製窗口內容。

void dispThumbs() 
{ 
    Mat disp = Mat(500,620,CV_8UC3); 
    imshow("Tile",disp); 
    int ind = 0; 
    int xdist = 5; 
    int ydist = 5; 
    for(int i = 0; i < 3; i++) 
    { 
     for(int k = 0; k < 3; k++) 
     { 
      Mat im = imMan.returnThumb(ind); 
      im.copyTo(disp(Rect(xdist,ydist,200,150))); 
      ind ++; 
      ydist += 155; 
     } 
     ydist = 5; 
     xdist += 205; 
    } 
    imshow("Tile",disp); 
} 

有沒有辦法清除窗口「瓷磚」的內容,然後用更新的內容重新繪製?

編輯:

我仍然有在dispThumbs的start()函數將在此之後,同樣的問題。

Mat disp = Mat::zeros(500,620,CV_8UC3); 

當我點擊相關的圖像要麼設置爲選擇或取消選擇,然後在dispThumbs縮略圖之一()被再次調用。目前,無論何時點擊,已變暗的圖像都會變暗。我在代碼中看不到任何問題,但也許你可以找到圖像越來越暗的原因。

Mat im = imMan.returnThumb(ind); 

調用以下兩個函數。如果沒有選擇縮略圖,我會調暗圖像並將其返回。

Mat imManage::dimImage(Mat tmp) 
{ 
    cout << "Dimming Image" << endl; 
    int rows = tmp.rows; 
    int cols = tmp.cols; 

    for (int i = 0; i < rows; i++) 
    { 
     for(int k = 0; k < cols; k++) 
     { 
      tmp.at<cv::Vec3b>(i,k)[0] = saturate_cast<uchar>((int) tmp.at<cv::Vec3b>(i,k)[0] - 150); 
      tmp.at<cv::Vec3b>(i,k)[1] = saturate_cast<uchar>((int) tmp.at<cv::Vec3b>(i,k)[1] - 150); 
      tmp.at<cv::Vec3b>(i,k)[2] = saturate_cast<uchar>((int) tmp.at<cv::Vec3b>(i,k)[2] - 150); 
     } 
    } 
    return tmp; 
} 

Mat imManage::returnThumb(int ind) 
{ 
    imClass temp = images[ind]; 
    Mat th; 
    if(temp.isSelected()) 
    { 
     cout << ind << " Selected" << endl; 
     th = temp.getThumb(); 
    } else { 
     cout << ind << " De Selected" << endl; 
     th = dimImage(temp.getThumb()); 
    } 

    return th; 
} 
+0

嘗試添加'disp.setTo(CV ::標量(0, 0,0);'在繪製瓦片之前 據我所知在OpenCV中沒有「清除」窗口,但是(至少在舊版本中)可以得到窗口指針 但是最後你只是顯示你的整個'disp'圖像,所以你應該根據需要修改圖像,而不是試圖清除窗口。 – Micka

+0

我已經嘗試過你的方法以及herohuyongtao,但我仍然有同樣的問題,我已經在編輯中解釋了我原來的帖子。 –

+0

我的猜測是,您將原始的拇指圖像數據變暗而不是複製的數據?!? – Micka

回答

1

您可以填寫新數據之前簡單地重置Mat disp的內容:

disp = zeros(disp.rows, disp.cols); 

disp.setTo(Scalar(0,0,0)); 
+0

這已經停止了偶爾出現變色的窗口背景,但我仍然有同樣的問題。我已經添加了一些額外的內容來解釋我的原始問題。 –