ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Qt5之OpenCV4的Canny处理

2021-02-10 23:31:47  阅读:253  来源: 互联网

标签:src Qt5 Mat int MainWindow ui OpenCV4 Canny cv


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));
}

运行结果:

多谢,亲爱的美美。

标签:src,Qt5,Mat,int,MainWindow,ui,OpenCV4,Canny,cv
来源: https://blog.csdn.net/islinyoubiao/article/details/113786741

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有