C++ opencv Table Processing

 今天,實現了一個功能。主要實現以下功能:

(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.  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章