我試圖在opencv中使用imshow來顯示,但圖像窗口關閉,並在每個循環中再次顯示。有沒有辦法保持顯示,直到新的imshow到達,所以圖像顯示不會看起來閃爍?C++最好的方式來顯示圖像,並保持它,直到下一個圖像
for(int iframe = 0; iframe < 10; iframe++)
{
..some processing code..
cv::imshow("image", a[iframes]);
cv::waitKey(1);
}
我試圖在opencv中使用imshow來顯示,但圖像窗口關閉,並在每個循環中再次顯示。有沒有辦法保持顯示,直到新的imshow到達,所以圖像顯示不會看起來閃爍?C++最好的方式來顯示圖像,並保持它,直到下一個圖像
for(int iframe = 0; iframe < 10; iframe++)
{
..some processing code..
cv::imshow("image", a[iframes]);
cv::waitKey(1);
}
檢查......一些處理代碼...:
如果你在每個循環和/或的開始使用namedWindow()在結束使用的DestroyWindow()循環,那麼你在每次迭代中都有效地關閉了你的窗口。
刪除這些函數調用,除非您確定需要它們。
謝謝Saransh。我在循環之前創建了nameWindow,並將imshow放入循環中並且工作正常,但是如果我有nameWindow主線程並調用第二個線程中的imshow,創建窗口,但imshow命令掛起。如果我刪除nameWindow,圖像顯示但閃爍(關閉並重新打開圖像)任何想法?我可以將此作爲如果需要的話,我需要一個新的問題 – Sofia
我需要一些關於線程模型的更多細節?你是否明確地創建了一個輔助線程?如果是這樣,那麼這兩個線程共享什麼資源?imshow()可能無法給你一個輸出因爲當你調用waitKey()時,你在主線程上增加了一個延遲,但不是第二個線程,因此運行速度比fps快 –
這兩個線程不共享顯示窗口以外的任何參數。這是我的代碼。我沒有包含處理部分,因爲它很長。
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);
}
只有當圖像發生變化時才加載圖像? – NathanOliver
窗口不應該被關閉,除非你有一些「closeAllWindowsBla」或類似的代碼或關閉你的應用程序 – Micka