更新除穿孔算法
This commit is contained in:
parent
34dd2b8178
commit
54598d4a54
|
@ -34,6 +34,22 @@ void CImageApplyOutHole::apply(cv::Mat& pDib, int side)
|
||||||
(void)side;
|
(void)side;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void CImageApplyOutHole::dilateContour(std::vector<cv::Point>& 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 MIN_CONTOUR_SIZE 10
|
||||||
#define RESIZE_FIXED_WIDTH 2448.0
|
#define RESIZE_FIXED_WIDTH 2448.0
|
||||||
#define LINE_WIDTH 18
|
#define LINE_WIDTH 18
|
||||||
|
@ -84,7 +100,7 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
cv::imwrite("back_thre.jpg", back_thre);
|
cv::imwrite("back_thre.jpg", back_thre);
|
||||||
#endif
|
#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(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));
|
||||||
|
|
||||||
|
@ -169,8 +185,8 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
#endif
|
#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));
|
||||||
|
|
||||||
#ifdef DRAW_PIC
|
#ifdef DRAW_PIC
|
||||||
cv::imwrite("mask4.jpg", mask);
|
cv::imwrite("mask4.jpg", mask);
|
||||||
|
@ -196,6 +212,7 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
for (size_t i = 0; i < hole_contours.size(); i++)
|
for (size_t i = 0; i < hole_contours.size(); i++)
|
||||||
{
|
{
|
||||||
std::vector<std::vector<cv::Point>> contourss_temp;
|
std::vector<std::vector<cv::Point>> contourss_temp;
|
||||||
|
dilateContour(hole_contours[i], 5);
|
||||||
contourss_temp.push_back(hole_contours[i]);
|
contourss_temp.push_back(hole_contours[i]);
|
||||||
cv::Mat front_temp = mats[0](roi_front);
|
cv::Mat front_temp = mats[0](roi_front);
|
||||||
hg::fillPolys(front_temp, contourss_temp, color);
|
hg::fillPolys(front_temp, contourss_temp, color);
|
||||||
|
@ -223,6 +240,7 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<std::vector<cv::Point>> contours_temp;
|
std::vector<std::vector<cv::Point>> contours_temp;
|
||||||
|
dilateContour(hole_contour, 5);
|
||||||
contours_temp.push_back(hole_contour);
|
contours_temp.push_back(hole_contour);
|
||||||
cv::Mat back_temp = mats[1](roi_back);
|
cv::Mat back_temp = mats[1](roi_back);
|
||||||
hg::fillPolys(back_temp, contours_temp, color);
|
hg::fillPolys(back_temp, contours_temp, color);
|
||||||
|
|
|
@ -26,7 +26,8 @@
|
||||||
* 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。
|
||||||
* 2023/05/16 v1.9.3 修复提取纸张最大轮廓的逻辑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);
|
uchar getBackGroudChannelMean(const cv::Mat& gray, int total);
|
||||||
|
|
||||||
|
void dilateContour(std::vector<cv::Point>& contour, int distance);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
float m_borderSize;
|
float m_borderSize;
|
||||||
cv::Vec4f m_edgeScale;
|
cv::Vec4f m_edgeScale;
|
||||||
|
|
Loading…
Reference in New Issue