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

qq_40283506 2018-08-18 11:02:34
各位大佬有什么办法吗因为我调用了setmousecallback好像只能在OPENCV的窗口上用所以怎么能把这个显示图片的窗口嵌入到QT的UI界面中或者setmousecallback有办法直接对Qlabel上显示的图片作用
...全文
2269 15 打赏 收藏 转发到动态 举报
写回复
用AI写文章
15 条回复
切换为时间正序
请发表友善的回复…
发表回复
学嗨无涯 2021-01-28
  • 打赏
  • 举报
回复
,这样也不行呀,ubuntu下有没有类似windows.h的头文件呢?百度搜索看Ubuntu中的头文件也没见对控件操作。看来要转战win下的了
赵4老师 2021-01-27
  • 打赏
  • 举报
回复
引用 15 楼 sqlxby 的回复:
想知道在ubuntu系统下不能使用windows头文件,该怎么做呢?
先在ubuntu下的虚拟机软件下安装WinXP,然后在里面的WinXP下使用windows头文件。 虽然我也没实际这么用过。
学嗨无涯 2021-01-27
  • 打赏
  • 举报
回复 1
想知道在ubuntu系统下不能使用windows头文件,该怎么做呢?
leomsk 2020-12-03
  • 打赏
  • 举报
回复 1
遇到同样的问题,不断的尝试,这个问题终于解决了。 关键位置有两个: 1. 使用WinAPI 函数FindWindow 代替 opencv 函数 cvGetWindowHandle获取窗口句柄 2. 最后使用cvMoveWindow函数重置嵌入的子窗口位置,否则可能在非显示区域导致看不到任何画面。 #include <opencv2/highgui/highgui_c.h> ... void MainWindow::EmbedCvWindow( HWND pWnd, QString strWndName, int w, int h ) { //cvNamedWindow(strWndName.toStdString().c_str(), CV_GUI_NORMAL);// flag is only for Qt cvNamedWindow(strWndName.toStdString().c_str(), CV_WINDOW_NORMAL); //HWND hWnd = (HWND)cvGetWindowHandle(strWndName.toStdString().c_str()); HWND hWnd =::FindWindow(NULL,strWndName.toStdWString().c_str()); // 代替 'cvGetWindowHandle' HWND hParent = ::GetParent((HWND)hWnd); ::SetParent(hWnd, pWnd); ::SetWindowLong(hWnd,GWL_STYLE,WS_CLIPCHILDREN|WS_CLIPSIBLINGS|WS_CHILDWINDOW|WS_VISIBLE); ::SetWindowLong(hWnd,GWL_EXSTYLE,WS_EX_LEFT|WS_EX_RTLREADING/*|WS_EX_TOPMOST*/); ::ShowWindow(hParent, SW_HIDE); cvResizeWindow(strWndName.toStdString().c_str(), w,h); cvMoveWindow(strWndName.toStdString().c_str(),0,0); // 移动显示的位置(很重要) }
weixin_39901619 2020-06-15
  • 打赏
  • 举报
回复
请问下楼主 这个问题你解决了没有啊
aeolus.ding 2020-05-05
  • 打赏
  • 举报
回复
this->resize(600,400); QWidget* qWidget =new QWidget (this) ; qWidget->resize(300,300); qWidget->move(0,0); namedWindow("view", WINDOW_NORMAL); resizeWindow("view",300,300); HWND Whnd=static_cast<HWND>( cvGetWindowHandle("view")); qDebug()<<Whnd; if (Whnd) { HWND hParent = ::GetParent(Whnd); ::SetParent(Whnd,(HWND)qWidget->winId()); ::ShowWindow(hParent, SW_HIDE);//隐藏运行程序框 }
cxbmsdn 2018-12-06
  • 打赏
  • 举报
回复
我贴一个完整代码


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



MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);

// 打开摄像头
bool ok = mvCapture.open(0);

namedWindow("view", WINDOW_AUTOSIZE);

HWND Whnd;
Whnd=(HWND)cvGetWindowHandle("view");
if (Whnd)
{
HWND parentHwnd;
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()
{
delete ui;
}


// 显示定时器
void MainWindow::OnTimer()
{
Mat srcImage;
mvCapture>>srcImage;
imshow("view", srcImage);
}

cxbmsdn 2018-12-06
  • 打赏
  • 举报
回复


namedWindow("view", WINDOW_AUTOSIZE);

HWND Whnd;
Whnd=(HWND)cvGetWindowHandle("view");
if (Whnd)
{
HWND parentHwnd;
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);//显示
}
}


cxbmsdn 2018-12-06
  • 打赏
  • 举报
回复
@赵4老师
谢谢您的回复,我使用你的代码进行了测试,parentHwnd的值始终是0,然后程序依然没有达到效果,具体代码如下:

namedWindow("view", WINDOW_AUTOSIZE);

HWND Whnd;
Whnd=(HWND)cvGetWindowHandle("view");
if (Whnd)
{
HWND parentHwnd;
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);//显示
}
}
赵4老师 2018-12-06
  • 打赏
  • 举报
回复
    HWND Whnd;
Whnd=(HWND)cvGetWindowHandle("view");
if (Whnd) {
HWND parentHwnd;
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);//显示
}
cxbmsdn 2018-12-06
  • 打赏
  • 举报
回复
@赵4老师 请帮忙看看吧
cxbmsdn 2018-12-06
  • 打赏
  • 举报
回复
比较邪门,我用SPY++确认过HWND值,没有问题,
::SetParent(hWnd, (HWND)winId());的执行也是成功的,
返回的句柄能够通过::ShowWindow(hParent, SW_HIDE);进行隐藏。
但是imshow的画面就是无法显示到QT界面上。。。吐血。。
不清楚到底是什么原因导致了这个问题。。
cxbmsdn 2018-12-06
  • 打赏
  • 举报
回复
cvGetWindowHandle获取的句柄在cvGetWindowName无法获取正确的窗口名称,SetWindowLong使用了也没办法,然后我借鉴了另外一个方案

namedWindow("view", WINDOW_AUTOSIZE);

HWND hWnd = (HWND) cvGetWindowHandle("view");

HWND hParent = ::GetParent(hWnd);

::SetParent(hWnd, (HWND)winId());

::ShowWindow(hParent, SW_HIDE);

但是仍然无法将imshow窗口嵌入到QT。。。不知道哪里操作不对
CyberLogix 2018-08-20
  • 打赏
  • 举报
回复
cvGetWindowHandle
赵4老师 2018-08-19
  • 打赏
  • 举报
回复
cvGetWindowHandle
SetWindowLong

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