完成框架目录和模块重构;新增核心、单例、工具、加密及框架 SDK;统一任务、相机和 RPC 接口,并增加离线检测、相机标定、备份恢复、版本管理、崩溃守护和心跳监控功能。
131 lines
5.3 KiB
C++
131 lines
5.3 KiB
C++
#pragma once
|
||
|
||
#include <HalconCpp.h>
|
||
#include <opencv.hpp>
|
||
#include <ios>
|
||
#include <algorithm>
|
||
#if defined(EUI_HANDLE_AI_2256)
|
||
#include <handleA2256I.h>
|
||
#else
|
||
#include <handleAI.h>
|
||
#endif
|
||
#if defined(HD_NO_NAMESPACE)
|
||
#define EUI_HANDLE_AI_NAMESPACE
|
||
#else
|
||
#define EUI_HANDLE_AI_NAMESPACE handdleAI::
|
||
#endif
|
||
#include <QString>
|
||
#include <QByteArray>
|
||
#include <chrono>
|
||
#include <QTextCodec>
|
||
#include <eui_tools/export.h>
|
||
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<cv::Mat> 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);
|
||
/// <summary>
|
||
/// 模板匹配,以MatchResult返回
|
||
/// </summary>
|
||
/// <param name="originalImage">图像</param>
|
||
/// <param name="templateImage">模板图像</param>
|
||
/// <returns></returns>
|
||
EUI_TOOLS_API MatchResult templateMatching(const cv::Mat& originalImage, const cv::Mat& templateImage);
|
||
/// <summary>
|
||
/// 模板匹配,返回Rect以及分数
|
||
/// </summary>
|
||
/// <param name="templateImg">模板图像</param>
|
||
/// <param name="srcImg">匹配图像</param>
|
||
/// <param name="sorce">分数</param>
|
||
/// <returns></returns>
|
||
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<cv::Point>& contour1, const std::vector<cv::Point>& 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<cv::Point> contourPlusContour(const std::vector<cv::Point>& contour1, const std::vector<cv::Point>& 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<cv::Point> 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<cv::Point>& contourInput);
|
||
rectAndData(cv::Rect rectInput, double defectHeightInput, double defectWidthInput, int n, bool resultInput, std::vector<cv::Point>& contourInput, ngTypeEnum inputNgType);
|
||
};
|
||
;
|
||
//平铺图像
|
||
EUI_TOOLS_API cv::Mat tiledImages(const std::vector<cv::Mat>& 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);
|