更新除穿孔算法

This commit is contained in:
yangjiaxuan 2023-10-20 15:50:55 +08:00
parent f6ed0211ea
commit 34d078eb2d
2 changed files with 50 additions and 26 deletions

View File

@ -6,6 +6,8 @@
#include "Device/filetools.h" #include "Device/filetools.h"
#endif // LOG #endif // LOG
//#define DRAW_PIC
CImageApplyOutHole::CImageApplyOutHole(void) CImageApplyOutHole::CImageApplyOutHole(void)
: CImageApply() : CImageApply()
, m_borderSize(20) , m_borderSize(20)
@ -76,14 +78,20 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Mat front_thre, back_thre; cv::Mat front_thre, back_thre;
hg::threshold_Mat(front, front_thre, m_threshold); hg::threshold_Mat(front, front_thre, m_threshold);
hg::threshold_Mat(back, back_thre, m_threshold); hg::threshold_Mat(back, back_thre, m_threshold);
//cv::imwrite("front_thre.jpg", front_thre);
//cv::imwrite("back_thre.jpg", back_thre); #ifdef DRAW_PIC
cv::imwrite("front_thre.jpg", front_thre);
cv::imwrite("back_thre.jpg", back_thre);
#endif
cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5 * resize_scale, 1)); cv::Mat element = getStructuringElement(cv::MORPH_RECT, cv::Size(5 * resize_scale, 1));
cv::morphologyEx(front_thre, front_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0)); cv::morphologyEx(front_thre, front_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0));
cv::morphologyEx(back_thre, back_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0)); cv::morphologyEx(back_thre, back_thre, cv::MORPH_OPEN, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar::all(0));
//cv::imwrite("front_thre2.jpg", front_thre);
//cv::imwrite("back_thre2.jpg", back_thre); #ifdef DRAW_PIC
cv::imwrite("front_thre2.jpg", front_thre);
cv::imwrite("back_thre2.jpg", back_thre);
#endif
//反面二值化图像水平翻转 //反面二值化图像水平翻转
cv::flip(back_thre, back_thre, 1); //1:Horizontal cv::flip(back_thre, back_thre, 1); //1:Horizontal
@ -94,22 +102,22 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
hg::findContours(front_thre.clone(), contours_front, b1_front, cv::RETR_CCOMP); hg::findContours(front_thre.clone(), contours_front, b1_front, cv::RETR_CCOMP);
hg::findContours(back_thre.clone(), contours_back, b1_back, cv::RETR_CCOMP); hg::findContours(back_thre.clone(), contours_back, b1_back, cv::RETR_CCOMP);
//提取正反面图像最大轮廓 ////提取正反面图像最大轮廓
for (size_t i = 0; i < contours_front.size(); i++) //for (size_t i = 0; i < contours_front.size(); i++)
if (contours_front[i].size() < MIN_CONTOUR_SIZE) // if (contours_front[i].size() < MIN_CONTOUR_SIZE)
{ // {
contours_front.erase(contours_front.begin() + i); // contours_front.erase(contours_front.begin() + i);
b1_front.erase(b1_front.begin() + i); // b1_front.erase(b1_front.begin() + i);
i--; // i--;
} // }
for (size_t i = 0; i < contours_back.size(); i++) //for (size_t i = 0; i < contours_back.size(); i++)
if (contours_back[i].size() < MIN_CONTOUR_SIZE) // if (contours_back[i].size() < MIN_CONTOUR_SIZE)
{ // {
contours_back.erase(contours_back.begin() + i); // contours_back.erase(contours_back.begin() + i);
b1_back.erase(b1_back.begin() + i); // b1_back.erase(b1_back.begin() + i);
i--; // i--;
} // }
std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front); std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front);
std::vector<cv::Point> maxContour_back = hg::getMaxContour(contours_back, b1_back); std::vector<cv::Point> maxContour_back = hg::getMaxContour(contours_back, b1_back);
@ -132,26 +140,41 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Mat roiMat_front(front_thre, roi_front); //在正面二值图像中截取重叠部分 cv::Mat roiMat_front(front_thre, roi_front); //在正面二值图像中截取重叠部分
cv::Mat roiMat_back(back_thre, roi_back); //在反面二值图像中截取重叠部分 cv::Mat roiMat_back(back_thre, roi_back); //在反面二值图像中截取重叠部分
//cv::imwrite("roiMat_front.jpg", roiMat_front);
//cv::imwrite("roiMat_back.jpg", roiMat_back); #ifdef DRAW_PIC
cv::imwrite("roiMat_front.jpg", roiMat_front);
cv::imwrite("roiMat_back.jpg", roiMat_back);
#endif
//正反面二值图像做或运算真正镂空区域保留0其他地方填充为255 //正反面二值图像做或运算真正镂空区域保留0其他地方填充为255
cv::Mat mask; cv::Mat mask;
cv::bitwise_or(roiMat_front, roiMat_back, mask); //或运算,正反面二值图像重叠 cv::bitwise_or(roiMat_front, roiMat_back, mask); //或运算,正反面二值图像重叠
//cv::imwrite("mask1.jpg", mask);
#ifdef DRAW_PIC
cv::imwrite("mask1.jpg", mask);
#endif
//二值图像重叠图像颜色取反,膨胀,提取轮廓 //二值图像重叠图像颜色取反,膨胀,提取轮廓
cv::bitwise_not(mask, mask); cv::bitwise_not(mask, mask);
//cv::imwrite("mask2.jpg", mask); //反色
#ifdef DRAW_PIC
cv::imwrite("mask2.jpg", mask); //反色
#endif
//为了避免孔洞彻底贯穿纸边,人为绘制纸张轮廓,确保所有孔洞为封闭图形,不会与背景粘连 //为了避免孔洞彻底贯穿纸边,人为绘制纸张轮廓,确保所有孔洞为封闭图形,不会与背景粘连
cv::polylines(mask, hg::getVertices(mask_rotatedRect), true, cv::Scalar(0), LINE_WIDTH * resize_scale); //绘制纸张矩形边缘 cv::polylines(mask, hg::getVertices(mask_rotatedRect), true, cv::Scalar(0), LINE_WIDTH * resize_scale); //绘制纸张矩形边缘
//cv::imwrite("mask3.jpg", mask);
#ifdef DRAW_PIC
cv::imwrite("mask3.jpg", mask);
#endif
//膨胀算法,增大孔洞连通区域面积 //膨胀算法,增大孔洞连通区域面积
element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(DILATE_SIZE * resize_scale, DILATE_SIZE * resize_scale)); element = cv::getStructuringElement(cv::MORPH_ELLIPSE, cv::Size(DILATE_SIZE * resize_scale, DILATE_SIZE * resize_scale));
cv::dilate(mask, mask, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar(255)); cv::dilate(mask, mask, element, cv::Point(-1, -1), 1, cv::BORDER_CONSTANT, cv::Scalar(255));
//cv::imwrite("mask4.jpg", mask);
#ifdef DRAW_PIC
cv::imwrite("mask4.jpg", mask);
#endif
//提取重叠图像轮廓 //提取重叠图像轮廓
std::vector<std::vector<cv::Point>> contours_mask; std::vector<std::vector<cv::Point>> contours_mask;

View File

@ -25,7 +25,8 @@
* 2022/09/16 v1.9 * 2022/09/16 v1.9
* 2022/09/16 v1.9.1 * 2022/09/16 v1.9.1
* 2022/11/17 v1.9.2 BUG * 2022/11/17 v1.9.2 BUG
* v1.9.2 * 2023/05/16 v1.9.3 BUG
* v1.9.3
* ==================================================== * ====================================================
*/ */