Skip to content

shaoeric/Integrated_system_of_image_processing_and_annotation

Folders and files

NameName
Last commit message
Last commit date

Latest commit

 

History

7 Commits
 
 

Repository files navigation

图像处理与标注集成系统 Integrated system of image processing and annotation

由于github对于文件大小的限制而且仓库迁移经常失败,所以贴了gitee仓库链接。仓库gitee链接

项目需求

  • 实验室需要一个图像处理平台来对实验的图片做处理,并希望该平台可以将实验室前期的图像算法成果集成在内
  • 期望有图像标注系统

项目说明

  • 在CSDN上发现一个效果相对满足需求的图像处理软件,原作者为笔尖,原作的github链接,在此项目基础上做了大量的修改,在修改之前,也征得了原作者的同意。
  • 本项目使用C++ Qt5实现客户端服务。

界面示意图

主界面

标注界面

主要改进

  • 添加了通道直方图效果,可以根据显示的图片实时完成效果显示,并自动根据通道数量调整曲线数量。还可以手动点选legend来控制对应的曲线是否显示
  • 从json文件中读取并载入配置
  • 修改了原历史存储方案,设置一个历史存储器最大存储量
  • 添加了深度学习方法对图像处理的接口,通过C/S模式完成交互
  • 添加了图像级标签标注系统,可以通过快捷键方式快速完成标注图像类别

项目扩展的方法

由于原始项目代码结构很乱,也不方便修改。此处做个总结记录,方便他人快速上手。用“深度处理->目标检测->SSD模型”做例子

菜单项扩展
  • 首先要定义菜单项,即“SSD模型”项
QAction *Act_Detect_SSD = new QAction(tr("SSD模型"), this); // 菜单项
connect(Act_Detect_SSD, SIGNAL(triggered()), I_MainWindow, SLOT(deep_detect_ssd())); // 绑定点击菜单项的信号槽, deep_detect_ssd函数就是点击该项去执行的槽函数
  • 然后定义“目标检测”,这里定义该项为一级菜单
// 菜单项添加到一级菜单中
menu_deep_detect = new QMenu();  // 此处为头文件中定义的指针,用来添加最后一级的菜单项,比如“SSD模型”、“YOLO模型”等
QAction *Act_detects = new QAction(tr("目标检测"), this);
//action添加menu 当且仅当菜单项有子选项时,才需要setMenu
Act_detects->setMenu(menu_deep_detect);
// “目标检测”将一级菜单项“SSD模型”添加进来
menu_deep_detect->addAction(Act_Detect_SSD);
  • 最后将菜单项“深度处理”添加到菜单栏中
QMenu *deep = addMenu(tr("深度处理"));
deep->addAction(Act_detects);
深度处理接口扩展
  • 仍以ssd为例,在MainWindow.cpp文件中定义了deep_detect_ssd()方法,即上述中所指的槽函数
  • 首先实例化深度对象DeepProcess,该对象实现了客户端与服务器之间的交互,通过post方式将图片base64编码的json字符串数据包提交给服务器,服务器响应base64,客户端解析即可
DeepProcess *ssd;
ssd = new DeepProcess("ssd", "detect/ssd", this);// detect/ssd为服务器端的ssd方法的url
  • 然后获取当前图片有两种方法,一种是从历史记录中选取,historyClass->getCurrentImage(),另一种是直接选择label中显示的图片,imgLabel->getImage()。在设计的时候主要是遇到了问题,对图片的几何放缩特别消耗资源,所以让几何变换的结果不存入历史记录,如果有必要使其存储,可以点击“记录图像”按钮。后续对其扩展开发需要注意。
QImage current = imgLabel->getImage(); // 此处使用此方法获取当前图像
  • 最后要绑定深度方法返回的图像结果的信号槽,绑定后执行post方法进行交互
connect(ssd, SIGNAL(responseImage(QImage, QString)), this, SLOT(process_response(QImage, QString)));
ssd->post(current, "hello"); // "hello"是方法提供的额外参数,可以扩展为 向服务器发送的客户机id、密钥等信息,供服务器验证
深度处理的服务器接口说明
  • 使用的python3的flask框架搭建服务器,主要是使用两个文件app.py和utils.py
  • utils.py主要做了图像编解码的工作
import cv2
import base64
import numpy as np

def cv2_base64(image):
    base64_str = cv2.imencode('.jpg', image)[1].tostring()
    base64_str = base64.b64encode(base64_str)
    return str(base64_str).lstrip("b'")


##base64转cv2
def base64_cv2(base64_str):
    imgString = base64.b64decode(base64_str)
    nparr = np.fromstring(imgString, np.uint8)
    image = cv2.imdecode(nparr, cv2.IMREAD_COLOR)
    return image
  • app.py 就是服务器的入口,需要定义深度模型的接口,下面对ssd模型举例
from flask import Flask, jsonify, request
import utils
import cv2

app = Flask(__name__)
@app.route("/detect/ssd", methods=['POST'])
def ssd():
    data = request.json
    img = data['image'] # 获取post过来的图像和msg信息
    msg = data['msg']
    
    try:
        # 将图像转化
        image = utils.base64_cv2(img)
        # 模型处理
        image = ssd(image)    # 返回的应该是cv2 ndarrray的图像
        # 将结果返回
        return jsonify({"image": utils.cv2_base64(image), "msg": "OK", "code": 200})
    except Exception as e:
        print(e)
        return jsonify({"code": 500, "msg": str(e)})

if __name__ == '__main__':
    app.run(debug=True)

标注系统的相关说明

  • 相关的组件都是在ui文件中进行绘制
  • 相关的快捷键在菜单栏帮助-快捷键说明中可以查找
  • 设置了一个标注缓存的存储区可存储的最大数,存储区满就会将存储的标注写入文件,避免对文件频繁写入
  • 标注系统的主题与主界面的主题保持一致
  • 可以动态的在类别表格中添加行数
  • 类别可多选

todo

  • 继续丰富深度处理的接口,使其功能更加完善
  • 标注系统的标注最大存储数应从配置文件中读取,并能修改
  • 可以进一步集成视频处理及标注系统
  • 资源使用方面需进一步优化,可从对ImageProcessing类的简化工作开始

About

Qt&opencv实现的图像处理集成工具

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

No packages published