update 参数配置添加高低阈值,分块逻辑修改

dev_lsy
liusiyang 3 weeks ago
parent 740cc346e6
commit c2f9d93b2f

@ -1646,25 +1646,17 @@ int ImgCheckAnalysisy::Traditional_Detect_Thread(const cv::Mat &img, cv::Mat &Re
return -1;
}
Base_Function_TraditionDet traditionParam = m_pbaseCheckFunction->traditionDet;
// 首次调用时初始化传统检测参数(从 m_AnalysisyConfig 映射)
static bool bTcsInited = false;
if (!bTcsInited)
Base_Function_TraditionDet traditionParam = m_pbaseCheckFunction->traditionDet; // 首次调用时初始化传统检测参数(从 m_AnalysisyConfig 映射)
{
CHECK_PARAM cp;
cp.nAreaLowFilter = 80;
cp.nBlockSize = traditionParam.nBlockSize;
cp.nDiscardTop = 0;
cp.nDiscardBottom = 0;
cp.nDiscardLeft = 0;
cp.nDiscardRight = 0;
cp.fZoomRatio = traditionParam.fZoomRatio;
cp.nFilterLow = 15;
cp.nFilterHigh = 15;
cp.nFilterLow = traditionParam.nFilterLow;
cp.nFilterHigh = traditionParam.nFilterHigh;
cp.nAreaFilter = traditionParam.nAreaFilter;
cp.nCountFilter = traditionParam.nCountFilter;
m_tcsCheck.SetChecConfig(&cp);
bTcsInited = true;
}
cv::Rect detroi = cv::boundingRect(traditionParam.detArea);

@ -1788,6 +1788,8 @@ struct Base_Function_TraditionDet
float fZoomRatio; // 缩放比例
float nAreaFilter; // 面积过滤
int nCountFilter; // 数量过滤
int nFilterLow; // 低灰度过滤
int nFilterHigh; // 高灰度过滤
cv::Rect detArea_ROI;
std::vector<cv::Point> detArea;
bool bdetArea; // 是否使用区域
@ -1804,6 +1806,8 @@ struct Base_Function_TraditionDet
fZoomRatio = 0;
nAreaFilter = 0;
nCountFilter = 0;
nFilterLow = 0;
nFilterHigh = 0;
bdetArea = false;
detArea_ROI = cv::Rect(0, 0, 0, 0);
detArea.clear();
@ -1816,20 +1820,22 @@ struct Base_Function_TraditionDet
this->fZoomRatio = tem.fZoomRatio;
this->nAreaFilter = tem.nAreaFilter;
this->nCountFilter = tem.nCountFilter;
this->nFilterLow = tem.nFilterLow;
this->nFilterHigh = tem.nFilterHigh;
this->bdetArea = tem.bdetArea;
this->detArea_ROI = tem.detArea_ROI;
this->detArea.assign(tem.detArea.begin(), tem.detArea.end());
}
void print(std::string str)
{
printf("%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d \n", str.c_str(),
bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter);
printf("%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d nFilterLow %d nFilterHigh %d \n", str.c_str(),
bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter, nFilterLow, nFilterHigh);
}
std::string GetInfo(std::string str)
{
char buffer[256];
sprintf(buffer, "%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d \n", str.c_str(),
bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter);
sprintf(buffer, "%s>>bOpen %d nAreaLowFilter %f nBlockSize %d fZoomRatio %f nAreaFilter %f nCountFilter %d nFilterLow %d nFilterHigh %d \n", str.c_str(),
bOpen, nAreaLowFilter, nBlockSize, fZoomRatio, nAreaFilter, nCountFilter, nFilterLow, nFilterHigh);
std::string str123 = buffer;
return str123;
}

@ -1333,6 +1333,14 @@ int BaseFuntonConfigJson::GetFunction(Json::Value value)
{
_config.traditionDet.nCountFilter = value_f["form"]["Tradition_Param"]["nCountFilter"].asInt();
}
if (value_f["form"]["Tradition_Param"]["nFilterLow"])
{
_config.traditionDet.nFilterLow = value_f["form"]["Tradition_Param"]["nFilterLow"].asInt();
}
if (value_f["form"]["Tradition_Param"]["nFilterHigh"])
{
_config.traditionDet.nFilterHigh = value_f["form"]["Tradition_Param"]["nFilterHigh"].asInt();
}
// 2、读取区域点
{
auto value_region = value_f["form"]["Tradition_Param"]["detArea"];

@ -149,11 +149,25 @@ cv::Mat CTcsCheck::AdaptiveBinary(cv::Mat matBlur)
// 按 localBlockSize_ 分块,使用每个块的局部均值做动态阈值。
// 当前规则:落在 [avg-lower_, avg+upper_] 内置 0超出置 255。
cv::Mat result = cv::Mat::zeros(matBlur.size(), CV_8UC1);
m_cpCfg.nBlockSize = std::min(m_cpCfg.nBlockSize, matBlur.cols);
m_cpCfg.nBlockSize = std::min(m_cpCfg.nBlockSize, matBlur.rows);
for (int y = 0; y < matBlur.rows; y += m_cpCfg.nBlockSize) {
for (int x = 0; x < matBlur.cols; x += m_cpCfg.nBlockSize) {
const int blockW = std::min(m_cpCfg.nBlockSize, matBlur.cols - x);
const int blockH = std::min(m_cpCfg.nBlockSize, matBlur.rows - y);
cv::Rect blockRect(x, y, blockW, blockH);
// const int blockW = std::min(m_cpCfg.nBlockSize, matBlur.cols - x);
// const int blockH = std::min(m_cpCfg.nBlockSize, matBlur.rows - y);
cv::Rect blockRect(x, y, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize);
if(x + m_cpCfg.nBlockSize > matBlur.cols)
{
blockRect = cv::Rect(matBlur.cols - m_cpCfg.nBlockSize, y, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize);
}
if(y + m_cpCfg.nBlockSize > matBlur.rows)
{
blockRect = cv::Rect(x, matBlur.rows - m_cpCfg.nBlockSize, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize);
}
if(x + m_cpCfg.nBlockSize > matBlur.cols && y + m_cpCfg.nBlockSize > matBlur.rows)
{
blockRect = cv::Rect(matBlur.cols - m_cpCfg.nBlockSize, matBlur.rows - m_cpCfg.nBlockSize, m_cpCfg.nBlockSize, m_cpCfg.nBlockSize);
}
cv::Mat block = matBlur(blockRect);
const double avg = cv::mean(block)[0];
@ -324,6 +338,10 @@ int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& b
return -1;
}
// getchar();
// cv::Mat showImg = img.clone();
// cv::rectangle(showImg, detRoi, cv::Scalar(255), 2);
// cv::imwrite("detRoi.png", showImg);
m_matLoad = img;
// 确保 m_sizeImage 始终与 m_matLoad 同步
m_sizeImage = img.size();
@ -368,7 +386,8 @@ int CTcsCheck::TraditionalDetect(const cv::Mat& img, cv::Rect detRoi, cv::Mat& b
// 5. 高斯模糊 — 缓存到 m_matBlur
cv::GaussianBlur(matResized, m_matBlur, cv::Size(5, 5), 0);
// cv::imwrite("matResized.png", matResized);
// cv::imwrite("m_matBlur.png", m_matBlur);
// 6. 自适应二值化检测
m_matBlob = AdaptiveBinary(m_matBlur);
blobImg = m_matBlob.clone();

Loading…
Cancel
Save