diff --git a/hgdriver/ImageProcess/ImageApplyOutHole.cpp b/hgdriver/ImageProcess/ImageApplyOutHole.cpp index 888fa96..926f872 100644 --- a/hgdriver/ImageProcess/ImageApplyOutHole.cpp +++ b/hgdriver/ImageProcess/ImageApplyOutHole.cpp @@ -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& 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& 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 maxContour_front = hg::getMaxContour(contours_front, b1_front); std::vector maxContour_back = hg::getMaxContour(contours_back, b1_back); @@ -132,26 +140,41 @@ void CImageApplyOutHole::apply(std::vector& 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> contours_mask; diff --git a/hgdriver/ImageProcess/ImageApplyOutHole.h b/hgdriver/ImageProcess/ImageApplyOutHole.h index b028f8c..1d3dd49 100644 --- a/hgdriver/ImageProcess/ImageApplyOutHole.h +++ b/hgdriver/ImageProcess/ImageApplyOutHole.h @@ -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 * ==================================================== */