多个监视器上的OpenCV全屏Windows

时间:2014-07-02 20:05:07

标签: opencv

我有一个OpenCV应用程序,通过以下方式显示全屏窗口:

cv::namedWindow("myWindow", CV_WINDOW_NORMAL)
cv::setWindowProperties("myWindow", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN)

它工作正常,但是当我有多个显示器时,它总是在第一个显示器上显示全屏窗口。有没有办法在第二台显示器上显示?我已尝试设置X / Y和宽度/高度,但启用全屏后似乎会忽略它们。

3 个答案:

答案 0 :(得分:2)

<强>编辑:

有时纯OpenCV代码无法在双显示屏上执行全屏窗口。这是一种Qt方式:

#include <QApplication>
#include <QDesktopWidget>
#include <QLabel>

#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main(int argc, char *argv[]) 
{
    QApplication app(argc, argv);
    QDesktopWidget dw;
    QLabel myLabel;

    // define dimension of the second display
    int width_second  = 2560;
    int height_second = 1440;

    // define OpenCV Mat
    Mat img = Mat(Size(width_second, height_second), CV_8UC1);

    // move the widget to the second display
    QRect screenres = QApplication::desktop()->screenGeometry(1);
    myLabel.move(QPoint(screenres.x(), screenres.y()));

    // set full screen
    myLabel.showFullScreen();

    // set Qimg
    QImage Qimg((unsigned char*)img.data, img.cols, img.rows, QImage::Format_Indexed8);

    // set Qlabel
    myLabel.setPixmap(QPixmap::fromImage(Qimg));

    // show the image via Qt
    myLabel.show();

    return app.exec();
}

不要忘记将.pro文件配置为:

TEMPLATE = app
QT += widgets
TARGET = main
LIBS += -L/usr/local/lib -lopencv_core -lopencv_highgui

# Input
SOURCES += main.cpp

在终端中将代码编译为:

qmake
make

<强>原始

有可能。

这是一个有效的演示代码,用于在第二个显示屏上显示全屏图像。从How to display different windows in different monitors with OpenCV暗示:

#include <opencv2/highgui/highgui.hpp>

using namespace cv;

int main ( int argc, char **argv )
{
    // define dimension of the main display
    int width_first  = 1920;
    int height_first = 1200;

    // define dimension of the second display
    int width_second  = 2560;
    int height_second = 1440;

    // move the window to the second display 
    // (assuming the two displays are top aligned)
    namedWindow("My Window", CV_WINDOW_NORMAL);
    moveWindow("My Window", width_first, height_first);
    setWindowProperty("My Window", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN);

    // create target image
    Mat img = Mat(Size(width_second, height_second), CV_8UC1);

    // show the image
    imshow("My Window", img);
    waitKey(0);

    return 0;
}

答案 1 :(得分:1)

我尝试了不同的方法使其正常工作,但不幸的是,似乎使用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));
    }
}

结果:
enter image description here

屏幕尺寸和屏幕零点(我不知道这是否是这一点的正确名称 - 通常它只是一个点,其中有屏幕(0,0)点)你可以使用其他一些库或从Windows控制面板。当您开始移动屏幕时,将显示屏幕零点:
enter image description here

答案 2 :(得分:1)

如果您使用QT编写代码,则可以使用QT5&#34; Widget&#34;。

Here是一个教程,将向您展示如何在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答案中找到here

我自己没有尝试过,所以我无法保证它会起作用,但看起来很可能(如果不是有点矫枉过正)

希望这有帮助。