QT+OpenCV实现一个标注工具(图像处理、边缘检测)

本文介绍了Qt初学者在指导下开发的一个图像标注工具,使用了Qt5.13.2和OpenCV4.1。文章详细阐述了开发环境配置、项目文件结构以及核心代码,包括图像的加载、保存、边缘检测(Canny和Sobel)、巴特沃斯高通滤波、log变换等图像处理功能,同时提供了鼠标交互操作的实现,如标注和取消标注等。

简介

作者是一名QT初学者,为检验学习成果及完成毕业设计,在张老师和学姐的指导下,开发了这个标注工具。CSDN上很多文章对我的学习提供了极大的帮助,分享这篇文章给需要的人一起学习进步~

废话不多说,先看看效果:

开发环境

Windows10、Qt5.13.2(编译器用的是MinGW64_bit)、OpenCV4.1

开发过程

环境配置

首先,安装Qt Creator,在Qt里引入OpenCV库,需要使用CMake对库进行编译,相关环境配置具体参考了这两篇文章:

win10下Qt5.12.3配置OpenCV4.5.3

opencv编译

编译过程需要注意版本问题,版本过高编译容易出错,一些常见的错误在参考文章结尾有提到。另外在编译过程中需要下载一些文件,最好挂个梯子,不然需要自己单独去下载。

项目文件结构

aboutdialog:点击帮助->关于弹出的对话框,用于简单介绍使用方法

mainwindow:程序主窗口,用于响应主窗口的点击事件及图像数据处理

mygraphicsview:显示图像的控件,用于处理用户与图像的交互事件

selectmergemapdialog:点击拆分合并->合并后弹出的对话框,用于选择需要合并的图像

Resources目前只存放了程序的图标

操作按键说明

按住鼠标右键拖动将轨迹上的点标注

按住shift键右键拖动把轨迹上的点取消标注

按住alt键右键拖曳把区域内的点取消标注

按住ctrl键右键拖曳把区域以外的点取消标注

双击左键图像复位

部分核心代码

mainwindow部分

在初始界面显示“把图片拖到此处打开”,涉及重叠控件的布局问题

//显示“把图片拖到此处打开”
QFont font("楷体",20,QFont::Bold);
welcome_label->setFont(font);
welcome_label->setText("把图片拖到此处打开");
welcome_label->setAlignment(Qt::AlignCenter);
welcome_label->setStyleSheet("color:gray;");
welcome_label->resize(260,30);
welcome_label->setGeometry(this->width()/2-welcome_label->width()/2,this->height()/2-welcome_label->height()/2,welcome_label->width(),welcome_label->height());
//将m_layout装进graphicsView,然后把welcome_label放进m_layout,设置居中对齐
m_layout = new QHBoxLayout(ui->graphicsView);
m_layout->addWidget(welcome_label);
m_layout->setAlignment(welcome_label, Qt::AlignCenter);

保存当前显示的图像,文件名设置为系统时间,如:20230323_113726.png

//设置保存路径
QString path=QCoreApplication::applicationDirPath();
path.append("/");
path.append(QDateTime::currentDateTime().toString("yyyyMMdd_hhmmss"));
path.append(".png");
//qDebug()<<path;
QString get_save_path=QFileDialog::getSaveFileName(this,"保存当前显示图像",path);

//执行保存
if(ui->graphicsView->getPixmap().save(get_save_path)){
    QMessageBox::information(this,"提示","保存成功");
}

点击边缘检测->canny,对目标图像进行canny边缘检测。程序中设置了四个图像缓存,分别用于存储原图、变换图、滤波图、边缘检测图,依次命名为origin_img,transform_img,filted_img,edge_img,在进行任何图像处理前需要选择目标图像。

//对图像进行边缘检测并将结果显示到graphicsView中
Mat src,t,dst;
//选择图像来源,优先次序为filted_img,transform_img,origin_img
if(!filted_img.isNull()){
    t=fromImage(filted_img);
    t.copyTo(src);
}
else if(!transform_img.isNull()){
    t=fromImage(transform_img);
    t.copyTo(src);
}
else{
    t=fromImage(origin_img);
    t.copyTo(src);
}
//将目标图像转换成8位单通道灰度图
if(src.type()!=CV_8UC1){
    src.convertTo(
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值