更新除穿孔算法

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"
#endif // LOG
//#define DRAW_PIC
CImageApplyOutHole::CImageApplyOutHole(void)
: CImageApply()
, m_borderSize(20)
@ -76,14 +78,20 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
cv::Mat front_thre, back_thre;
hg::threshold_Mat(front, front_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::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::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
@ -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(back_thre.clone(), contours_back, b1_back, cv::RETR_CCOMP);
//提取正反面图像最大轮廓
for (size_t i = 0; i < contours_front.size(); i++)
if (contours_front[i].size() < MIN_CONTOUR_SIZE)
{
contours_front.erase(contours_front.begin() + i);
b1_front.erase(b1_front.begin() + i);
i--;
}
////提取正反面图像最大轮廓
//for (size_t i = 0; i < contours_front.size(); i++)
// if (contours_front[i].size() < MIN_CONTOUR_SIZE)
// {
// contours_front.erase(contours_front.begin() + i);
// b1_front.erase(b1_front.begin() + i);
// i--;
// }
for (size_t i = 0; i < contours_back.size(); i++)
if (contours_back[i].size() < MIN_CONTOUR_SIZE)
{
contours_back.erase(contours_back.begin() + i);
b1_back.erase(b1_back.begin() + i);
i--;
}
//for (size_t i = 0; i < contours_back.size(); i++)
// if (contours_back[i].size() < MIN_CONTOUR_SIZE)
// {
// contours_back.erase(contours_back.begin() + i);
// b1_back.erase(b1_back.begin() + i);
// i--;
// }
std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front);
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_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
cv::Mat 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::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::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));
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;

View File

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