OpenCV 3.3.0 C++调用imshow弹出两个同名窗口问题求助
解决OpenCV 3.3.0弹出重复窗口的问题
我来帮你排查这个弹出两个“HI”窗口的问题,主要有两个关键点需要修正:
1. 修复图像路径的转义错误
在C++字符串中,反斜杠\是转义字符,直接写"C:\Users\MY_PC\Desktop\Image.bmp"会导致路径解析错误——比如\U会被当成Unicode转义序列,最终imread可能无法正确读取图像(甚至读取到空矩阵)。你需要把路径改成以下两种格式之一:
// 方式1:使用双反斜杠转义 cv::Mat im0 = cv::imread("C:\\Users\\MY_PC\\Desktop\\Image.bmp"); // 方式2:使用正斜杠(推荐,避免转义问题) cv::Mat im0 = cv::imread("C:/Users/MY_PC/Desktop/Image.bmp");
2. 避免重复创建窗口的冗余操作
OpenCV的imshow函数会自动创建指定名称的窗口(如果窗口不存在),而你先调用namedWindow("HI")再调用imshow("HI", I),在VS调试模式搭配OpenCV 3.x的特定环境下,可能触发重复创建窗口的异常。
解决方法很简单,两种方案任选其一:
方案A:移除namedWindow(推荐)
直接使用imshow即可,它会自动完成窗口创建:
cv::Mat im0 = cv::imread("C:/Users/MY_PC/Desktop/Image.bmp"); cv::Mat I; // 务必提前声明Mat变量! cv::resize(im0, I, cv::Size(640, 480), 0, 0, cv::INTER_LINEAR); cv::imshow("HI", I); cv::waitKey(0);
方案B:保留namedWindow并指定窗口标志
如果你需要自定义窗口属性(比如可调整大小),可以保留namedWindow并明确指定窗口类型,确保窗口创建唯一:
cv::Mat im0 = cv::imread("C:/Users/MY_PC/Desktop/Image.bmp"); cv::Mat I; cv::resize(im0, I, cv::Size(640, 480), 0, 0, cv::INTER_LINEAR); cv::namedWindow("HI", cv::WINDOW_AUTOSIZE); // 显式指定窗口标志 cv::imshow("HI", I); cv::waitKey(0);
另外还要注意:确保cv::Mat I是提前声明的局部变量,不要使用未初始化的全局变量,否则可能引发奇怪的内存异常。
按照上面的方法修改后,应该只会弹出一个显示图像的“HI”窗口了。
内容的提问来源于stack exchange,提问作者Peyman
相关产品推荐
相关产品推荐

