如何把OPENCV namedshow(窗口)嵌入到QTUI界面中

[复制链接]
查看11 | 回复9 | 2021-1-27 05:13:52 | 显示全部楼层 |阅读模式
各位大佬有什么办法吗因为我调用了setmousecallback好像只能在OPENCV的窗口上用所以怎么能把这个显示图片的窗口嵌入到QT的UI界面中或者setmousecallback有办法直接对Qlabel上显示的图片作用
分 -->
回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
cvGetWindowHandle
SetWindowLong
回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
cvGetWindowHandle
回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
cvGetWindowHandle获取的句柄在cvGetWindowName无法获取正确的窗口名称,SetWindowLong使用了也没办法,然后我借鉴了另外一个方案
namedWindow("view",WINDOW_AUTOSIZE);
HWNDhWnd=(HWND)cvGetWindowHandle("view");
HWNDhParent=::GetParent(hWnd);
::SetParent(hWnd,(HWND)winId());
::ShowWindow(hParent,SW_HIDE);
但是仍然无法将imshow窗口嵌入到QT。。。不知道哪里操作不对

回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
比较邪门,我用SPY++确认过HWND值,没有问题,
::SetParent(hWnd,(HWND)winId());的执行也是成功的,
返回的句柄能够通过::ShowWindow(hParent,SW_HIDE);进行隐藏。
但是imshow的画面就是无法显示到QT界面上。。。吐血。。
不清楚到底是什么原因导致了这个问题。。
回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
@赵4老师请帮忙看看吧
回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
HWNDWhnd;
Whnd=(HWND)cvGetWindowHandle("view");
if(Whnd){
HWNDparentHwnd;
parentHwnd=(HWND)GetWindowLong(Whnd,GWL_HWNDPARENT);
if(parentHwnd)ShowWindow(parentHwnd,SW_HIDE);//隐藏
SetWindowLong(parentHwnd,GWL_STYLE,/*WS_CLIPCHILDREN|*/WS_CLIPSIBLINGS|WS_CHILDWINDOW);//隐藏标题栏
SetWindowLong(parentHwnd,GWL_EXSTYLE,WS_EX_TOPMOST);//在最前面
if(parentHwnd)ShowWindow(parentHwnd,SW_SHOW);//显示
}

回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
@赵4老师
谢谢您的回复,我使用你的代码进行了测试,parentHwnd的值始终是0,然后程序依然没有达到效果,具体代码如下:
namedWindow("view",WINDOW_AUTOSIZE);
HWNDWhnd;
Whnd=(HWND)cvGetWindowHandle("view");
if(Whnd)
{
HWNDparentHwnd;
parentHwnd=(HWND)GetWindowLong(Whnd,GWL_HWNDPARENT);
if(parentHwnd)
{
ShowWindow(parentHwnd,SW_HIDE);//隐藏
}
SetWindowLong(parentHwnd,GWL_STYLE,/*WS_CLIPCHILDREN|*/WS_CLIPSIBLINGS|WS_CHILDWINDOW);//隐藏标题栏
SetWindowLong(parentHwnd,GWL_EXSTYLE,WS_EX_TOPMOST);//在最前面
if(parentHwnd)
{
ShowWindow(parentHwnd,SW_SHOW);//显示
}
}
回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层

namedWindow("view",WINDOW_AUTOSIZE);
HWNDWhnd;
Whnd=(HWND)cvGetWindowHandle("view");
if(Whnd)
{
HWNDparentHwnd;
parentHwnd=(HWND)GetWindowLong(Whnd,GWL_HWNDPARENT);
if(parentHwnd)
{
ShowWindow(parentHwnd,SW_HIDE);//隐藏
}
SetWindowLong(parentHwnd,GWL_STYLE,/*WS_CLIPCHILDREN|*/WS_CLIPSIBLINGS|WS_CHILDWINDOW);//隐藏标题栏
SetWindowLong(parentHwnd,GWL_EXSTYLE,WS_EX_TOPMOST);//在最前面
if(parentHwnd)
{
ShowWindow(parentHwnd,SW_SHOW);//显示
}
}


回复

使用道具 举报

千问 | 2021-1-27 05:13:52 | 显示全部楼层
我贴一个完整代码

#include"mainwindow.h"
#include"ui_mainwindow.h"

MainWindow::MainWindow(QWidget*parent):
QMainWindow(parent),
ui(newUi::MainWindow)
{
ui->setupUi(this);
//打开摄像头
boolok=mvCapture.open(0);
namedWindow("view",WINDOW_AUTOSIZE);
HWNDWhnd;
Whnd=(HWND)cvGetWindowHandle("view");
if(Whnd)
{
HWNDparentHwnd;
parentHwnd=(HWND)GetWindowLong(Whnd,GWL_HWNDPARENT);
if(parentHwnd)
{
ShowWindow(parentHwnd,SW_HIDE);//隐藏
}
SetWindowLong(parentHwnd,GWL_STYLE,/*WS_CLIPCHILDREN|*/WS_CLIPSIBLINGS|WS_CHILDWINDOW);//隐藏标题栏
SetWindowLong(parentHwnd,GWL_EXSTYLE,WS_EX_TOPMOST);//在最前面
if(parentHwnd)
{
ShowWindow(parentHwnd,SW_SHOW);//显示
}
}
QObject::connect(&dataTimer,SIGNAL(timeout()),this,SLOT(OnTimer()));
dataTimer.start(100);

//QWidget*a=QWidget::find((WId)hWnd1);
//ui->gridLayout->addWidget(a);
}
MainWindow::~MainWindow()
{
deleteui;
}

//显示定时器
voidMainWindow::OnTimer()
{
MatsrcImage;
mvCapture>>srcImage;
imshow("view",srcImage);
}
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

主题

0

回帖

4882万

积分

论坛元老

Rank: 8Rank: 8

积分
48824836
热门排行