简介
作者是一名QT初学者,为检验学习成果及完成毕业设计,在张老师和学姐的指导下,开发了这个标注工具。CSDN上很多文章对我的学习提供了极大的帮助,分享这篇文章给需要的人一起学习进步~
废话不多说,先看看效果:
开发环境
Windows10、Qt5.13.2(编译器用的是MinGW64_bit)、OpenCV4.1
开发过程
环境配置
首先,安装Qt Creator,在Qt里引入OpenCV库,需要使用CMake对库进行编译,相关环境配置具体参考了这两篇文章:
编译过程需要注意版本问题,版本过高编译容易出错,一些常见的错误在参考文章结尾有提到。另外在编译过程中需要下载一些文件,最好挂个梯子,不然需要自己单独去下载。
项目文件结构
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(

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

被折叠的 条评论
为什么被折叠?



