我有一个OpenCV应用程序,通过以下方式显示全屏窗口:
cv::namedWindow("myWindow", CV_WINDOW_NORMAL)
cv::setWindowProperties("myWindow", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN)
它工作正常,但是当我有多个显示器时,它总是在第一个显示器上显示全屏窗口。有没有办法在第二台显示器上显示?我已尝试设置X / Y和宽度/高度,但启用全屏后似乎会忽略它们。
答案 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));
}
}
结果:
屏幕尺寸和屏幕零点(我不知道这是否是这一点的正确名称 - 通常它只是一个点,其中有屏幕(0,0)点)你可以使用其他一些库或从Windows控制面板。当您开始移动屏幕时,将显示屏幕零点:
答案 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)
我自己没有尝试过,所以我无法保证它会起作用,但看起来很可能(如果不是有点矫枉过正)
希望这有帮助。