我有一個顯示縮略圖圖像的窗口。當我點擊圖片時,它將被選中或取消選擇。如果取消選擇,則圖像變灰,如果選擇了圖像,則會顯示原始圖像。如何清除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;
}
嘗試添加'disp.setTo(CV ::標量(0, 0,0);'在繪製瓦片之前 據我所知在OpenCV中沒有「清除」窗口,但是(至少在舊版本中)可以得到窗口指針 但是最後你只是顯示你的整個'disp'圖像,所以你應該根據需要修改圖像,而不是試圖清除窗口。 – Micka
我已經嘗試過你的方法以及herohuyongtao,但我仍然有同樣的問題,我已經在編輯中解釋了我原來的帖子。 –
我的猜測是,您將原始的拇指圖像數據變暗而不是複製的數據?!? – Micka