#pragma once #include #include #include #include #if defined(EUI_HANDLE_AI_2256) #include #else #include #endif #if defined(HD_NO_NAMESPACE) #define EUI_HANDLE_AI_NAMESPACE #else #define EUI_HANDLE_AI_NAMESPACE handdleAI:: #endif #include #include #include #include #include using namespace HalconCpp; struct MatchResult { cv::Rect boundingRect; double confidence = 0.0; }; // 简单的图像相关算法 //融合两张图片白色区域 EUI_TOOLS_API cv::Mat mergeBinaryMats(const cv::Mat& mat1, const cv::Mat& mat2); //Rect相加 EUI_TOOLS_API cv::Rect rectPlusRect(cv::Rect world, cv::Rect rect); EUI_TOOLS_API cv::Rect findMaxAreaContour(const cv::Mat& src); EUI_TOOLS_API cv::Rect findMaxAreaContour(const cv::Mat& src, int& indexReturn); EUI_TOOLS_API cv::Mat cutImg2Cls(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128)); // overlapPercent:分段裁切时相邻两块的重合比例(百分比,相对于切块边长),默认20(即20%) EUI_TOOLS_API std::vector cutImg2ClsVec(cv::Rect boundingBox, cv::Mat imgInput, cv::Size targetSize = cv::Size(128, 128), double overlapPercent = 20); EUI_TOOLS_API cv::Mat HObject2Mat(HObject& Hobj); // HObject 类型转 Mat 类型 enum MatsToHObjectEnum { horizontal, vertical }; //获取两点之间的直线距离 EUI_TOOLS_API double getDistance(cv::Point pointO, cv::Point pointA); //获取点到线段之间的直线距离 EUI_TOOLS_API double pointToLineDistance(const cv::Point& point, const cv::Point& lineStart, const cv::Point& lineEnd); //计算角度,pt2为顶点 EUI_TOOLS_API double calculateAngle(cv::Point pt1, cv::Point pt2, cv::Point pt3); //计算角度偏移量,pt1,pt2为第一条线段,pt3,pt4为第二条线段 EUI_TOOLS_API double calculateAngleOffset(cv::Point pt11, cv::Point pt12, cv::Point pt21, cv::Point pt22); //通过角度计算圆上点的位置 EUI_TOOLS_API cv::Point calculatePointOnCircle(cv::Point center, double radius, double angleDegrees); /// /// 模板匹配,以MatchResult返回 /// /// 图像 /// 模板图像 /// EUI_TOOLS_API MatchResult templateMatching(const cv::Mat& originalImage, const cv::Mat& templateImage); /// /// 模板匹配,返回Rect以及分数 /// /// 模板图像 /// 匹配图像 /// 分数 /// EUI_TOOLS_API cv::Rect doMatchTemplate(const cv::Mat& templateImg, const cv::Mat& srcImg, double* sorce); //计算contour是否重叠 EUI_TOOLS_API bool isContoursOverlap(const std::vector& contour1, const std::vector& contour2, double thresholdPercent = 0); //计算rect是否重叠 EUI_TOOLS_API bool isRectOverlap(const cv::Rect& rect1, const cv::Rect& rect2, double thresholdPercent = 0); //将两个contour的区域合并 EUI_TOOLS_API std::vector contourPlusContour(const std::vector& contour1, const std::vector& contour2); EUI_TOOLS_API cv::Rect BboxToRect(EUI_HANDLE_AI_NAMESPACE Bbox input); enum ngTypeEnum { OK, huaHeng, aoKeng, zangWu }; struct rectAndData { cv::Rect rect; double defectHeight = 0.0; double defectWidth = 0.0; int badType = 0; bool result = false; ngTypeEnum ngType = OK; std::vector contour; rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, bool resultInput); rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput); rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector& contourInput); rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector& contourInput, ngTypeEnum inputNgType); }; ; //平铺图像 EUI_TOOLS_API cv::Mat tiledImages(const std::vector& imgs); /** * 快速去噪函数 * * 说明: * - 优先使用均值滤波(box filter)实现快速平滑; * - 对明显的椒盐噪声可开启中值滤波(按通道处理,适用于8U/16U); * - 指定较大核或需要可控平滑强度时,使用高斯滤波作为兜底。 * * 参数: * - inputMat 输入图像(支持单通道/多通道); * - outputMat 输出图像; * - kernelSize 卷积核大小,必须为奇数且>=3(传偶数会自动+1); * - sigma 高斯滤波标准差,<=0 表示走OpenCV自动推导; * - useMedian 是否启用中值滤波(更抗椒盐噪声,速度较均值略慢)。 */ EUI_TOOLS_API void denoiseImage(const cv::Mat& inputMat, cv::Mat& outputMat, int kernelSize = 3, double sigma = 0.0, bool useMedian = false); // 字符编码转换:GBK 编码的 std::string 转为 UTF-8 编码的 std::string(基于 Qt 5.14.x) // 入参:gbkStr - GBK/GB2312/GB18030 字节序列(std::string 仅作为原始字节容器) // 返回:UTF-8 编码的字节序列(std::string) EUI_TOOLS_API std::string gbkToUtf8(const std::string& gbkStr); EUI_TOOLS_API cv::Rect getMatRect(const cv::Mat& mat);