Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
多显示器上的OpenCV全屏窗口_Opencv - Fatal编程技术网

多显示器上的OpenCV全屏窗口

多显示器上的OpenCV全屏窗口,opencv,Opencv,我有一个OpenCV应用程序,通过以下方式显示全屏窗口: cv::namedWindow("myWindow", CV_WINDOW_NORMAL) cv::setWindowProperties("myWindow", CV_WND_PROP_FULLSCREEN, CV_WINDOW_FULLSCREEN) 它工作正常,但当我有多个显示器时,它总是在第一个显示器上显示全屏窗口。有没有办法在第二台显示器上显示?我尝试过设置X/Y和宽度/高度,但一旦启用全屏,它们似乎就会被忽略。我尝试了不同的

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

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库)