资源简介
开发环境为QT5.8+opencv3.2,主要实现了边缘检测,轮廓提取及轮廓跟踪,边缘检测使用了Canny算子、Sobel算子、Laplacian算子,轮廓跟踪使用八邻域法。
代码片段和文件信息
#include “dialog.h“
#include “ui_dialog.h“
#include
#include
Dialog::Dialog(QWidget *parent) :
QDialog(parent)
ui(new Ui::Dialog)
{
ui->setupUi(this);
}
Dialog::~Dialog()
{
delete ui;
}
/*----------------------------
* 功能 : 响应用户点击打开图片按钮事件
*----------------------------
* 函数 : on_openImgBtn_clicked
* 访问 : private
* 返回 : void
*
*/
void Dialog::on_openImgBtn_clicked()
{
//打开原始灰度图
fileName = QFileDialog::getOpenFileName(this“Open Image““.““Image File(*.png *.jpg *.jpeg *.bmp)“);
grayImg = imread(fileName.toLatin1().data()IMREAD_GRAYSCALE);
if(grayImg.empty())
return;
//在QLabel中显示图像
QPixmap *pixmap = new QPixmap(fileName);
pixmap->scaled(ui->oriImgLabel->size() Qt::KeepAspectRatio);
ui->oriImgLabel->setScaledContents(true);
ui->oriImgLabel->setPixmap(*pixmap);
}
/*----------------------------
* 功能 : 响应用户点击边缘检测按钮事件
*----------------------------
* 函数 : on_edgeImgBtn_clicked
* 访问 : private
* 返回 : void
*
*/
void Dialog::on_edgeImgBtn_clicked()
{
uchar index = ui->edgeComBox->currentIndex();//获取选择的算子的标号
Mat edgeImg;
switch (index) {
case 0:
{
//Canny边缘检测
Canny(grayImg edgeImg 30 80);
break;
}
case 1:
{
//Sobel边缘检测
Mat x_edgeImg y_edgeImg;
Mat abs_x_edgeImg abs_y_edgeImg;
/*****先对x方向进行边缘检测********/
//因为Sobel求出来的结果有正负,8位无符号表示不全,故用16位有符号表示
Sobel(grayImgx_edgeImg CV_16S 1 0 3 1 1 BORDER_DEFAULT);
convertScaleAbs(x_edgeImg abs_x_edgeImg);//将16位有符号转化为8位无符号
/*****再对y方向进行边缘检测********/
Sobel(grayImg y_edgeImg CV_16S 0 1 3 1 1 BORDER_DEFAULT);
convertScaleAbs(y_edgeImg abs_y_edgeImg);
addWeighted(abs_x_edgeImg 0.5 abs_y_edgeImg 0.5 0 edgeImg);
break;
}
case 2:
{
//Laplacian边缘检测
Mat lapImg;
Laplacian(grayImg lapImg CV_16S 5 1 0 BORDER_DEFAULT);
convertScaleAbs(lapImg edgeImg);
break;
}
default:
{
break;
}
}
imwrite(“edge.bmp“edgeImg);
//在QLabel中显示图像
QPixmap *pixmap = new QPixmap(“edge.bmp“);
pixmap->scaled(ui->edgeImgLabel->size() Qt::KeepAspectRatio);
ui->edgeImgLabel->setScaledContents(true);
ui->edgeImgLabel->setPixmap(*pixmap);
}
/*----------------------------
* 功能 : 响应用户点击轮廓提取按钮事件
*----------------------------
* 函数 : on_conImgBtn_clicked
* 访问 : private
* 返回 : void
*
*/
void Dialog::on_conImgBtn_clicked()
{
Mat contImg = Mat ::zeros(grayImg.size()CV_8UC3);//定义三通道轮廓提取图像
Mat binImg;
threshold(grayImg binImg 127 255 THRESH_OTSU);//大津法进行图像二值化
vector> contours;
vector hierarchy;
//
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 8766 2018-05-29 20:02 edgeDetection\edgeDetection\dialog.cpp
文件 705 2018-05-29 19:50 edgeDetection\edgeDetection\dialog.h
文件 4934 2018-05-29 19:43 edgeDetection\edgeDetection\dialog.ui
文件 1604 2018-05-29 11:03 edgeDetection\edgeDetection\edgeDetection.pro
文件 24077 2018-05-29 20:02 edgeDetection\edgeDetection\edgeDetection.pro.user
文件 251078 2018-05-19 16:08 edgeDetection\edgeDetection\gray.bmp
文件 175 2018-05-29 10:42 edgeDetection\edgeDetection\main.cpp
目录 0 2018-05-29 20:03 edgeDetection\build-edgeDetection-Desktop_Qt_5_8_0_MSVC2015_64bit-Debug
目录 0 2018-05-29 20:03 edgeDetection\edgeDetection
目录 0 2018-05-29 19:14 edgeDetection
----------- --------- ---------- ----- ----
291339 10
评论
共有 条评论