QT+OPENCV摄像头的三种效果显示

QT+OPENCV摄像头的三种效果显示

opencv在window下的qt的mingw库需要自己编译,注意高版本的opencv可能不包含mingw,而本次采用的是OpenCV-2.4.3版,然后用cmake工具进行编译。参考链接:http://blog.csdn.net/qiurisuixiang/article/details/8665278/


QT_XCT.pro  //工程文件

QT       += core gui

greaterThan(QT_MAJOR_VERSION, 4): QT += widgets

TARGET = QT_XCT
TEMPLATE = app

DEFINES += QT_DEPRECATED_WARNINGS

SOURCES += main.cpp\
        mainwindow.cpp \
    login.cpp

HEADERS  += mainwindow.h \
    login.h

FORMS    += mainwindow.ui \
    login.ui

RESOURCES += \
    src/image.qrc

INCLUDEPATH+=C:\OpenCV\include\opencv\
                    C:\OpenCV\include\opencv2\
                    C:\OpenCV\include

LIBS+=C:\OpenCV\lib\libopencv_calib3d243.dll.a\
        C:\OpenCV\lib\libopencv_contrib243.dll.a\
        C:\OpenCV\lib\libopencv_core243.dll.a\
        C:\OpenCV\lib\libopencv_features2d243.dll.a\
        C:\OpenCV\lib\libopencv_flann243.dll.a\
        C:\OpenCV\lib\libopencv_gpu243.dll.a\
        C:\OpenCV\lib\libopencv_highgui243.dll.a\
        C:\OpenCV\lib\libopencv_imgproc243.dll.a\
        C:\OpenCV\lib\libopencv_legacy243.dll.a\
        C:\OpenCV\lib\libopencv_ml243.dll.a\
        C:\OpenCV\lib\libopencv_objdetect243.dll.a\
        C:\OpenCV\lib\libopencv_video243.dll.a


mainwindow.h //头文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include
#include
#include
#include
#include
#include
#include
#include
#include
#include "opencv2/opencv.hpp"
#include
#include
using namespace cv;
using namespace std;

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();
    void delSignal(int);
    void getview1();
    void getview2();
    void getview3();


public slots:
    void on_btn_normal_clicked();

    void on_btn_border_clicked();

    void on_btn_heibai_clicked();

signals:
     void mySignal(int);

private:
      Ui::MainWindow *ui;
      Mat srcImage;
     VideoCapture videoCap;
//     QLabel *imageLabel;
//     QProcess m_process;
     QWindow *m_window;
     QWidget *m_widget;
     WId wid;
     char c;

};

#endif // MAINWINDOW_H

mainwindow.cpp//源文件
#include "mainwindow.h"
#include "ui_mainwindow.h"
#include
#include
#include
#include


MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    setWindowTitle("XCT");
    setWindowIcon(QIcon("qrc:/new/prefix1/logo.jpg"));
    resize(587,455);
    m_window=NULL;
    m_widget=NULL;
    connect(this,&MainWindow::mySignal,this,&MainWindow::delSignal);
}

MainWindow::~MainWindow()
{
    delete ui;
}

void MainWindow::delSignal(int sig)
{
    switch(sig)
    {
    case 100:
        destroyWindow("normal");

        getview1();
        break;
    case 101:
        destroyWindow("normal");

        getview2();
        break;
    case 102:
        destroyWindow("normal");

        getview3();
        break;
defalut:
        break;
    }
}

