为什么窗口名称会在创建时更改窗口大小



我使用OpenCV库创建了一个窗口,在其中显示文件夹中的图像。(单击空格键可更改图像(。

在窗口名称中,我想显示已经显示的图像的计数,例如";20个图像中的10个";。

问题出现了,当我单击空格键,显示带有另一个图像的新窗口时,窗口的大小会发生变化(有时窗口会移动到屏幕上的另一个位置(。我怎样才能使窗户的尺寸稳定?我希望每次显示新图像时创建的所有窗口都具有相同的大小和位置。

下面的代码,我使用:

fullWindowName = SmString(windowName) << " " << i <<  " Out of " << filePaths.size();
cv::namedWindow(cv::String(fullWindowName), WINDOW_NORMAL | WINDOW_KEEPRATIO);
cv::imshow(cv::String(fullWindowName), srcDisp);
cv::setMouseCallback(cv::String(fullWindowName), on_Mouse, &srcDisp);

您只需要resizeWindowmoveWindow就可以实现这一点。

以下是一些示例代码:

#include <opencv.hpp>
int main()
{
std::vector<cv::Mat> images;
/* Feed some images here ... */
int width = 640;
int height = 480;
int x = 100;
int y = 100;
for (int i = 0; i < images.size(); i++) {
cv::destroyAllWindows();
std::stringstream ss;
ss << i + 1 << " out of " << images.size() << " images";
std::string windowName = ss.str();
cv::namedWindow(windowName, cv::WINDOW_NORMAL | cv::WINDOW_KEEPRATIO);
cv::resizeWindow(windowName, width, height);
cv::moveWindow(windowName, x, y);
cv::imshow(windowName, images[i]);
cv::waitKey(0);
}
return 0;
}

cv::WINDOW_KEEPRATIO对我不起作用,可能是因为缺少Qt后端,请参阅文档:

Qt后端支持其他标志:

WINDOW_NORMAL或WINDOW_AUTOSIZE:WINDOW_NORMEL允许您调整窗口大小,而WINDOW_AUTOS IZE会自动调整窗口大小以适应显示的图像(请参阅imshow(,并且您不能手动更改窗口大小。

WINDOW_FREERATIO或WINDOW_KEEPRATIO:WINDOW_FREERATIO调整图像,而不考虑其比例,而WINDOW_GEEPRATIO保持图像比例。

WINDOW_GUI_NORMAL或WINOW_GUI_EXPANDED:WINOW_GUI_NORMAL是在没有状态栏和工具栏的情况下绘制窗口的旧方法,而WINDOW_GUI_EXPANDED是一种新的增强型GUI。默认情况下,flags==WINDOW_AUTOSIZE|WINDOW_KEEPRATIO | WINDOW_GUI_EXPANDED

除此之外,所有显示的图像的窗口大小和位置都是恒定的。

最新更新