vs2013+QT,把opencv窗体嵌入qt的控件里


下面的代码演示将opencv的窗口嵌入到label里面显示。即labDisplayImg里面显示。


image.png


image.png


#include <windows.h>

oid QtForOpencv::OnReadimg(){
	 QString filename = QFileDialog::getOpenFileName(this,
		tr("选择图像"),
		"",
		tr("Images (*.png *.bmp *.jpg *.tif *.GIF )"));
	if (filename.isEmpty())
	{
		return;
	}else
	{
	    Mat src=imread(filename.toStdString());
		QString title = "photo1";
		namedWindow(title.toStdString(), 1); // CV_WINDOW_NORMAL); // 0;
		//resizeWindow(title, 640, 480);  //设置窗口大小
		//moveWindow(title, 100, 100);		//移动窗口到指定位置
		HWND hwnd = (HWND)cvGetWindowHandle(title.toLatin1().data()); //toLatinl()转char*
		//取title窗体的父窗体句柄
		HWND hparent =::GetParent(hwnd);
		//改变某个子窗体的父窗口(子窗口句柄,新的父窗口句柄)
		::SetParent(hwnd, (HWND)ui.labDisplayImg->winId());  //winId()取win32api要用的窗口句柄
		//显示窗体SW_SHOW  隐藏窗体SW_HIDE
		::ShowWindow(hparent, SW_HIDE);
		imshow(title.toStdString(), src);


		/*设置label图像
		QImage* img = new QImage;
		if (!(img->load(filename))){
		//加载图像
		QMessageBox::information(this,
		tr("打开图像失败"),
		tr("打开图像失败!"));
		delete img;
		return;
		}
		ui.labDisplayImg->setPixmap(QPixmap::fromImage(*img));*/
	}
}


这里要提一下,如果在QT里面想使用win32 api的话,需要引入<windows.h>


--------------------- 

作者:hackpig

来源:www.skcircle.com

版权声明:本文为博主原创文章,转载请附上博文链接!



#转载请注明出处 www.skcircle.com 《少有人走的路》勇哥的工业自动化技术网站。如果需要本贴图片源码等资源,请向勇哥索取。
  • 评论列表:
  •  Akar
     发布于 2020-05-11 19:09:06  回复该评论
  • 您好,我按照您的代码跑了一下,程序运行时label框是灰色,然后会生成一个新的窗口显示图像,请问怎么解决呢?
    •  访客
       发布于 2020-05-11 20:19:51  回复该评论
    • 这个程序本来就是这个效果呀,不是嵌入lable里
  •  访客
     发布于 2020-12-03 12:56:44  回复该评论
  • #include
    ...
    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); // 移动显示的位置(很重要)
    }

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

会员中心
搜索
«   2021年1月   »
123
45678910
11121314151617
18192021222324
25262728293031
网站分类
标签列表
最新留言
    热门文章 | 热评文章 | 随机文章
文章归档
友情链接
  • 订阅本站的 RSS 2.0 新闻聚合
  • 扫描加本站机器视觉QQ群,验证答案为:halcon勇哥的机器视觉
  • 扫描加站长微信:站长微信:abc496103864
  • 扫描加站长QQ:
  • 扫描赞赏本站:

Powered By Z-BlogPHP 1.6.0 Valyria

Copyright Your skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864