多显示器上的OpenCV全屏窗口
我有一个OpenCV应用程序,通过以下方式显示全屏窗口:多显示器上的OpenCV全屏窗口,opencv,Opencv,我有一个OpenCV应用程序,通过以下方式显示全屏窗口: cv::namedWindow("myWindow", CV_WINDOW_NORMAL) cv::setWindowProperties("myWindow", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN) 它工作正常,但当我有多个显示器时,它总是在第一个显示器上显示全屏窗口。有没有办法在第二台显示器上显示?我尝试过设置X/Y和宽度/高度,但一旦启用全屏,它们似乎就会被忽略。我尝试了不同的
cv::namedWindow("myWindow", CV_WINDOW_NORMAL)
cv::setWindowProperties("myWindow", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN)
它工作正常,但当我有多个显示器时,它总是在第一个显示器上显示全屏窗口。有没有办法在第二台显示器上显示?我尝试过设置X/Y和宽度/高度,但一旦启用全屏,它们似乎就会被忽略。我尝试了不同的方法使其工作,但不幸的是,使用OpenCV似乎无法实现这一点。你唯一能做的就是在主(主)屏幕上只使用当前代码显示一个窗口,然后手动处理第二个窗口-设置窗口位置,调整图像大小,然后使用
imshow
功能显示它。以下是一些例子:
void showWindowAlmostFullscreen(cv::Mat img, std::string windowTitle, cv::Size screenSize, cv::Point screenZeroPoint)
{
screenSize -= cv::Size(100, 100); //leave some place for window title bar etc
double xScallingFactor = (float)screenSize.width / (float)img.size().width;
double yScallingFactor = (float)screenSize.height / (float)img.size().height;
double minFactor = std::min(xScallingFactor, yScallingFactor);
cv::Mat temp;
cv::resize(img, temp, cv::Size(), minFactor, minFactor);
cv::moveWindow(windowTitle, screenZeroPoint.x, screenZeroPoint.y);
cv::imshow(windowTitle, temp);
}
int _tmain(int argc, _TCHAR* argv[])
{
cv::Mat img1 = cv::imread("D:\\temp\\test.png");
cv::Mat img2;
cv::bitwise_not(img1, img2);
cv::namedWindow("img1", CV_WINDOW_AUTOSIZE);
cv::setWindowProperty("img1", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
cv::namedWindow("img2");
while(cv::waitKey(1) != 'q')
{
cv::imshow("img1", img1);
cv::setWindowProperty("img1", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);
showWindowAlmostFullscreen(img2, "img2", cv::Size(1366, 768), cv::Point(260, 1080));
}
}
结果是:屏幕大小和屏幕零点(我不知道这是否是该点的正确名称-通常这只是一个有屏幕(0,0)点的点),您可以使用其他库或从windows控制面板获得。开始移动屏幕时将显示屏幕零点:
如果您使用QT编写代码,您可能会使用QT5的“小部件” 是一个教程,将向您展示如何在QT小部件中显示OpenCV图像 一旦你完成了这项工作,你就可以使用这样的东西:
QScreen *screen = QGuiApplication::screens()[1]; // specify which screen to use
SecondDisplay secondDisplay = new SecondDisplay(); // your widget
** Add your code to display opencv image in widget here **
secondDisplay->move(screen->geometry().x(), screen->geometry().y());
secondDisplay->resize(screen->geometry().width(), screen->geometry().height());
secondDisplay->showFullScreen();
(在另一个SO答案上找到代码)
我自己还没有试过,所以我不能保证它会起作用,但是它看起来很可能(如果不是有点过分的话)
希望这有帮助。编辑: 有时,纯OpenCV代码无法在双显示器上显示全屏窗口。下面是一种方法:
#包括
#包括
#包括
#包括
使用名称空间cv;
int main(int argc,char*argv[])
{
QApplication应用程序(argc、argv);
qdesktopdw;
QLabel-myLabel;
//定义第二个显示的尺寸
整数宽度_秒=2560;
整数高度_秒=1440;
//定义OpenCV Mat
Mat img=Mat(尺寸(宽度秒、高度秒)、CV秒8UC1);
//将小部件移动到第二个显示器
QRect screenres=QApplication::desktop()->screenGeometry(1);
移动(QPoint(screenres.x(),screenres.y());
//设置全屏
myLabel.showFullScreen();
//设置Qimg
QImage Qimg((无符号字符*)img.data、img.cols、img.rows、QImage::Format_Indexed8);
//集Qlabel
setPixmap(QPixmap::frommage(Qimg));
//通过Qt显示图像
myLabel.show();
返回app.exec();
}
不要忘记将.pro
文件配置为:
TEMPLATE = app
QT += widgets
TARGET = main
LIBS += -L/usr/local/lib -lopencv_core -lopencv_highgui
# Input
SOURCES += main.cpp
在终端中,将代码编译为:
qmake
制作
原件: 这是可能的 这是一个正在运行的演示代码,用于在第二个显示器上显示全屏图像。暗示来自:
#包括
使用名称空间cv;
int main(int argc,字符**argv)
{
//定义主显示器的尺寸
int width_first=1920;
int height_first=1200;
//定义第二个显示的尺寸
整数宽度_秒=2560;
整数高度_秒=1440;
//将窗口移到第二个显示屏
//(假设两个显示器顶部对齐)
namedWindow(“我的窗口”,CV\u窗口\u正常);
移动窗口(“我的窗口”,先宽后高);
setWindowProperty(“我的窗口”,CV\u WND\u PROP\u全屏,CV\u Window\u全屏);
//创建目标图像
Mat img=Mat(尺寸(宽度秒、高度秒)、CV秒8UC1);
//显示图像
imshow(“我的窗口”,img);
等待键(0);
返回0;
}
启用全屏前设置X/Y不起作用?也许openCV GUI对于您的需求来说太有限了(它不适合用于最终用户质量,也许可以切换到一些真正的GUI库)