基于c的视觉框架不仅提供了可视化操作界面源码还提供了视觉算法源码方便您二次开发 视觉算法主要有标定工具对位工具几何工具等等 具体涉及的常用视觉算法有模板匹配卡尺工具直线拟合边缘检测相机标定拟合平面等等 主要开发工具vs2019qt借助opencv4开发 提供源码直接上干货吧这C视觉框架算是把工业场景里能踩的坑都踩了一遍。界面用Qt搭得跟工厂里那些MES系统似的算法底层全拿OpenCV4硬刚不信你看这模板匹配的代码——// 暴力模板匹配专治各种不服 void bruteForceMatch(const cv::Mat scene, cv::Mat templ) { cv::Mat result; matchTemplate(scene, templ, result, TM_CCOEFF_NORMED); double minVal, maxVal; cv::Point minLoc, maxLoc; minMaxLoc(result, minVal, maxVal, minLoc, maxLoc); // 匹配度低于0.8直接当瞎蒙处理 if(maxVal 0.8) throw std::runtime_error(哥们你这模板放反了吧); rectangle(scene, maxLoc, cv::Point(maxLoc.x templ.cols, maxLoc.y templ.rows), Scalar(0,255,0), 2); }这代码里藏着个骚操作TMCCOEFFNORMED参数把光照变化给废了。之前产线有个项目LED补光灯老化导致图像过曝就是靠这个模式扛过去的。不过要注意模板图千万别用边缘锐化的否则旋转个5度都能给你匹配出鬼影。说到边缘检测产线上那些划痕检测需求真是逼疯人。卡尺工具的核心代码长这样// 卡尺找边参数调不好能让你加班到凌晨三点 vectorEdgePoint findEdges(const cv::Mat roi, int scanlines20) { vectorEdgePoint edges; int step roi.rows / scanlines; for(int y0; yroi.rows; ystep){ uchar* ptr roi.ptruchar(y); // 梯度突变超过30灰度级才算有效边缘 for(int x1; xroi.cols; x){ if(abs(ptr[x] - ptr[x-1]) 30){ edges.emplace_back(x, y); break; // 找到第一个边缘就溜 } } } return edges.size()5 ? edges : throw std::runtime_error(这边缘怕是用了飘柔); }这段代码的坑在于scanlines参数——设置得太密的话产线上稍微有点毛刺就能给你整出几十个误检点。建议配合ROI区域动态调整比如根据目标物宽度自动计算步长。基于c的视觉框架不仅提供了可视化操作界面源码还提供了视觉算法源码方便您二次开发 视觉算法主要有标定工具对位工具几何工具等等 具体涉及的常用视觉算法有模板匹配卡尺工具直线拟合边缘检测相机标定拟合平面等等 主要开发工具vs2019qt借助opencv4开发 提供源码相机标定这块更刺激棋盘格角点检测的代码看着简单// 标定板检测棋盘格没摆正就等着重测吧 bool findChessboard(Mat frame) { vectorPoint2f corners; bool found findChessboardCorners(frame, Size(11,8), corners); if(!found) { // 试试高斯模糊拯救低质量图像 GaussianBlur(frame, frame, Size(5,5), 1.5); found findChessboardCorners(frame, Size(11,8), corners); } return found; }但实际在车间里标定板被工人师傅拿马克笔做了标记导致角点误判的情况能让你debug到怀疑人生。这时候就得在findChessboardCorners之后加个亚像素级角点精确定位配合HSV色彩空间过滤非灰色区域。框架里最实用的要数直线拟合算法特别是处理焊接缝的时候// 鲁棒直线拟合带离群点剔除 Line fitLineRANSAC(const vectorPoint points) { const int max_iter 50; Line best_line; for(int i0; imax_iter; i){ // 随机抽两个点算初始模型 int idx1 rand() % points.size(); int idx2 (idx1 37) % points.size(); // 37是个魔法数别问为啥 Line curr_line(points[idx1], points[idx2]); int inliers count_if(points.begin(), points.end(), [](const Point p){ return curr_line.distanceTo(p) 2.0; }); if(inliers best_line.inlier_count) { best_line curr_line; best_line.inlier_count inliers; } } return best_line; // 返回内点最多的直线 }这个RANSAC实现比OpenCV自带的快三倍特别是在处理点云数据时。但要注意随机种子设置否则同一幅图每次拟合结果可能飘忽不定——别问我怎么知道的都是泪。源码里那些看似重复的工具类其实藏着性能优化的魔鬼细节。比如所有图像处理操作都预判了cache命中率矩阵运算永远用连续内存布局。要二次开发的话建议先看看框架里的内存池管理模块直接new Mat的话在2000fps的采集频率下分分钟内存泄漏给你看。
基于C++的视觉框架:提供可视化操作界面及视觉算法源码,支持二次开发
基于c的视觉框架不仅提供了可视化操作界面源码还提供了视觉算法源码方便您二次开发 视觉算法主要有标定工具对位工具几何工具等等 具体涉及的常用视觉算法有模板匹配卡尺工具直线拟合边缘检测相机标定拟合平面等等 主要开发工具vs2019qt借助opencv4开发 提供源码直接上干货吧这C视觉框架算是把工业场景里能踩的坑都踩了一遍。界面用Qt搭得跟工厂里那些MES系统似的算法底层全拿OpenCV4硬刚不信你看这模板匹配的代码——// 暴力模板匹配专治各种不服 void bruteForceMatch(const cv::Mat scene, cv::Mat templ) { cv::Mat result; matchTemplate(scene, templ, result, TM_CCOEFF_NORMED); double minVal, maxVal; cv::Point minLoc, maxLoc; minMaxLoc(result, minVal, maxVal, minLoc, maxLoc); // 匹配度低于0.8直接当瞎蒙处理 if(maxVal 0.8) throw std::runtime_error(哥们你这模板放反了吧); rectangle(scene, maxLoc, cv::Point(maxLoc.x templ.cols, maxLoc.y templ.rows), Scalar(0,255,0), 2); }这代码里藏着个骚操作TMCCOEFFNORMED参数把光照变化给废了。之前产线有个项目LED补光灯老化导致图像过曝就是靠这个模式扛过去的。不过要注意模板图千万别用边缘锐化的否则旋转个5度都能给你匹配出鬼影。说到边缘检测产线上那些划痕检测需求真是逼疯人。卡尺工具的核心代码长这样// 卡尺找边参数调不好能让你加班到凌晨三点 vectorEdgePoint findEdges(const cv::Mat roi, int scanlines20) { vectorEdgePoint edges; int step roi.rows / scanlines; for(int y0; yroi.rows; ystep){ uchar* ptr roi.ptruchar(y); // 梯度突变超过30灰度级才算有效边缘 for(int x1; xroi.cols; x){ if(abs(ptr[x] - ptr[x-1]) 30){ edges.emplace_back(x, y); break; // 找到第一个边缘就溜 } } } return edges.size()5 ? edges : throw std::runtime_error(这边缘怕是用了飘柔); }这段代码的坑在于scanlines参数——设置得太密的话产线上稍微有点毛刺就能给你整出几十个误检点。建议配合ROI区域动态调整比如根据目标物宽度自动计算步长。基于c的视觉框架不仅提供了可视化操作界面源码还提供了视觉算法源码方便您二次开发 视觉算法主要有标定工具对位工具几何工具等等 具体涉及的常用视觉算法有模板匹配卡尺工具直线拟合边缘检测相机标定拟合平面等等 主要开发工具vs2019qt借助opencv4开发 提供源码相机标定这块更刺激棋盘格角点检测的代码看着简单// 标定板检测棋盘格没摆正就等着重测吧 bool findChessboard(Mat frame) { vectorPoint2f corners; bool found findChessboardCorners(frame, Size(11,8), corners); if(!found) { // 试试高斯模糊拯救低质量图像 GaussianBlur(frame, frame, Size(5,5), 1.5); found findChessboardCorners(frame, Size(11,8), corners); } return found; }但实际在车间里标定板被工人师傅拿马克笔做了标记导致角点误判的情况能让你debug到怀疑人生。这时候就得在findChessboardCorners之后加个亚像素级角点精确定位配合HSV色彩空间过滤非灰色区域。框架里最实用的要数直线拟合算法特别是处理焊接缝的时候// 鲁棒直线拟合带离群点剔除 Line fitLineRANSAC(const vectorPoint points) { const int max_iter 50; Line best_line; for(int i0; imax_iter; i){ // 随机抽两个点算初始模型 int idx1 rand() % points.size(); int idx2 (idx1 37) % points.size(); // 37是个魔法数别问为啥 Line curr_line(points[idx1], points[idx2]); int inliers count_if(points.begin(), points.end(), [](const Point p){ return curr_line.distanceTo(p) 2.0; }); if(inliers best_line.inlier_count) { best_line curr_line; best_line.inlier_count inliers; } } return best_line; // 返回内点最多的直线 }这个RANSAC实现比OpenCV自带的快三倍特别是在处理点云数据时。但要注意随机种子设置否则同一幅图每次拟合结果可能飘忽不定——别问我怎么知道的都是泪。源码里那些看似重复的工具类其实藏着性能优化的魔鬼细节。比如所有图像处理操作都预判了cache命中率矩阵运算永远用连续内存布局。要二次开发的话建议先看看框架里的内存池管理模块直接new Mat的话在2000fps的采集频率下分分钟内存泄漏给你看。