2014-07-02 89 views
5

我有一個顯示全屏窗口的OpenCV的應用,通過:OpenCV的全屏窗口多臺顯示器上

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

它工作正常,但是當我有多個顯示器總是顯示在第一監視器上全屏窗口。有沒有辦法在第二臺顯示器上顯示?我已經嘗試設置X/Y和寬度/高度,但是一旦啓用全屏,它們似乎會被忽略。

+0

在啓用全屏前設置X/Y不起作用?也許openCV GUI對你的需求太有限了(它並不意味着被用於最終用戶的質量,也許切換到一些真正的GUI庫) – Micka

回答

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

1

如果您使用QT編寫代碼,您可以使用QT5的「Widget」。

Here是一個教程,將向您展示如何在QT Widget中顯示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(); 

(代碼發現here另一個SO接聽)

我沒有嘗試這樣做我自己,所以我不能保證它會工作,但是,但它似乎(如果不是一點矯枉過正)

希望這會有所幫助。

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; 
}