今天在QT里将视频显示在停靠窗口里,并且能够缩小后,出现滑动条,放大到一定阶段则不再放大。
下面是代码:
dockwindows.h
#ifndef DOCKWINDOWS_H
#define DOCKWINDOWS_H
#include <QMainWindow>
#include <QLabel>
#include <QLineEdit>
#include <QGridLayout>
#include<QScrollArea>
#include <opencv2/opencv.hpp>
using namespace cv;
class DockWindows : public QMainWindow
{
Q_OBJECT
public:
DockWindows(QWidget *parent = 0);
~DockWindows();
private:
QWidget *dock1_window,dock2_window;
QLabel *label1,*label2;//用于显示原始图和二值化图
QScrollArea *scrollArea1,scrollArea2;
// Ui::MainWindow *ui;
cv::Mat frame;
cv::VideoCapture capture;
QImage image;
QTimer *timer1, *timer2;
double rate; //FPS
cv::VideoWriter writer; //make a video record
private slots:
void nextFrame_yuanshitu();
// void nextFrame_erzhihua();
};
#endif // DOCKWINDOWS_H
dockwindows.cpp
#include "dockwindows.h"
//#include "picturebox.h"
#include<QTextEdit>
#include<QDockWidget>
#include <QLabel.h>
#include <QFileDialog>
#include <QTimer>
#include <QTime>
#include <iostream>
#include <set>
#include<stdio.h>
#include <opencv2/core.hpp>
#include <opencv2/opencv.hpp>
#include <time.h>
#include <ctime>
#include <iostream>
#include <string>
using namespace cv;
using namespace std;
//mat转QImage格式(直接调用即可)
QImage Mat2QImage(cv::Mat cvImg)
{
QImage qImg;
if(cvImg.channels()==3) //3 channels color image
{
cv::cvtColor(cvImg,cvImg,CV_BGR2RGB);
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols, cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
else if(cvImg.channels()==1) //grayscale image
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_Indexed8);
}
else
{
qImg =QImage((const unsigned char*)(cvImg.data),
cvImg.cols,cvImg.rows,
cvImg.cols*cvImg.channels(),
QImage::Format_RGB888);
}
return qImg;
}
DockWindows::DockWindows(QWidget *parent)
: QMainWindow(parent)
{
setWindowTitle(tr(" 基于图像识别的象棋机器人")); //设置主窗口的标题栏文字
QTextEdit *te=new QTextEdit(this); //定义一个QTextEdit对象作为主窗口
te->setText(tr("人机对弈界面"));
te->setAlignment(Qt::AlignCenter);
setCentralWidget(te); //将此编辑框设为主窗口的中央窗体
/****************************************************************************************************************/
//停靠窗口1,显示原始图及画圈后的图
QDockWidget *dock1=new QDockWidget(tr("原始图像"),this);
//可移动
dock1->setFeatures(QDockWidget::AllDockWidgetFeatures); //(a)设置窗口特性
dock1->setAllowedAreas(Qt::RightDockWidgetArea);
dock1_window =new QWidget();
//dock1_window
label1 =new QLabel(dock1_window); //编辑窗口,可以放置图片
label1->setScaledContents(true); //图片自适应空间控件大小fit video to label area
scrollArea1 = new QScrollArea; //申请一个滚动区域,它本身是继承于QFramescrollArea->setBackgroundRole(QPalette::Dark);
scrollArea1->setWidget(label1); //必须做的一步,将这个子窗口imageLabel装进scrollArea
dock1->setWidget(scrollArea1);//将控件插入停靠窗体
addDockWidget(Qt::RightDockWidgetArea,dock1);//在mainwindow中加入此停靠窗口
if (capture.isOpened())
capture.release(); //decide if capture is already opened; if so,close it
capture.open(1);
capture.set(CAP_PROP_FRAME_WIDTH, 1920.0);//设置摄像头采集图像分辨率
capture.set(CAP_PROP_FRAME_HEIGHT, 1080.0);
//open the default camera
if (capture.isOpened())
{
capture >> frame;
if (!frame.empty())
{
Mat edges;
Rect rect(600, 0, 1205, 1035); //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height
Mat image_cut = Mat(frame, rect); //从img中按照rect进行切割,此时修改image_cut时image中对应部分也会修改,因此需要copy
Mat image_copy = image_cut.clone(); //clone函数创建新的图片
//灰度化
cvtColor(image_copy, edges, CV_BGR2GRAY);//灰度化
//二值化
threshold(edges, edges, 105, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
//使用3*3内核来降噪
blur(edges, edges, Size(3, 3));//进行模糊
image = Mat2QImage(edges);
// label1->setScaledContents(true); //图片自适应空间控件大小fit video to label area
label1->setPixmap(QPixmap::fromImage(image));
timer1 = new QTimer(this);
timer1->setInterval(30); //set timer match with FPS
connect(timer1, SIGNAL(timeout()), this, SLOT(nextFrame_yuanshitu()));
timer1->start();
}
}
/****************************************************************************************************************/
// //停靠窗口2,显示原始图及画圈后的图
// QDockWidget *dock2=new QDockWidget(tr("原始图像"),this);
// //可移动
// dock2->setFeatures(QDockWidget::AllDockWidgetFeatures); //(a)设置窗口特性
// dock2->setAllowedAreas(Qt::RightDockWidgetArea);
// // dock2_window =new QWidget();
// //dock1_window
// label2 =new QLabel(dock1_window); //编辑窗口,可以放置图片
// label2->setScaledContents(true); //图片自适应空间控件大小fit video to label area
// // scrollArea2 = new QScrollArea; //申请一个滚动区域,它本身是继承于QFramescrollArea->setBackgroundRole(QPalette::Dark);
// scrollArea1->setWidget(label2); //必须做的一步,将这个子窗口imageLabel装进scrollArea
// dock2->setWidget(scrollArea1);//将控件插入停靠窗体
// addDockWidget(Qt::RightDockWidgetArea,dock2);//在mainwindow中加入此停靠窗口
// if (capture.isOpened())
// capture.release(); //decide if capture is already opened; if so,close it
// capture.open(1);
// capture.set(CAP_PROP_FRAME_WIDTH, 1920.0);//设置摄像头采集图像分辨率
// capture.set(CAP_PROP_FRAME_HEIGHT, 1080.0);
// //open the default camera
// if (capture.isOpened())
// {
// capture >> frame;
// if (!frame.empty())
// {
// // Mat edges;
// Rect rect(600, 0, 1205, 1035); //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height
// Mat image_cut = Mat(frame, rect); //从img中按照rect进行切割,此时修改image_cut时image中对应部分也会修改,因此需要copy
// Mat image_copy = image_cut.clone(); //clone函数创建新的图片
// //灰度化
//// cvtColor(image_copy, edges, CV_BGR2GRAY);//灰度化
//// //二值化
//// threshold(edges, edges, 105, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
//// //使用3*3内核来降噪
//// blur(edges, edges, Size(3, 3));//进行模糊
// image = Mat2QImage(image_copy);
// // label1->setScaledContents(true); //图片自适应空间控件大小fit video to label area
// label2->setPixmap(QPixmap::fromImage(image));
// // timer1 = new QTimer(this);
// // timer1->setInterval(30); //set timer match with FPS
// connect(timer1, SIGNAL(timeout()), this, SLOT(nextFrame_yuanshitu()));
// // timer1->start();
// }
// }
/****************************************************************************************************************/
// //停靠窗口2,显示原始图及画圈后的图
// QDockWidget *dock2=new QDockWidget(tr("二值化图像"),this);
// //可移动
// dock2->setFeatures(QDockWidget::AllDockWidgetFeatures); //(a)设置窗口特性
// dock2->setAllowedAreas(Qt::RightDockWidgetArea);
// dock2_window = new QWidget(this);
// //dock1_window
// label2 =new QLabel(dock2_window); //编辑窗口,可以放置图片
// label2->setScaledContents(true); //图片自适应空间控件大小fit video to label area
// scrollArea2 = new QScrollArea; //申请一个滚动区域,它本身是继承于QFramescrollArea->setBackgroundRole(QPalette::Dark);
// scrollArea2->setWidget(label2); //必须做的一步,将这个子窗口imageLabel装进scrollArea
// dock2>setWidget(scrollArea2);//将控件插入停靠窗体
// addDockWidget(Qt::RightDockWidgetArea,dock1);//在mainwindow中加入此停靠窗口
// if (capture.isOpened())
// capture.release(); //decide if capture is already opened; if so,close it
// capture.open(1);
// capture.set(CAP_PROP_FRAME_WIDTH, 1920.0);//设置摄像头采集图像分辨率
// capture.set(CAP_PROP_FRAME_HEIGHT, 1080.0);
// //open the default camera
// if (capture.isOpened())
// {
// capture >> frame;
// if (!frame.empty())
// {
// Mat edges;
// Rect rect(600, 0, 1205, 1035); //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height
// Mat image_cut = Mat(frame, rect); //从img中按照rect进行切割,此时修改image_cut时image中对应部分也会修改,因此需要copy
// Mat image_copy = image_cut.clone(); //clone函数创建新的图片
// //灰度化
// cvtColor(image_copy, edges, CV_BGR2GRAY);//灰度化
// //二值化
// threshold(edges, edges, 105, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
// //使用3*3内核来降噪
// blur(edges, edges, Size(3, 3));//进行模糊
// image = Mat2QImage(edges);
// label2->setScaledContents(true); //图片自适应空间控件大小fit video to label area
// label2->setPixmap(QPixmap::fromImage(image));
// timer = new QTimer(this);
// timer->setInterval(30); //set timer match with FPS
// connect(timer, SIGNAL(timeout()), this, SLOT(nextFrame_erzhihua()));
// timer->start();
// }
// }
//停靠窗口3 显示棋谱
QDockWidget *dock3=new QDockWidget(tr("实时棋谱"),this);
dock3->setFeatures(QDockWidget::AllDockWidgetFeatures); //全部特性
QTextEdit *te3 =new QTextEdit();
te3->setText(tr("红方 黑方 "));
dock3->setWidget(te3);//将控件插入停靠窗体
addDockWidget(Qt::RightDockWidgetArea,dock3);//在mainwindow中加入此停靠窗口
}
//auto get next frame
void DockWindows::nextFrame_yuanshitu()
{
capture >> frame;
if (!frame.empty())
{
Mat edges;
Rect rect(600, 0, 1205, 1035); //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height
Mat image_cut = Mat(frame, rect); //从img中按照rect进行切割,此时修改image_cut时image中对应部分也会修改,因此需要copy
Mat image_copy = image_cut.clone(); //clone函数创建新的图片
//灰度化
cvtColor(image_copy, edges, CV_BGR2GRAY);//灰度化
//二值化
threshold(edges, edges, 105, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
//使用3*3内核来降噪
blur(edges, edges, Size(3, 3));//进行模糊
image = Mat2QImage(edges);
// QImage result = image.scaled(800, 600).scaled(800, 600);//放缩图片,以固定大小显示
// QImage result = image.scaled(label1->size(), Qt::KeepAspectRatio);//放缩图片,适应控件大小
// image->scaled(label1->size(), Qt::KeepAspectRatio);
// label1->setScaledContents(true); //图片自适应空间控件大小fit video to label area
// QImage result = image.scaled(label1->size(), Qt::KeepAspectRatio);//放缩图片,适应控件大小
label1->setPixmap(QPixmap::fromImage(image));//在Label控件上显示图片
label1->resize(dock1_window->size());
//label1->show();
}
}
// //auto get next frame
// void DockWindows::nextFrame_erzhihua()
// {
// capture >> frame;
// if (!frame.empty())
// {
// Mat edges;
// Rect rect(600, 0, 1205, 1035); //创建一个Rect框,属于cv中的类,四个参数代表x,y,width,height
// Mat image_cut = Mat(frame, rect); //从img中按照rect进行切割,此时修改image_cut时image中对应部分也会修改,因此需要copy
// Mat image_copy = image_cut.clone(); //clone函数创建新的图片
// //灰度化
// cvtColor(image_copy, edges, CV_BGR2GRAY);//灰度化
// //二值化
// threshold(edges, edges, 105, 255, CV_THRESH_BINARY | CV_THRESH_OTSU);
// //使用3*3内核来降噪
// blur(edges, edges, Size(3, 3));//进行模糊
// image = Mat2QImage(edges);
// label2->setPixmap(QPixmap::fromImage(image));//在Label控件上显示图片
// label2->resize(dock2_window->size());
// //label1->show();
// }
// }
DockWindows::~DockWindows()
{
}
主函数:
#include "dockwindows.h"
#include <QApplication>
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
QFont font("楷体",16,QFont::Bold); //设置字体,大小,整个
a.setFont(font);
DockWindows w;
w.show();
return a.exec();
}
小一些
放大后