Qt5之OpenCV4的Canny处理

Canny 边缘检测算法 是 John F. Canny 于 1986年开发出来的一个多级边缘检测算法,也被很多人认为是边缘检测的 最优算法。

http://www.opencv.org.cn/opencvdoc/2.3.2/html/doc/tutorials/imgproc/imgtrans/canny_detector/canny_detector.html

最优边缘检测的三个主要评价标准是:

  • 低错误率: 标识出尽可能多的实际边缘,同时尽可能的减少噪声产生的误报。
  • 高定位性: 标识出的边缘要与图像中的实际边缘尽可能接近。
  • 最小响应: 图像中的边缘只能标识一次。

步骤

1)消除噪声。 使用高斯平滑滤波器卷积降噪。

2)计算梯度幅值和方向。

   2.1 运用一对卷积阵列 (分别作用于 x 和 y 方向)

   2.2 计算梯度幅值和方向

3) 非极大值 抑制。

4) 滞后阈值。

创建ui界面

添加代码

mainWindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>

#include "cv2qt.h"

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
    Q_OBJECT

public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    void cannyProc(cv::Mat in, int low);

private:
    Ui::MainWindow *ui;

    cv::Mat src;
    cv::Mat srcGray;
    cv::Mat dst;
    cv::Mat detected_edges;
//    int edgeThres = 1;
//    int lowThreshold;
//    int max_lowThreshold;
    int ratio = 3;
    int kernel_size = 3;

    CV2Qt cv2qt;
private slots:
    void on_horizontalSlider_valueChanged(int value);
};
#endif // MAINWINDOW_H

mainWindow.cpp

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

MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    src = cv::imread("D:/pic/lena.jpg");
    if(src.empty())
        return;
    dst.create(src.size(), src.type());

    ui->label->setPixmap(cv2qt.cvMatToQPixmap(src));
    cv::cvtColor(src, srcGray, cv::COLOR_BGR2GRAY);

    if(srcGray.empty())
        return;
    ui->horizontalSlider->setValue(20);
    cv::Mat tmp;
//    cv::threshold(srcGray, tmp, 120., 255., cv::THRESH_BINARY);
    qDebug() << "start canny func";
    cannyProc(srcGray, 20);
    ui->label_2->setPixmap(cv2qt.cvMatToQPixmap(dst));
}

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

void MainWindow::cannyProc(cv::Mat in, int low)
{
    if(in.empty())
        return;
    if(in.channels()>1)
        return;
//    lowThreshold = low;
    qDebug() << "start blur";
    cv::blur(in, detected_edges, cv::Size(3,3));
    qDebug() << "start canny";
    cv::Canny(detected_edges, detected_edges, low, low*ratio, kernel_size);
    dst= cv::Scalar::all(0);
    qDebug() << "start copy";
    src.copyTo(dst, detected_edges);
//    out = dst;
}

void MainWindow::on_horizontalSlider_valueChanged(int value)
{
    qDebug() << "value: " << value;
    if(srcGray.empty())
        return;
    cv::Mat tmp;
    cannyProc(srcGray, double(value));
    //cv::threshold(srcGray, tmp, double(value), 255., cv::THRESH_BINARY);
    ui->label_2->setPixmap(cv2qt.cvMatToQPixmap(dst));
}

运行结果:

多谢,亲爱的美美。

猜你喜欢

转载自blog.csdn.net/islinyoubiao/article/details/113786741
今日推荐