今天,實現了一個功能。主要實現以下功能:
(1)首先進行直線檢測
(2)HOUGH重構橫向線段
(3)基於重構橫向線段的縱向線段處理
(4)掩膜處理
-
Today, a function is implemented.The main functions are as follows:
-
(1) Straight line detection shall be carried out first
-
(2) Reconstruction of transverse line segments by HOUGH
-
(3) Longitudinal segment processing based on reconstruction of transverse segment
-
(4) Mask treatment
result:
Part of the code is as follows:
Mat Pre_processing(Mat SrcImage)
{
Mat src = SrcImage.clone();
Mat Binarization = Graybinarization(src);
//第三步:形態學水平直線提取 --->腐蝕膨脹 膨脹(自定義核)
int horizontalscale = Binarization.cols*0.05;
Mat HorinalImage;
if (horizontalscale)//閾值
{
HorinalImage = Horinal_extract(Binarization, horizontalscale);//60
}
else
{
HorinalImage = Horinal_extract(Binarization, horizontalscale);//60
}
std::tuple<vector<int>, int, Mat, vector<int>> PreHoughlinedata = PreHoughLine_preprocessing(HorinalImage);
//=========================================================================
vector<int> Hough_Line_Okay_Y = std::get<0>(PreHoughlinedata);
int rowledge = std::get<1>(PreHoughlinedata);
Mat HoughLineMat = std::get<2>(PreHoughlinedata);
vector<int> Hough_Line_X = std::get<3>(PreHoughlinedata);
//=========================================================================
sort(Hough_Line_X.begin(), Hough_Line_X.end());
if (Hough_Line_X.size() >= 2)
{
int sum_x = 0.0;
int boundaryvalue = 0;
std::vector<int>::iterator Hough_Line_Max_X = std::max_element(std::begin(Hough_Line_X), std::end(Hough_Line_X));
if (Hough_Line_Max_X[0] - Hough_Line_X[Hough_Line_X.size() - 2] < 20)
{
for (int i = Hough_Line_X.size() - 30; i < Hough_Line_X.size(); i++)
{
sum_x = sum_x + int(Hough_Line_X[i]);
}
boundaryvalue = int(sum_x / 30);
for (int i = 0; i < Hough_Line_Okay_Y.size(); i++)
{
line(src, Point(boundaryvalue, Hough_Line_Okay_Y[i] - 10), Point(boundaryvalue, Hough_Line_Okay_Y[i] + 10), Scalar(0, 0, 0), 3);
}
}
else
{
}
}
#if 1
Mat Binarization_Y = Graybinarization(src);
//=========================================================================
cout << "||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||" << rowledge << endl;
int verticalscale = rowledge*0.1;//meanrowledge
cout << "----------------------------->" << verticalscale << endl;
Mat VerticalImage;
if (verticalscale)//閾值
{
VerticalImage = Vertical_extract(Binarization_Y, verticalscale, 1, 1);// 80 10 20
imwrite("./test.jpg", VerticalImage);
}
else
{
VerticalImage = Vertical_extract(Binarization_Y, 80, 10, 20);// 80 10 20
}
Mat MaskImage = HorinalImage + VerticalImage;
cv::namedWindow("src", CV_WINDOW_NORMAL);//創建窗口
cvResizeWindow("src", 800, 800); //創建一個500*500大小的窗口
imshow("src", SrcImage);
cv::namedWindow("MaskImage", CV_WINDOW_NORMAL);//創建窗口
cvResizeWindow("MaskImage", 800, 800); //創建一個500*500大小的窗口
imshow("MaskImage", MaskImage);
#endif
#if 0
cv::namedWindow("src", CV_WINDOW_NORMAL);//創建窗口
cvResizeWindow("src", 800, 800); //創建一個500*500大小的窗口
imshow("src", src);
cv::namedWindow("Binarization", CV_WINDOW_NORMAL);//創建窗口
cvResizeWindow("Binarization", 800, 800); //創建一個500*500大小的窗口
imshow("Binarization", Binarization);
cv::namedWindow("HorinalImage", CV_WINDOW_NORMAL);//創建窗口
cvResizeWindow("HorinalImage", 800, 800); //創建一個500*500大小的窗口
imshow("HorinalImage", HorinalImage);
cv::namedWindow("HoughLineMat", CV_WINDOW_NORMAL);//創建窗口
cvResizeWindow("HoughLineMat", 800, 800); //創建一個500*500大小的窗口
imshow("HoughLineMat", HoughLineMat);
#endif
return src;
}
I hope I can help you,If you have any questions, please comment on this blog or send me a private message. I will reply in my free time.