您现在的位置是:首页 > 技术文章网站首页技术文章

[Qt+Vs]OpenCV图像灰度+二值化

  • WangYe
  • 2021-03-09 10:52:15
  • 620 次阅读
基于OpenCV的图像灰化和二值化黑白底实现;

效果:


环境:

    Qt5.15.2

    Windows10

    Vs2019

    OpenCV 2.4.13.6

    环境配置教程:OpenCV配置教程


源码区:

stdafx.h

#include <QtWidgets>
#pragma execution_character_set("utf-8")//display chinese words

#include <opencv2/opencv.hpp>
using namespace cv;

#pragma comment(lib, "x86/vc14/lib/opencv_calib3d2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_contrib2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_core2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_features2d2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_flann2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_gpu2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_highgui2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_imgproc2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_legacy2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_ml2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_nonfree2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_objdetect2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_ocl2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_photo2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_stitching2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_superres2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_ts2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_video2413d.lib")
#pragma comment(lib, "x86/vc14/lib/opencv_videostab2413d.lib")

OpenCVTest.h

#pragma once
#include "stdafx.h"
#include <QtWidgets/QWidget>

class OpenCVTest : public QWidget
{
    Q_OBJECT

public:
    OpenCVTest(QWidget *parent = Q_NULLPTR);

protected:
    void InitUI();  //初始化界面
protected slots:
    void slot_Load();   //载入图像
    void slot_Grayscale();  //选择灰度
    void slot_Black();  //二值图像(黑底)
    void slot_White();  //二值图像(白底)
private:
    QLabel* m_Imgshow;
    QPushButton* m_pLoad;
    QCheckBox* m_cGrayscale;
    QCheckBox* m_cBlack;
    QCheckBox* m_cWhite;

    int blocksize = 15;
    int delta = 9;
    int isGray = 0;
    Mat srcImg, grayImg;

    Mat temp;
    QImage Qtemp;
};

OpenCVTest.cpp

#include "OpenCVTest.h"

OpenCVTest::OpenCVTest(QWidget *parent)
    : QWidget(parent)
{
    InitUI();
}

void OpenCVTest::InitUI()
{
    setFixedSize(501, 569);

    /*显示图像*/
    m_Imgshow = new QLabel(this);
    //调色板设置背景//
    m_Imgshow->clear();
    QPalette palette;
    palette.setColor(QPalette::Background, QColor(0, 255, 0));
    m_Imgshow->setAutoFillBackground(true);  //一定要这句,否则不行
    m_Imgshow->setPalette(palette);
    //调色板设置背景 END// 
    m_Imgshow->setText("图像显示区");
    m_Imgshow->setAlignment(Qt::AlignCenter);
    m_Imgshow->setFixedSize(397, 408);
    m_Imgshow->move(this->x()+50,this->y()+30);

    /*载入图像*/
    m_pLoad = new QPushButton(this);
    m_pLoad->setText("载入图像");
    m_pLoad->move(m_Imgshow->x(), m_Imgshow->y()*16);
    QObject::connect(m_pLoad,SIGNAL(clicked()),this,SLOT(slot_Load()));

    /*显示灰度*/
    m_cGrayscale = new QCheckBox(this);
    m_cGrayscale->setText("灰度化");
    m_cGrayscale->move(m_pLoad->x()*7, m_Imgshow->y()*15);
    QObject::connect(m_cGrayscale, SIGNAL(stateChanged(int)), this, SLOT(slot_Grayscale()));

    /*二值图像(黑底)*/
    m_cBlack = new QCheckBox(this);
    m_cBlack->setText("二值图像(黑底)");
    m_cBlack->move(m_pLoad->x() * 7, m_Imgshow->y() * 16);
    QObject::connect(m_cBlack, SIGNAL(stateChanged(int)), this, SLOT(slot_Black()));

    /*二值图像(白底)*/
    m_cWhite = new QCheckBox(this);
    m_cWhite->setText("二值图像(白底)");
    m_cWhite->move(m_pLoad->x() * 7, m_Imgshow->y() * 17);
    QObject::connect(m_cWhite, SIGNAL(stateChanged(int)), this, SLOT(slot_White()));
}

