|
|
|
|
|
#ifndef ARITH_UTILS_H
|
|
|
|
|
|
#define ARITH_UTILS_H
|
|
|
|
|
|
|
|
|
|
|
|
#pragma once
|
|
|
|
|
|
#include "Arith_SysStruct.h"
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 使用哈希表来记录每个非零数字的出现次数
|
|
|
|
|
|
typedef struct tagHashEntry
|
|
|
|
|
|
{
|
|
|
|
|
|
int key;
|
|
|
|
|
|
int count;
|
|
|
|
|
|
} HashEntry;
|
|
|
|
|
|
|
|
|
|
|
|
typedef struct tagHashMap
|
|
|
|
|
|
{
|
|
|
|
|
|
HashEntry* entries;
|
|
|
|
|
|
int capacity;
|
|
|
|
|
|
int size;
|
|
|
|
|
|
} HashMap;
|
|
|
|
|
|
|
|
|
|
|
|
// 矩阵加法
|
|
|
|
|
|
void AddMat(double* A, double* B, int mn, double* AaddB);
|
|
|
|
|
|
|
|
|
|
|
|
// 矩阵乘法
|
|
|
|
|
|
void MultiMat(double* A, double* B, double* AB, int m, int n, int p);
|
|
|
|
|
|
|
|
|
|
|
|
// M1(3*3) * M2(3*3)
|
|
|
|
|
|
void MultiMat33(double* A, double* B, double* AB);
|
|
|
|
|
|
|
|
|
|
|
|
// M1(3*3) * M2(3*3) * M3(3*3)
|
|
|
|
|
|
void MultiMat333(double* A, double* B, double* C, double* ABC);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 标量乘以矩阵
|
|
|
|
|
|
void MultiMatScalar(double scalar, double* A, double* sA, int mn);
|
|
|
|
|
|
|
|
|
|
|
|
// 矩阵转置
|
|
|
|
|
|
void TransposeMat(double* A, int m, int n, double* AT);
|
|
|
|
|
|
|
|
|
|
|
|
// 3阶矩阵逆,不判断逆是否存在
|
|
|
|
|
|
void invMat3(double* A, double* invA);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
// 获得三阶单位阵
|
|
|
|
|
|
void eye3(double* M);
|
|
|
|
|
|
|
|
|
|
|
|
// 绕X轴旋转矩阵
|
|
|
|
|
|
void Rx(double omega, double* Opp);
|
|
|
|
|
|
|
|
|
|
|
|
// 绕Y轴旋转矩阵
|
|
|
|
|
|
void Ry(double omega, double* Opp);
|
|
|
|
|
|
|
|
|
|
|
|
// 绕Z轴旋转矩阵
|
|
|
|
|
|
void Rz(double omega, double* Opp);
|
|
|
|
|
|
|
|
|
|
|
|
// 镜面反射矩阵
|
|
|
|
|
|
void RMirror(PointXYZ normalVec, double* Opp);
|
|
|
|
|
|
|
|
|
|
|
|
// 坐标(矢量)旋转: M1(3*3) * M2(3,1)
|
|
|
|
|
|
PointXYZ RtPoint(double* M, PointXYZ Point);
|
|
|
|
|
|
|
|
|
|
|
|
// 坐标(矢量)归一化
|
|
|
|
|
|
PointXYZ NormPoint(PointXYZ Point);
|
|
|
|
|
|
|
|
|
|
|
|
// 罗得里格公式
|
|
|
|
|
|
void rotationVectorToMatrix(PointXYZ rotaVec_One, float rotaAgl, double* Mat);
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************
|
|
|
|
|
|
* Method: findMostFrequentNonZero()
|
|
|
|
|
|
* Function Description:
|
|
|
|
|
|
* CreateData: 2025/1/8
|
|
|
|
|
|
* Input Param: int arr[]:输入数组
|
|
|
|
|
|
* Input Param: int size:数组长度
|
|
|
|
|
|
* Input Param: int clsMaxNum:频率最高的类别出现的次数
|
|
|
|
|
|
* Input Param: float * MostFrequentratio:频率最高的类别出现的频率
|
|
|
|
|
|
* Output Param:
|
|
|
|
|
|
* Return: int:出现次数最多的目标类别
|
|
|
|
|
|
* Call Relation:
|
|
|
|
|
|
* Other Description:
|
|
|
|
|
|
*************************************/
|
|
|
|
|
|
int findMostFrequentNonZero(int arr[], int size, int *clsMaxNum, float* MostFrequentratio);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************
|
|
|
|
|
|
* Method: count2To0Transitions()
|
|
|
|
|
|
* Function Description: 统计序列2变成1的次数
|
|
|
|
|
|
* CreateData: 2025/1/8
|
|
|
|
|
|
* Input Param: int arr[]
|
|
|
|
|
|
* Input Param: int size
|
|
|
|
|
|
* Output Param:
|
|
|
|
|
|
* Return: int
|
|
|
|
|
|
* Call Relation:
|
|
|
|
|
|
* Other Description:
|
|
|
|
|
|
*************************************/
|
|
|
|
|
|
int count2To0Transitions(int arr[], int size);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************
|
|
|
|
|
|
* Method: checkCondition()
|
|
|
|
|
|
* Function Description: 一维数组当中,判断相邻数字2变成1,1连续出现的次数大于frmThresh是否存在
|
|
|
|
|
|
* CreateData: 2025/1/8
|
|
|
|
|
|
* Input Param: int arr[]
|
|
|
|
|
|
* Input Param: int size
|
|
|
|
|
|
* Input Param: int frmThresh
|
|
|
|
|
|
* Output Param:
|
|
|
|
|
|
* Return: bool
|
|
|
|
|
|
* Call Relation:
|
|
|
|
|
|
* Other Description:
|
|
|
|
|
|
*************************************/
|
|
|
|
|
|
bool checkXToYCondition(int arr[], int size, int x, int y, int frmThresh);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************
|
|
|
|
|
|
* Method: countNumberFreq()
|
|
|
|
|
|
* Function Description: 统计一维数组当中number出现的次数
|
|
|
|
|
|
* CreateData: 2025/1/8
|
|
|
|
|
|
* Input Param: int arr[]
|
|
|
|
|
|
* Input Param: int size
|
|
|
|
|
|
* Input Param: int number
|
|
|
|
|
|
* Output Param:
|
|
|
|
|
|
* Return: int
|
|
|
|
|
|
* Call Relation:
|
|
|
|
|
|
* Other Description:
|
|
|
|
|
|
*************************************/
|
|
|
|
|
|
int countNumberFreq(int arr[], int size, int number);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************
|
|
|
|
|
|
* Method: Cosine_Similarity()
|
|
|
|
|
|
* Function Description: 计算两个size长度一维数组的余弦相似度
|
|
|
|
|
|
* CreateData: 2025/2/7
|
|
|
|
|
|
* Input Param: float * A
|
|
|
|
|
|
* Input Param: float * B
|
|
|
|
|
|
* Input Param: int size
|
|
|
|
|
|
* Output Param:
|
|
|
|
|
|
* Return: float
|
|
|
|
|
|
* Call Relation:
|
|
|
|
|
|
* Other Description:
|
|
|
|
|
|
*************************************/
|
|
|
|
|
|
float Cosine_Similarity(float* A, float* B, int size);
|
|
|
|
|
|
|
|
|
|
|
|
// 获取动态库所在路径
|
|
|
|
|
|
std::string GetDynamicLibraryPath();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*************************************
|
|
|
|
|
|
* Method: Save_RunImg()
|
|
|
|
|
|
* Function Description: 保存一帧调用算法的图像数据
|
|
|
|
|
|
* CreateData: 2025/3/11
|
|
|
|
|
|
* Input Param: GD_VIDEO_FRAME_S img:输入图像
|
|
|
|
|
|
* Input Param: SINT32 nControlerFrmNum:当前算法已处理的帧数
|
|
|
|
|
|
* Output Param:
|
|
|
|
|
|
* Return: void
|
|
|
|
|
|
* Call Relation:
|
|
|
|
|
|
* Other Description:
|
|
|
|
|
|
*************************************/
|
|
|
|
|
|
void Save_RunImg(GD_VIDEO_FRAME_S img, SINT32 nControlerFrmNum);
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/**********************************************************
|
|
|
|
|
|
* 函数名称:SERVO_CorrectAngleScale()
|
|
|
|
|
|
* 功能描述:处理伺服信息:校正角度值到0°~360°范围
|
|
|
|
|
|
* 输入参数:FLOAT32 fAngle -- 输入角度值
|
|
|
|
|
|
* 输出参数:无
|
|
|
|
|
|
* 返 回 值:FLOAT32 fAngleCorrect -- 校正后的角度值
|
|
|
|
|
|
* 调用关系:
|
|
|
|
|
|
* 其它说明:实际伺服角度范围为:-180°~0°~180°(= -180°)~0°~180°
|
|
|
|
|
|
**********************************************************/
|
|
|
|
|
|
FLOAT32 SERVO_CorrectAngleScale(FLOAT32 fAngle);
|
|
|
|
|
|
#endif
|