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