QT+opencv开发的图像处理通用开发平台,实现图像常规处理,自定义程序,图元窗口程序流程窗口独立显示,图像显示窗口的平移缩放显示,本次只代码

深夜两点半的显示器还亮着,手指在机械键盘上敲出最后一行qt代码。看着自己捣鼓了半个月的图形处理框架终于能跑通全流程,摸过手边的冰可乐猛灌一口——这玩意儿可比对象靠谱。

QT+opencv开发的图像处理通用开发平台,实现图像常规处理,自定义程序,图元窗口程序流程窗口独立显示,图像显示窗口的平移缩放显示,本次只代码

搞图像处理最烦的就是每次都要重复造轮子。这次直接用QT搭了个带插件系统的平台,主窗口左侧直接扔了个QMdiArea搞多文档界面。核心就三块:图像显示窗口、算法流程编辑器和图元属性面板,各自用QDockWidget挂着随时拖拽。

图像加载这活OpenCV熟门熟路,但转成QT图片得注意颜色通道:

cv::Mat src = cv::imread("test.jpg");
cv::cvtColor(src, src, cv::COLOR_BGR2RGB); // 通道转换
QImage img(src.data, src.cols, src.rows, QImage::Format_RGB888);
displayLabel->setPixmap(QPixmap::fromImage(img));

这里藏着个坑,OpenCV的BGR格式直接转QT会出鬼影,必须手动转RGB。显示控件用的QLabel,但想支持缩放得继承重写:

void ImageWidget::wheelEvent(QWheelEvent* event) {
    double delta = event->angleDelta().y() > 0 ? 1.1 : 0.9;
    scaleFactor *= delta;
    scaleFactor = qBound(0.1, scaleFactor, 10.0); // 限制缩放范围
    updateDisplay(); 
}

鼠标拖拽平移反而简单,记录上次坐标差就行。最爽的是实现了节点式编程界面,仿造Blender的节点编辑器,每个处理步骤变成可连接的图元:

class ProcessNode : public QGraphicsItem {
    // 节点主体、输入输出端口、连接线管理...
};

自定义算法通过插件机制挂载,搞了个动态加载.so的方案:

typedef IPlugin* (*CreatePluginFunc)();
QLibrary lib("edgeDetect.so");
CreatePluginFunc create = (CreatePluginFunc)lib.resolve("createPlugin");
if(create) {
    IPlugin* plugin = create();
    m_plugins.append(plugin);
}

现在测试高斯模糊插件时,能看到实时更新的处理结果。算法流程还能保存成XML,下次直接加载复用。凌晨四点的月光透过窗户,看着自己搭建的框架同时运行着灰度转换、Canny边缘检测和直方图均衡,突然觉得这半个月掉的头发值了——至少下次甲方说要加新算法时,不用从头再撸一遍界面了。

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