QT5显示视频或者图片缩小后以滚动条方式显示

今天在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();
}

小一些
这里写图片描述
放大后
这里写图片描述

猜你喜欢

转载自blog.csdn.net/mao_hui_fei/article/details/80160333