From 54598d4a54a4fe63e5a7cc61e06f197756511045 Mon Sep 17 00:00:00 2001 From: yangjiaxuan <171295266@qq.com> Date: Mon, 20 Nov 2023 10:03:10 +0800 Subject: [PATCH] =?UTF-8?q?=E6=9B=B4=E6=96=B0=E9=99=A4=E7=A9=BF=E5=AD=94?= =?UTF-8?q?=E7=AE=97=E6=B3=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- hgdriver/ImageProcess/ImageApplyOutHole.cpp | 24 ++++++++++++++++++--- hgdriver/ImageProcess/ImageApplyOutHole.h | 5 ++++- 2 files changed, 25 insertions(+), 4 deletions(-) diff --git a/hgdriver/ImageProcess/ImageApplyOutHole.cpp b/hgdriver/ImageProcess/ImageApplyOutHole.cpp index 926f872..0c2ada4 100644 --- a/hgdriver/ImageProcess/ImageApplyOutHole.cpp +++ b/hgdriver/ImageProcess/ImageApplyOutHole.cpp @@ -34,6 +34,22 @@ void CImageApplyOutHole::apply(cv::Mat& pDib, int side) (void)side; } +void CImageApplyOutHole::dilateContour(std::vector& contour, int distance) +{ + cv::Moments mu = cv::moments(contour); + + cv::Point2f center(mu.m10 / mu.m00, mu.m01 / mu.m00), p_temp; + for (size_t i = 0; i < contour.size(); i++) + { + p_temp = contour[i]; + double dis = cv::sqrt(cv::pow(p_temp.x - center.x, 2) + cv::pow(p_temp.y - center.y, 2)); + double scale = dis / (distance + dis); + double x = (p_temp.x - center.x) / scale + center.x; + double y = (p_temp.y - center.y) / scale + center.y; + contour[i] = cv::Point(x, y); + } +} + #define MIN_CONTOUR_SIZE 10 #define RESIZE_FIXED_WIDTH 2448.0 #define LINE_WIDTH 18 @@ -84,7 +100,7 @@ void CImageApplyOutHole::apply(std::vector& mats, bool isTwoSide) 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(m_borderSize * resize_scale / 4, 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)); @@ -169,8 +185,8 @@ void CImageApplyOutHole::apply(std::vector& mats, bool isTwoSide) #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)); + //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)); #ifdef DRAW_PIC cv::imwrite("mask4.jpg", mask); @@ -196,6 +212,7 @@ void CImageApplyOutHole::apply(std::vector& mats, bool isTwoSide) for (size_t i = 0; i < hole_contours.size(); i++) { std::vector> contourss_temp; + dilateContour(hole_contours[i], 5); contourss_temp.push_back(hole_contours[i]); cv::Mat front_temp = mats[0](roi_front); hg::fillPolys(front_temp, contourss_temp, color); @@ -223,6 +240,7 @@ void CImageApplyOutHole::apply(std::vector& mats, bool isTwoSide) } std::vector> contours_temp; + dilateContour(hole_contour, 5); contours_temp.push_back(hole_contour); cv::Mat back_temp = mats[1](roi_back); hg::fillPolys(back_temp, contours_temp, color); diff --git a/hgdriver/ImageProcess/ImageApplyOutHole.h b/hgdriver/ImageProcess/ImageApplyOutHole.h index 1d3dd49..69317e9 100644 --- a/hgdriver/ImageProcess/ImageApplyOutHole.h +++ b/hgdriver/ImageProcess/ImageApplyOutHole.h @@ -26,7 +26,8 @@ * 2022/09/16 v1.9.1 修复缩放比例的逻辑错误。 * 2022/11/17 v1.9.2 修复寻找孔洞轮廓BUG。 * 2023/05/16 v1.9.3 修复提取纸张最大轮廓的逻辑BUG。 - * 版本号:v1.9.3 + * 2023/11/18 v1.10 替换形态学膨胀孔洞轮廓,改为特征矩阵膨胀轮廓说 + * 版本号:v1.10 * ==================================================== */ @@ -81,6 +82,8 @@ private: uchar getBackGroudChannelMean(const cv::Mat& gray, int total); + void dilateContour(std::vector& contour, int distance); + private: float m_borderSize; cv::Vec4f m_edgeScale;