透视矫正不够智能化,每次都要进行局部参数调整,不便于程序使用,程序流程还是那几个步骤;
1、读取图像、灰度化
2、高斯滤波
3、二值化
4、边缘检测
灰度化图
上个图看看经过调整透视矫正边缘检测结果我还是挺满意的
发现一个新问题获取最大面积的四个点有两个点重复在一个位置
一、读取图像、灰度化
固定化格式按部就班
private void button1_Click(object sender, EventArgs e)
{
OpenFileDialog dialog = new OpenFileDialog();
dialog.Multiselect = false;//该值确定是否可以选择多个文件
dialog.Title = "请选择文件夹";
dialog.Filter = "所有文件(*.*)|*.*";
if (dialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
// 1、读取图像、灰度化
string file = dialog.FileName;
Mat image = Cv2.ImRead(file, ImreadModes.Color);
Mat src_gray = new Mat();
Cv2.CvtColor(image, src_gray, ColorConversionCodes.BGR2GRAY); // 转换为灰度图像
}
二,高斯滤波
高斯模糊容易找到最大边界进行校正具体参数说明搜索一堆答案不在描述了
/// <summary>
/// 2、高斯滤波
/// </summary>
private void GaussianBlur()
{
Cv2.GaussianBlur(src_img, dst, new OpenCvSharp.Size(gussX, gussY), gussPX, gussPY); //高斯模糊
pictureBox1.Image = dst.ToBitmap();
pictureBox1.Refresh();
}
三、二值化
二值化区分索要区域,便于边缘检测
/// <summary>
/// 二值化
/// </summary>
private void Threshold()
{
if (cmBoxThre.Text == "")
{
return;
}
ThresholdTypes aaa = (ThresholdTypes)Enum.Parse(typeof(ThresholdTypes), cmBoxThre.Text);
try
{
Cv2.Threshold(src_img, dst, tkBarThresh.Value, tkBarMaxValue.Value, aaa);//阈值二值化
picBoxShowDel.Image = dst.ToBitmap();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
四、边缘检测
/// <summary>
/// 边缘检测Canny
/// </summary>
private void Canny()
{
int hole = 0;
if (!int.TryParse(txtBoxCannyHole.Text, out hole))
{
return;
}
try
{
Cv2.Canny(src_img, dst, tkBarCannyMin.Value, tkBarCannyMax.Value, hole, rbBtnTrue.Checked);
picBoxShowDel.Image = dst.ToBitmap();
}
catch (Exception e)
{
Console.WriteLine(e);
}
}
未完后续在补充~