大致发生的环境条件是: 在QT的工程里,起了一个新线程,并且在这个新线程里调用opencv库的函数
cv::namedWindow("video", 0);
cv::imshow("video", frame);
打开了一个新窗口。最后希望调用destroyAllWindows()来关闭打开的窗口,导致应用crash。
非常奇怪的是,在QT-creater中使用debug模式编译,就可以正常调用destroyAllWindows来关闭imshow的窗口, 但是到release模式下,百分百的调用destroyAllWindows会crash。
最后使用的解决办法是获取该窗体的句柄,不需要显示时,隐藏它,需要显示时,重新show出来。
#include <windows.h>
HWND hCvWnd = FindWindow(NULL, L"video");
SetWindowPos(hCvWnd, HWND_BOTTOM, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_HIDEWINDOW); // hide window
SetWindowPos(hCvWnd, HWND_TOP, 0, 0, 0, 0, SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW); // show window
查看了很多opencv的例子,都是在应用的主线程里调用imshow(),然后在结束时调用destroyAllWindows()来关闭窗口。类似另起线程做imshow的用法几乎没有看到。怀疑是线程之间同步没有做好导致的crash。