基于 Qt5.14+OpenCV4.6.0 的通用化视觉软件,qt编译器直接运行, qt编译器直接运行 支持多相机多线程,每个工具都是单独的DLL,主程序通过 公用的接口访问以及加载各个工具。 算法工具包含图像处理、检测识别、标定工具、对位工具、几何工具、几何 测量、三维检测、逻辑工具、通讯工具和系统工具。 注意:不提供任何技术指导,自己学习源码,软件编译环境所需软件需要自己安装好
最近在搞一个基于 Qt5.14 和 OpenCV4.6.0 的通用化视觉软件,感觉挺有意思的,分享一下。这个软件的设计思路是模块化的,每个工具都是独立的 DLL,主程序通过统一的接口来加载和调用这些工具。这样做的好处是,扩展性很强,想加新功能直接写个新的 DLL 就行,不用动主程序。
先说说多相机多线程这块。多线程在视觉处理中几乎是标配,毕竟图像处理的计算量不小,单线程很容易卡死。Qt 的QThread用起来挺顺手,每个相机单独开一个线程,互不干扰。代码大概长这样:
class CameraThread : public QThread { Q_OBJECT public: void run() override { while (!isInterruptionRequested()) { // 抓取图像 cv::Mat frame = captureFrame(); emit frameCaptured(frame); } } signals: void frameCaptured(const cv::Mat &frame); private: cv::Mat captureFrame() { // 这里实现具体的抓图逻辑 } };每个相机对应一个CameraThread对象,抓到的图像通过信号frameCaptured发出去,主程序或者其他工具可以接收这个信号做进一步处理。
再说说工具模块化。每个工具都是一个独立的 DLL,主程序通过接口来调用。比如,图像处理工具可以这样定义接口:
class ImageProcessor { public: virtual ~ImageProcessor() = default; virtual cv::Mat process(const cv::Mat &input) = 0; };然后具体的图像处理工具实现这个接口:
class GaussianBlurProcessor : public ImageProcessor { public: cv::Mat process(const cv::Mat &input) override { cv::Mat output; cv::GaussianBlur(input, output, cv::Size(5, 5), 0); return output; } };主程序通过QLibrary动态加载这些 DLL,调用起来也很方便:
QLibrary library("GaussianBlurProcessor.dll"); if (library.load()) { auto createProcessor = reinterpret_cast<ImageProcessor*(*)()>(library.resolve("createProcessor")); if (createProcessor) { std::unique_ptr<ImageProcessor> processor(createProcessor()); cv::Mat result = processor->process(inputImage); } }这种设计让整个软件非常灵活,想加新功能直接写个新的 DLL,主程序几乎不用改。
至于算法工具,种类还挺多的,图像处理、检测识别、标定工具、对位工具、几何工具、几何测量、三维检测、逻辑工具、通讯工具和系统工具,基本涵盖了视觉处理的常见需求。每个工具的实现细节就不展开了,源码里都有,自己看吧。
最后提醒一下,这个软件的编译环境需要自己搞定,Qt5.14 和 OpenCV4.6.0 是必须的,其他依赖项也得自己装好。源码不提供技术指导,自己研究吧。