qt opencv 边缘检测

作者:fly 发布于:2016-8-8 15:44 分类:Linux

www.forwhat.cn

2016-08-08 15:46:59的屏幕截图.png

头文件


#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include <QTimer>
#include <QPixmap>
#include <cv.h>
#include <highgui.h>

namespace Ui {
class MainWindow;
}

class MainWindow : public QMainWindow
{
    Q_OBJECT
    
public:
    explicit MainWindow(QWidget *parent = 0);
    ~MainWindow();

private:
    Ui::MainWindow *ui;
    CvCapture *capture; //highgui 里提供的一个专门处理摄像头图像的结构体
    IplImage *frame; //摄像头每次抓取的图像为一帧,使用该指针指向一帧图像的内存空间
    QTimer *timer; //定时器用于定时取帧,上面说的隔一段时间就去取就是用这个实现。

    IplImage *laplace;
    IplImage *color_laplace;
    IplImage *planes[3];

private slots:
    void getFrame(); //实现定时从摄像头取图并显示在label上的功能。
};

#endif // MAINWINDOW_H
源文件



#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    timer = new QTimer(this);
    capture = cvCaptureFromCAM(0); //cvCaptureFromCAM其实是一个宏,就是cvCreateCameraCapture的别名,0代表第一个摄像头。-1代表默认摄像头。
    if(capture==NULL)
    {
        return;
    }
    timer->start(50); //1000为1秒,50毫秒去取一帧
    connect(timer,SIGNAL(timeout()),this,SLOT(getFrame())); //超时就去取
}
void MainWindow::getFrame()
{
    frame = cvQueryFrame(capture); //从摄像头取帧
    if(frame)
    {
        for(int i=0;i<3;i++)
        {
            planes[i]=cvCreateImage(CvSize(frame->width,frame->height),8,1);
        }
        laplace=cvCreateImage(CvSize(frame->width,frame->height),IPL_DEPTH_16S,1);
        color_laplace=cvCreateImage(CvSize(frame->width,frame->height),8,3);
        cvSplit(frame,planes[0],planes[1],planes[2],0);
        for(int i=0;i<3;i++)
        {
            cvLaplace(planes[i],laplace,3);
            cvConvertScaleAbs(laplace,planes[i],1,0);
        }
        cvMerge(planes[0],planes[1],planes[2],0,color_laplace);
        QImage image = QImage((const uchar*)frame->imageData, frame->width, frame->height, QImage::Format_RGB888).rgbSwapped(); //简单地转换一下为Image对象,rgbSwapped是为了显示效果色彩好一些。
        ui->label->setPixmap(QPixmap::fromImage(image));
        QImage image2 = QImage((const uchar*)color_laplace->imageData, color_laplace->width, color_laplace->height, QImage::Format_RGB888).rgbSwapped(); //简单地转换一下为Image对象,rgbSwapped是为了显示效果色彩好一些。
        ui->label_2->setPixmap(QPixmap::fromImage(image2));

        cvReleaseImage(&planes[0]);
        cvReleaseImage(&planes[1]);
        cvReleaseImage(&planes[2]);
        cvReleaseImage(&laplace);
        cvReleaseImage(&color_laplace);
    }

}
MainWindow::~MainWindow()
{
    timer->stop(); //停止取帧
    cvReleaseCapture(&capture); //释放资源是个好习惯
    delete ui;
}


发表评论:

 
Powered by emlog sitemap