Files
RCiRoot e3f7733316 V20260829-2.6.1
完成框架目录和模块重构;新增核心、单例、工具、加密及框架 SDK;统一任务、相机和 RPC 接口,并增加离线检测、相机标定、备份恢复、版本管理、崩溃守护和心跳监控功能。
2026-09-20 16:01:09 +08:00

131 lines
5.3 KiB
C++
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#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);