更新除穿孔算法
This commit is contained in:
parent
f6ed0211ea
commit
34d078eb2d
|
@ -6,6 +6,8 @@
|
||||||
#include "Device/filetools.h"
|
#include "Device/filetools.h"
|
||||||
#endif // LOG
|
#endif // LOG
|
||||||
|
|
||||||
|
//#define DRAW_PIC
|
||||||
|
|
||||||
CImageApplyOutHole::CImageApplyOutHole(void)
|
CImageApplyOutHole::CImageApplyOutHole(void)
|
||||||
: CImageApply()
|
: CImageApply()
|
||||||
, m_borderSize(20)
|
, m_borderSize(20)
|
||||||
|
@ -76,14 +78,20 @@ void CImageApplyOutHole::apply(std::vector<cv::Mat>& mats, bool isTwoSide)
|
||||||
cv::Mat front_thre, back_thre;
|
cv::Mat front_thre, back_thre;
|
||||||
hg::threshold_Mat(front, front_thre, m_threshold);
|
hg::threshold_Mat(front, front_thre, m_threshold);
|
||||||
hg::threshold_Mat(back, back_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::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(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));
|
||||||
//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
|
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(front_thre.clone(), contours_front, b1_front, cv::RETR_CCOMP);
|
||||||
hg::findContours(back_thre.clone(), contours_back, b1_back, 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++)
|
//for (size_t i = 0; i < contours_front.size(); i++)
|
||||||
if (contours_front[i].size() < MIN_CONTOUR_SIZE)
|
// if (contours_front[i].size() < MIN_CONTOUR_SIZE)
|
||||||
{
|
// {
|
||||||
contours_front.erase(contours_front.begin() + i);
|
// contours_front.erase(contours_front.begin() + i);
|
||||||
b1_front.erase(b1_front.begin() + i);
|
// b1_front.erase(b1_front.begin() + i);
|
||||||
i--;
|
// i--;
|
||||||
}
|
// }
|
||||||
|
|
||||||
for (size_t i = 0; i < contours_back.size(); i++)
|
//for (size_t i = 0; i < contours_back.size(); i++)
|
||||||
if (contours_back[i].size() < MIN_CONTOUR_SIZE)
|
// if (contours_back[i].size() < MIN_CONTOUR_SIZE)
|
||||||
{
|
// {
|
||||||
contours_back.erase(contours_back.begin() + i);
|
// contours_back.erase(contours_back.begin() + i);
|
||||||
b1_back.erase(b1_back.begin() + i);
|
// b1_back.erase(b1_back.begin() + i);
|
||||||
i--;
|
// i--;
|
||||||
}
|
// }
|
||||||
|
|
||||||
std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front);
|
std::vector<cv::Point> maxContour_front = hg::getMaxContour(contours_front, b1_front);
|
||||||
std::vector<cv::Point> maxContour_back = hg::getMaxContour(contours_back, b1_back);
|
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_front(front_thre, roi_front); //在正面二值图像中截取重叠部分
|
||||||
cv::Mat roiMat_back(back_thre, roi_back); //在反面二值图像中截取重叠部分
|
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
|
//正反面二值图像做或运算,真正镂空区域保留0,其他地方填充为255
|
||||||
cv::Mat mask;
|
cv::Mat mask;
|
||||||
cv::bitwise_or(roiMat_front, roiMat_back, 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::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::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));
|
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));
|
||||||
//cv::imwrite("mask4.jpg", mask);
|
|
||||||
|
#ifdef DRAW_PIC
|
||||||
|
cv::imwrite("mask4.jpg", mask);
|
||||||
|
#endif
|
||||||
|
|
||||||
//提取重叠图像轮廓
|
//提取重叠图像轮廓
|
||||||
std::vector<std::vector<cv::Point>> contours_mask;
|
std::vector<std::vector<cv::Point>> contours_mask;
|
||||||
|
|
|
@ -25,7 +25,8 @@
|
||||||
* 2022/09/16 v1.9 优化内存消耗
|
* 2022/09/16 v1.9 优化内存消耗
|
||||||
* 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。
|
||||||
* 版本号:v1.9.2
|
* 2023/05/16 v1.9.3 修复提取纸张最大轮廓的逻辑BUG。
|
||||||
|
* 版本号:v1.9.3
|
||||||
|
|
||||||
* ====================================================
|
* ====================================================
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue