基于Qt与OpenCV的图片读取、保存,并利用Canny进行简单的边缘处理结果显示

第一次写CSDN博客,最近在做毕业设计,有空之余写了一个图片读存和简单OpenCV的边缘处理。最终实现了图片的读取,边缘检测,保存的功能。


本次采用Qt5.7(安装包名称为qt-opensource-windows-x86-mingw530-5.7.1.exe)与OpenCV3.1版本。两者环境的配置就不多说了。

一、界面设计


首先建立一个新工程mainWidget继承于QWidget类如图,在ui文件中建立如图所示的界面。



编译运行之后界面如下图,其实很简陋啦。


二、打开、显示图片
点击openBtn按钮,触发槽。代码如下:
void mainWidget::on_openBtn_clicked()
{
    QString fileName = QFileDialog::getOpenFileName(
                    this, "打开图片",
                    ".",
                    "图片 (*.bmp *.jpg *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;所有文件(*.*)");
    if(fileName != "")
    {
        if(image->load(fileName))
        {
            QGraphicsScene *scene = new QGraphicsScene;
            scene->addPixmap(QPixmap::fromImage(*image));
            ui->formerView->setScene(scene);
            ui->formerView->resize(image->width() + 10, image->height() + 10);
            ui->formerView->show();
        }
        else
        {
            QMessageBox::information(this,
                            tr("打开图像失败"),
                            tr("打开图像失败!"));
            delete image; return;
        }
    }
}
三、OpenCV的简单实现、处理
此段代码摘自毛星云的《OpenCV3编程入门》,只是简单的利用了一下Canny算子进行边缘检测。

Mat mainWidget ::Canny_check()
{
    //载入原始图
        cv::Mat srcImage;
        srcImage = QImage2Mat(*image);
        //----------------------------------------------------------------------------------
        //	高阶的canny用法,转成灰度图,降噪,用canny,最后将得到的边缘作为掩码,拷贝原图到效果图上,得到彩色的边缘图
        //----------------------------------------------------------------------------------
        Mat dstImage,edge,grayImage;
        // 【1】创建与src同类型和大小的矩阵(dst)
        dstImage.create( srcImage.size(), srcImage.type() );
        // 【2】将原图像转换为灰度图像
        cvtColor( srcImage, grayImage, COLOR_BGR2GRAY );
        // 【3】先用使用 3x3内核来降噪
        blur( grayImage, edge, Size(3,3) );
        // 【4】运行Canny算子
        Canny( edge, edge, 3, 9,3 );
        //【5】将g_dstImage内的所有元素设置为0
        dstImage = Scalar::all(0);
        //【6】使用Canny算子输出的边缘图g_cannyDetectedEdges作为掩码,来将原图g_srcImage拷到目标图g_dstImage中
        srcImage.copyTo( dstImage, edge);
        return dstImage;
}
处理槽(边缘检测按钮)如下:
void mainWidget::on_disposeBtn_clicked()
{
    Mat resultmat = Canny_check();//resultmat完整!
    resultimage = Mat2QImage(resultmat);//将mat格式转换为Qimage格式
//    ui->label->setPixmap(QPixmap::fromImage(resultimage));//将结果在label上显示
    QGraphicsScene *scene = new QGraphicsScene;
    scene->addPixmap(QPixmap::fromImage(resultimage));
    ui->resultView->setScene(scene);
    ui->resultView->resize(resultimage.width()+10, resultimage.height()+10);
    ui->resultView->show();
}
其中,QImage2Mat函数和Mat2QImage函数这样的格式转化函数都需要自己编写。
四、保存处理后的图片
代码如下:
void mainWidget::on_saveBtn_clicked()
{
    QString fileName = QFileDialog::getSaveFileName(
                    this, "保存图片",
                    ".",
                    "图片 (*.jpg *.bmp *.pbm *.pgm *.png *.ppm *.xbm *.xpm);;所有文件(*.*)");
    if(!fileName.isEmpty())
    {
        saveFile(fileName);
    }
    else
    {
        return;
    }
}
bool mainWidget::saveFile(const QString &filename)
{
    QFile file(filename);
    if (!file.open(QIODevice::ReadWrite))
    {
        QMessageBox::warning(this,tr("保存文件"),tr("无法保存文件 %1:\n%2").arg(filename).arg(file.errorString()));
        return false;
    }
    QByteArray ba;
    QBuffer buffer(&ba);
    buffer.open(QIODevice::WriteOnly);
    resultimage.save(&buffer, "JPG");
    file.write(ba);
    QMessageBox::information(this,tr("保存文件"),tr("文件已保存至:\n%1").arg(filename));
    return true;
}
五、最终结果

六、需要改进的地方
本工程界面设计的graphicsView控件的布局不能灵活随着图片而变化。

源码在这里:http://download.csdn.net/detail/weixin_38334320/9815047

猜你喜欢

转载自blog.csdn.net/weixin_38334320/article/details/70184272