You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

324 lines
7.8 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/*
//实现对部分缺陷 需要进行 数量 和距离上分析的
*/
#ifndef QX_Analysis_H_
#define QX_Analysis_H_
#include <opencv2/opencv.hpp>
#include "CheckUtil.hpp"
#include "CheckErrorCodeDefine.hpp"
using namespace std;
enum QX_ANALYSIS_NAME
{
QX_ANALYSIS_POL_CELL, // 异物
QX_ANALYSIS_AD, // 暗点
QX_ANALYSIS_Scratch, // 划伤
QX_ANALYSIS_LINE, // 线类
QX_ANALYSIS_MTX, // MTX
QX_ANALYSIS_ALL, // MTX&异物
QX_ANALYSIS_COUNT,
};
// 缺陷项对应在参数中的名称
static const std::string QX_ANALYSIS_NAME_Names[] =
{
"POL_Cell",
"AD",
"Scratch",
"LINE",
"MTX",
"POL_Cell&MTX"};
// 预处理参数
struct Pre_Analysisy_Param
{
float fAreaMin = 0; // 面积最小值
float fHJMin = 0; // 灰度最小值
float fLenMin = 0; // 长度最小值
float fMdMin = 0; // 密度最小值
};
// 记录缺陷信息
struct QX_Info
{
std::string camera_name;
std::string channel_name;
float area; // 面积
float energy; // 能量
float hj; // 灰阶
float length; // 长度
float density; // 密度
cv::Point2f plocatin_mm; // 位置mm
cv::Point2f plocatin_pixel; // 位置 像素
cv::Point2f pLocation_Product_mm; // 位置mm相对于产品的。位置
int blobIdx; // blob idx;
int result;
float fmindis;
int nmindis_BlobIdx;
cv::Point mindis_locatin_pixel; // 位置 像素
int nstatus;
int nqx_type;
float tem_dis;
float tem_dis_idx;
cv::Rect roi;
cv::Rect product_roi;
QX_Info()
{
Init();
}
void Init()
{
area = 0;
energy = 0;
hj = 0;
length = 0;
plocatin_mm = cv::Point2f(0, 0);
plocatin_pixel = cv::Point(0, 0);
blobIdx = 0;
result = 0;
fmindis = 0;
mindis_locatin_pixel = cv::Point(0, 0);
pLocation_Product_mm = cv::Point2f(0, 0);
nstatus = 0;
nqx_type = 0;
nmindis_BlobIdx = 0;
density = 0;
camera_name = "";
channel_name = "";
tem_dis = 0;
tem_dis_idx = 0;
roi = cv::Rect(0, 0, 0, 0);
product_roi = cv::Rect(0, 0, 0, 0);
}
void print(std::string str)
{
printf("%s blobIdx %d,result %d area %f energy %f hj %f length %f md %f x %f y %f x %f y %f \n",
str.c_str(), blobIdx, result, area, energy, hj, length, density, plocatin_mm.x, plocatin_mm.y, plocatin_pixel.x, plocatin_pixel.y);
printf("%s blobIdx %d,fmindis %f mindis_locatin_pixel x %d y %d \n",
str.c_str(), blobIdx, fmindis, mindis_locatin_pixel.x, mindis_locatin_pixel.y);
}
std::string GetInfo()
{
char buffer[64];
sprintf(buffer, "idx:%d A:%0.2f,HJ:%0.2f,Len:%0.2f,md:%0.2f,dis:%0.2f",
blobIdx, area, hj, length, density,tem_dis);
std::string str123 = buffer;
return str123;
}
};
struct QX_ALL_List
{
std::vector<QX_Info> qxList;
QX_ALL_List()
{
Init();
}
void Init()
{
qxList.erase(qxList.begin(), qxList.end());
qxList.clear();
// config.Init();
}
};
struct QX_channel_List
{
std::shared_ptr<DetLog> pChannelDetlog;
std::shared_ptr<DetLog> pChannelDetlog2;
std::string channel_name;
std::vector<QX_Info> qxList;
QX_channel_List()
{
Init();
}
void Init()
{
qxList.erase(qxList.begin(), qxList.end());
qxList.clear();
channel_name = "";
// config.Init();
}
void Initstatus()
{
for (int i = 0; i < qxList.size(); i++)
{
qxList[i].nqx_type = 0;
qxList[i].nstatus = 0;
qxList[i].tem_dis = 0;
qxList[i].tem_dis_idx = -1;
}
}
bool preDet(int i, Pre_Analysisy_Param param, std::string &strinfo)
{
strinfo = "";
bool return_value = true;
if (qxList[i].area < param.fAreaMin)
{
return_value = false;
strinfo += "A:false";
}
if (qxList[i].hj < param.fHJMin)
{
return_value = false;
strinfo += "HJ:false";
}
if (qxList[i].density < param.fMdMin)
{
return_value = false;
strinfo += "md:false";
}
if (qxList[i].length < param.fLenMin)
{
return_value = false;
strinfo += "Len:false";
}
return return_value;
}
void claDis()
{
for (int i = 0; i < qxList.size(); i++)
{
if (qxList[i].nstatus != 1)
{
continue;
}
double mindis = 99999999999;
int mindix = -1;
for (int j = 0; j < qxList.size(); j++)
{
if (i == j || qxList[j].nstatus != 1)
{
continue;
}
float dis = CheckUtil::calDis(qxList[i].pLocation_Product_mm, qxList[j].pLocation_Product_mm);
if (dis < mindis)
{
mindis = dis;
mindix = j;
}
}
if (mindix != -1)
{
qxList[i].tem_dis = mindis;
qxList[i].tem_dis_idx = mindix;
}
}
}
};
struct ALL_Qx_DataList
{
std::vector<QX_channel_List> channelqxList;
ALL_Qx_DataList()
{
Init();
}
void Init()
{
channelqxList.erase(channelqxList.begin(), channelqxList.end());
channelqxList.clear();
}
};
struct QXAnalysis_Config
{
bool bok;
int num;
float dis;
float len;
int hj;
float density;
float area;
float sum_area;
QXAnalysis_Config()
{
Init();
}
void Init()
{
bok = false;
num = 0;
dis = 0;
len = 0;
area = 0;
hj = 0;
sum_area = 0;
density = 0;
}
void print(std::string str)
{
printf("%s bok %d num %d area %f dis %f len %f hj %d md %f\n", str.c_str(), bok, num, area, dis, len, hj, density);
}
};
struct ALL_QX_ParamList
{
std::vector<QXAnalysis_Config> configlsit;
ALL_QX_ParamList()
{
Init();
}
void Init()
{
configlsit.erase(configlsit.begin(), configlsit.end());
configlsit.clear();
// config.Init();
}
};
enum QX_ERROR_TYPE_
{
QX_ERROR_TYPE_OK,
QX_ERROR_TYPE_AREA,
QX_ERROR_TYPE_NUM,
QX_ERROR_TYPE_DIS,
QX_ERROR_TYPE_Len,
QX_ERROR_TYPE_NUM_RGB255,
};
struct QX_RESULT
{
std::string camera_name;
std::string channel_name;
int blobIdx; // blob idx;
int error_Type; // 错误原因
int qx_Num; // 缺陷的数量
float mindis;
float flen;
cv::Point qx_MisDis_point_pixel; // 缺陷 间的最小距离
QX_RESULT()
{
Init();
}
void Init()
{
blobIdx = -1;
error_Type = 0;
qx_Num = 0;
flen = 0;
mindis = 0;
qx_MisDis_point_pixel = cv::Point(0, 0);
camera_name = "";
channel_name = "";
}
void print(std::string str)
{
printf("%s blobIdx %d error_Type %d qx_Num %d min dis %f flen %f x %d y %d \n",
str.c_str(), blobIdx, error_Type, qx_Num, mindis, flen, qx_MisDis_point_pixel.x, qx_MisDis_point_pixel.y);
}
};
struct QX_Analysis_Result_List
{
std::vector<QX_RESULT> resultList;
QX_Analysis_Result_List()
{
Init();
}
void Init()
{
resultList.erase(resultList.begin(), resultList.end());
resultList.clear();
// config.Init();
}
};
#endif