QT与OpenCV融合的图像处理通用平台:图元流程显示,自定义程序,支持图像处理功能,平移缩放...
凌晨四点的月光透过窗户,看着自己搭建的框架同时运行着灰度转换、Canny边缘检测和直方图均衡,突然觉得这半个月掉的头发值了——至少下次甲方说要加新算法时,不用从头再撸一遍界面了。搞图像处理最烦的就是每次都要重复造轮子。QT+opencv开发的图像处理通用开发平台,实现图像常规处理,自定义程序,图元窗口程序流程窗口独立显示,图像显示窗口的平移缩放显示,本次只代码。QT+opencv开发的图像处理通用
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边缘检测和直方图均衡,突然觉得这半个月掉的头发值了——至少下次甲方说要加新算法时,不用从头再撸一遍界面了。
更多推荐
所有评论(0)