2017-04-10 83 views
-1

我試圖在opencv中使用imshow來顯示,但圖像窗口關閉,並在每個循環中再次顯示。有沒有辦法保持顯示,直到新的imshow到達,所以圖像顯示不會看起來閃爍?C++最好的方式來顯示圖像,並保持它,直到下一個圖像

for(int iframe = 0; iframe < 10; iframe++) 
{ 
..some processing code.. 
cv::imshow("image", a[iframes]); 
cv::waitKey(1); 
} 
+0

只有當圖像發生變化時才加載圖像? – NathanOliver

+1

窗口不應該被關閉,除非你有一些「closeAllWindowsBla」或類似的代碼或關閉你的應用程序 – Micka

回答

1

檢查......一些處理代碼...:

如果你在每個循環和/或的開始使用namedWindow()在結束使用的DestroyWindow()循環,那麼你在每次迭代中都有效地關閉了你的窗口。

刪除這些函數調用,除非您確定需要它們。

+0

謝謝Saransh。我在循環之前創建了nameWindow,並將imshow放入循環中並且工作正常,但是如果我有nameWindow主線程並調用第二個線程中的imshow,創建窗口,但imshow命令掛起。如果我刪除nameWindow,圖像顯示但閃爍(關閉並重新打開圖像)任何想法?我可以將此作爲如果需要的話,我需要一個新的問題 – Sofia

+0

我需要一些關於線程模型的更多細節?你是否明確地創建了一個輔助線程?如果是這樣,那麼這兩個線程共享什麼資源?imshow()可能無法給你一個輸出因爲當你調用waitKey()時,你在主線程上增加了一個延遲,但不是第二個線程,因此運行速度比fps快 –

1

這兩個線程不共享顯示窗口以外的任何參數。這是我的代碼。我沒有包含處理部分,因爲它很長。

int main(int argc, char *argv[]) 
{ 

// Some processings// 

// Create the thread 
cv::namedWindow("image2D"); 
std::thread t1(task1, "Start"); 
t1.join(); 
} 

void task1(std::string msg) 
{ 
std::cout << "Task 1: " << msg << std::endl;  

// Some processings to compute img1 

// Display img1 
float min = -50; 
float max = 100; 
cv::Mat adjMap = cv::Mat::zeros(height, width, CV_8UC1); 
cv::Mat img1; 
float scale = 255.0/(max - min); 
zw.convertTo(adjMap, CV_8UC1, scale); 
applyColorMap(adjMap, img1, cv::COLORMAP_JET); 
cv::imshow("image2D", img1); // The code hangs here 
cv::waitKey(1); 
}