将opencv的Mat对象显示到Qt label有两种方法:
1.通过把opencv的 Mat对象转为Qt 的 pixelmap,这种方法费时,不推荐。网上有很多实现方法。
2.通过转换窗口的 父 句柄,把 cv::namedWindow(title,cv::WINDOW_GUI_NORMAL);
的父句柄改为Qt控件label的句柄。
见代码及注释
#include <Windows.h>
#include "opencv2/highgui/highgui.hpp"
#include <opencv2/highgui/highgui_c.h>
//opencv4以后需 添加<opencv2/highgui/highgui_c.h>才有cvGetWindowHandle
QtGuiApplication3::QtGuiApplication3(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
std:: string title = "采集保存";
cv::namedWindow(title,cv::WINDOW_GUI_NORMAL);
HWND hWnd = (HWND)cvGetWindowHandle(title.c_str());//获得名为 title 窗口的句柄。
HWND hParent = GetParent(hWnd);//获得名为 title 窗口的父句柄。
SetParent(hWnd, (HWND)ui.label_10->winId());//把label的句柄设为 hWnd 的父句柄。(HWND)ui.label_10->winId()获取label的句柄。
ShowWindow(hParent, SW_HIDE);//显示hParent句柄代表的窗口,第二个参数设为SW_HIDE,隐藏之前的窗口。
cv::resizeWindow("采集保存", cv::Size(800, 800));//重置窗口大小,以适应label的大小。
}
void QtGuiApplication3::on_pushButton_5_clicked() {
//省略Buffer2_img_src的定义,可以是Mat可接收的任意尺寸、类型图片。
.
.
.
cv::imshow(title, Buffer2_img_src);
}
这样每一张图片都可以显示到Qt的label中,把label的大小设为800*800即可。
喜欢记得点个赞噢!
QVQ