void OpenCVTest::slot_Load()
{
    srcImg = imread("D:\\Download\\002.jpg");
    cvtColor(srcImg, grayImg, CV_BGR2GRAY);

    //Mat temp;
    //QImage Qtemp;
    if (isGray == 0)
    {
        cvtColor(srcImg, temp, CV_BGR2RGB);//BGR convert to RGB
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    }
    else if(isGray == 1)
    {
        cvtColor(grayImg, temp, CV_GRAY2RGB);//GRAY convert to RGB
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
    }
    else if (isGray == 2)
    {
        adaptiveThreshold(grayImg, temp, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, blocksize, -delta);
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_Grayscale8);
        m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    }
    else
    {
        adaptiveThreshold(grayImg, temp, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 9);
        /** @brief 自适应二值化
        *@param _src     要二值化的灰度图
        *@param _dst     二值化后的图
        *@param maxValue    二值化后要设置的那个值
        *@param method 块计算的方法(ADAPTIVE_THRESH_MEAN_C 平均值,ADAPTIVE_THRESH_GAUSSIAN_C 高斯分布加权和)
        *@param type     二值化类型(CV_THRESH_BINARY 大于为最大值,CV_THRESH_BINARY_INV 小于为最大值)
        *@param blockSize    块大小(奇数,大于1)
        *@param delta 差值(正值底色为白色)
        */
        QImage disImage = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, QImage::Format_Grayscale8);
        m_Imgshow->setPixmap(QPixmap::fromImage(disImage.scaled(m_Imgshow->width(), m_Imgshow->height(), Qt::KeepAspectRatio)));
    }
    m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    m_Imgshow->show();
}

void OpenCVTest::slot_Grayscale()
{
    if (m_cGrayscale->isChecked())
    {
        isGray = 1;

        cvtColor(grayImg, temp, CV_GRAY2RGB);//GRAY convert to RGB
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
        m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    }
    else
    {
        isGray = 0;

        cvtColor(srcImg, temp, CV_BGR2RGB);//BGR convert to RGB
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
        m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    }
}

void OpenCVTest::slot_Black()
{
    if(m_cBlack->isChecked())
    {
        isGray = 2;

        adaptiveThreshold(grayImg, temp, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, blocksize, -delta);
        /** @brief 自适应二值化
        *@param _src     要二值化的灰度图
        *@param _dst     二值化后的图
        *@param maxValue    二值化后要设置的那个值
        *@param method 块计算的方法(ADAPTIVE_THRESH_MEAN_C 平均值,ADAPTIVE_THRESH_GAUSSIAN_C 高斯分布加权和)
        *@param type     二值化类型(CV_THRESH_BINARY 大于为最大值,CV_THRESH_BINARY_INV 小于为最大值)
        *@param blockSize    块大小(奇数,大于1)
        *@param delta 差值(负值底色为黑色)
        */
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_Grayscale8);
        m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    }
    else
    {
        isGray = 0;

        cvtColor(srcImg, temp, CV_BGR2RGB);//BGR convert to RGB
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
        m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    }
}

void OpenCVTest::slot_White()
{
    if (m_cWhite->isChecked())
    {
        isGray = 3;

        adaptiveThreshold(grayImg, temp, 255, ADAPTIVE_THRESH_MEAN_C, THRESH_BINARY, 15, 9);
        /** @brief 自适应二值化
        *@param _src     要二值化的灰度图
        *@param _dst     二值化后的图
        *@param maxValue    二值化后要设置的那个值
        *@param method 块计算的方法(ADAPTIVE_THRESH_MEAN_C 平均值,ADAPTIVE_THRESH_GAUSSIAN_C 高斯分布加权和)
        *@param type     二值化类型(CV_THRESH_BINARY 大于为最大值,CV_THRESH_BINARY_INV 小于为最大值)
        *@param blockSize    块大小(奇数,大于1)
        *@param delta 差值(正值底色为白色)
        */
        QImage disImage = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, QImage::Format_Grayscale8);
        m_Imgshow->setPixmap(QPixmap::fromImage(disImage.scaled(m_Imgshow->width(), m_Imgshow->height(), Qt::KeepAspectRatio)));
    }
    else
    {
        isGray = 0;

        cvtColor(srcImg, temp, CV_BGR2RGB);//BGR convert to RGB
        Qtemp = QImage((const unsigned char*)(temp.data), temp.cols, temp.rows, temp.step, QImage::Format_RGB888);
        m_Imgshow->setPixmap(QPixmap::fromImage(Qtemp.scaled(m_Imgshow->size(), Qt::KeepAspectRatio)));
    }
}

main.cpp

#include "OpenCVTest.h"
#include "stdafx.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    OpenCVTest w;
    w.show();
    return a.exec();
}


TAG: Qt Vs OpenCV

文章评论 (0)



Top