void MainWindow::getview1()
{
    //启动一个外部可执行程序
    /*
    QString cmd = QString("C:/WINDOWS/system32/calc.exe");
    m_process.start(cmd,QStringList()<<"");

    if(!m_process.waitForFinished(3000))
    {
        qDebug()<<"--------";
    }

    Sleep(200);
    */

//    if(imageLabel!=NULL)
//        {
//            ui->verticalLayout->removeWidget(imageLabel);
//        }
//    imageLabel = new QLabel(this);
    int i = 0;
    VideoCapture inputVideo(0);    //0为外部摄像头的ID,1为笔记本内置摄像头的ID

    namedWindow("normal");
    wid=(WId)FindWindow(L"Main HighGUI class",NULL);
    m_window = QWindow::fromWinId(wid);
    m_widget = QWidget::createWindowContainer(m_window);
    ui->mdiArea->addSubWindow(m_widget);
    m_widget->setMaximumSize(423,323);
    m_widget->showMaximized();

   while(1)
    {
        inputVideo >> srcImage;
        if(srcImage.empty() & i > 0) return;
        if(i > 0)
        {
              imshow("normal",srcImage);

//            QImage image2 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
//            imageLabel->setPixmap(QPixmap::fromImage(image2));
//            imageLabel->resize(361,291);
//            ui->verticalLayout->addWidget(imageLabel);

        }
        i ++;
        c=(char)waitKey(10);
        if (c==27)
        {
            c=0;
            break;
        }
    }
}

void MainWindow::getview2()
{
    Mat src;
//    if(imageLabel!=NULL)
//        {
//            ui->verticalLayout->removeWidget(imageLabel);
//        }
//    imageLabel = new QLabel(this);
    char c;
    int i = 0;
    VideoCapture inputVideo(0);    //0为外部摄像头的ID,1为笔记本内置摄像头的ID

    namedWindow("normal");
    wid=(WId)FindWindow(L"Main HighGUI class",NULL);
    m_window = QWindow::fromWinId(wid);
    m_widget = QWidget::createWindowContainer(m_window);
    ui->mdiArea->addSubWindow(m_widget);
    m_widget->setMaximumSize(423,323);
    m_widget->showMaximized();

    while(1)
    {
         inputVideo >>srcImage;
        if(srcImage.empty() & i > 0) return;
        if(i > 0)
        {
            cvtColor(srcImage,src, CV_BGR2GRAY);
            GaussianBlur(src, src, Size(7,7), 1.5, 1.5);
            Canny(src, src, 0, 20, 3);
            imshow("normal",src);
//            QImage image2= QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
//            imageLabel->setPixmap(QPixmap::fromImage(image2));
//            imageLabel->resize(361,291);
//            ui->verticalLayout->addWidget(imageLabel);
        }
        i ++;
        c=(char)waitKey(10);
        if (c==27)
        {
            c=0;
            break;
        }
    }
}

void MainWindow::getview3()
{

//    if(imageLabel!=NULL)
//    {
//        ui->verticalLayout->removeWidget(imageLabel);
//    }
//    imageLabel = new QLabel(this);

    Mat src;
    char d;
    int i = 0;
    VideoCapture inputVideo(0);    //0为外部摄像头的ID,1为笔记本内置摄像头的ID

    namedWindow("normal");
    wid=(WId)FindWindow(L"Main HighGUI class",NULL);
    m_window = QWindow::fromWinId(wid);
    m_widget = QWidget::createWindowContainer(m_window);
    ui->mdiArea->addSubWindow(m_widget);
    m_widget->setMaximumSize(423,323);
    m_widget->showMaximized();

    while(1)
    {
        inputVideo >> srcImage;
        if(srcImage.empty() & i > 0) return;
        if(i > 0)
        {
            cvtColor(srcImage,src, CV_BGR2GRAY);

            imshow("normal",src);
//            QImage image2 = QImage((uchar*)(srcImage.data), srcImage.cols, srcImage.rows, QImage::Format_RGB888);
//            imageLabel->setPixmap(QPixmap::fromImage(image2));
//            imageLabel->resize(361,291);
//            ui->verticalLayout->addWidget(imageLabel);
        }
        i ++;

        c=(char)waitKey(10);
        if (c==27)
        {
            c=0;
            break;
        }
    }
}

//正常显示
void MainWindow::on_btn_normal_clicked()
{
    emit mySignal(100);

}

//轮廓显示
void MainWindow::on_btn_border_clicked()
{
   emit mySignal(101);

}


//黑白显示
void MainWindow::on_btn_heibai_clicked()
{
    emit mySignal(102);
}


 

转载于:https://my.oschina.net/urlove/blog/857129

你可能感兴趣的:(QT+OPENCV摄像头的三种效果显示)