更新除穿孔算法

This commit is contained in:
yangjiaxuan 2023-11-20 10:03:10 +08:00
parent 34dd2b8178
commit 54598d4a54
2 changed files with 25 additions and 4 deletions

View File

@ -34,6 +34,22 @@ void CImageApplyOutHole::apply(cv::Mat& pDib, int 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 RESIZE_FIXED_WIDTH 2448.0
#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);
#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<cv::Mat>& 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<cv::Mat>& mats, bool isTwoSide)
for (size_t i = 0; i < hole_contours.size(); i++)
{
std::vector<std::vector<cv::Point>> 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<cv::Mat>& mats, bool isTwoSide)
}
std::vector<std::vector<cv::Point>> 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);

View File

@ -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<cv::Point>& contour, int distance);
private:
float m_borderSize;
cv::Vec4f m_edgeScale;