透视矫正,引用文档拍照扫描,相片矫正这块。
- 读取图像Cv2.ImRead();
- 预处理(灰度化,高斯滤波、边缘检测)
- 轮廓检测(获取到最大轮廓)
- 获取最大面积轮廓的四个顶点
- 标识最小矩形坐标
- 透视矫正显示
完整代码
// 1、读取图像
Mat image = Cv2.ImRead("2.jpg", ImreadModes.Color);
//2、预处理(灰度化,高斯滤波、边缘检测)
Mat src_gray = new Mat();
Cv2.CvtColor(image, src_gray, ColorConversionCodes.BGR2GRAY); // 转换为灰度图像
Cv2.GaussianBlur(src_gray, src_gray, new Size(5, 5), 0, 0); // 进行高斯模糊
Mat canny_Image = new Mat();
Cv2.Canny(src_gray, canny_Image, 75, 200);
//3、轮廓检测
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(canny_Image, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 计算轮廓的面积
double maxArea = 0;
int maxAreaIndex = -1;
for (int i = 0; i maxArea)
{
maxArea = area;
maxAreaIndex = i;
}
}
// 获取最大面积的轮廓
Point[] largestContour = contours[maxAreaIndex];
//4、获取最大面积轮廓的四个顶点。
Point[] approx = Cv2.ApproxPolyDP(contours[maxAreaIndex], 0.02 * Cv2.ArcLength(contours[maxAreaIndex], true), true);
Cv2.DrawContours(image, new Point[][] { approx }, -1, Scalar.Blue, 2);
//可以注释掉
for (int i = 0; i
一 、读取图像Cv2.ImRead()
// 1、读取图像
Mat image = Cv2.ImRead("2.jpg", ImreadModes.Color);
二、预处理(灰度化,高斯滤波、边缘检测)
灰度化:Cv2.CvtColor();
高斯滤波:Cv2.GaussianBlur();
边缘检测:Cv2.Canny();
//2、预处理(灰度化,高斯滤波、边缘检测)
Mat src_gray = new Mat();
Cv2.CvtColor(image, src_gray, ColorConversi服务器托管网onCodes.BGR2GRAY); // 转换为灰度图像
Cv2.GaussianBlur(src_gray, src_gray, new Size(5, 5), 0, 0); // 进行高斯模糊
Mat canny_Image = new Mat();
Cv2.Canny(src_gray, canny_Image, 75, 200);
三、轮廓检测(获取到最大轮廓)
通过Cv2.ContourArea()计算轮廓的面积,选出最大轮廓
//3、轮廓检测
Point[][] contours;
HierarchyIndex[] hierarchy;
Cv2.FindContours(canny_Image, out contours, out hierarchy, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
// 计算轮廓的面积
double maxArea = 0;
int maxAreaIndex = -1;
for (int i = 0; i maxArea)
{
maxArea = area;
maxAreaIndex = i;
}
}
// 获取最大面积的轮廓
Point[] largestContour = contours[maxAreaIndex];
四、 获取最大面积轮廓的四个顶点。
Cv2.ApproxPolyDP() 获取4个顶点坐标
//4、获取最大面积轮廓的四个顶点。
Point[] approx = Cv2.ApproxPolyDP(contours[maxAreaIndex], 0.02 * Cv2.ArcLength(contours[maxAreaIndex], true), true);
标识四个顶点
//可以注释掉
for (int i = 0; i
五、标识最小矩形坐标
获取顶点内最小矩形Cv2.MinAreaRect(srcPt);
//获取四个顶点坐标最小矩形顶点
RotatedRect rect = Cv2.MinAreaRect(srcPt);
Rect box = rect.BoundingRect();
OpenCvSharp.Point2f[] dstPt = new OpenCvSharp.Point2f[4];
stPt[0].X = box.X;
dstPt[0].Y = box.Y;
dstPt[1].X = box.X + box.Width;
dstPt[1].Y = box.Y;
dstPt[2].X = box.X + box.Width;
dstPt[2].Y = box.Y + box.Height;
dstPt[3].X = box.X;
dstPt[3].Y = box.Y + box.Height;
Mat final = new Mat();
Mat warpmatrix = Cv2.GetPerspectiveTransform(srcPt, dstPt);//获得变换矩阵
Cv2.WarpPerspective(image, final, warpmatrix, image.Size());//投射变换,将结果赋给final
Rect roi = new Rect(box.X, box.Y, box.Width, box.Height);//坐标 x,y 尺寸 长宽
Mat croppedImage = new Mat(final, roi);
for (int i = 0; i
两个坐标点顺序不一样,对齐坐标顺序,进行透视坐标转换
//5、透视转换
OpenCvSharp.Point2f[] srcPt = new OpenCvSharp.Point2f[4];
srcPt[0] = approx[0];
srcPt[1] = approx[3];
srcPt[2] = approx[2];
srcPt[3] = approx[1];
RotatedRect rect = Cv2.MinAreaRect(srcPt);
Rect box = rect.BoundingRect();
OpenCvSharp.Point2f[] dstPt = new OpenCvSharp.Point2f[4];
dstPt[0].X = box.X;
dstPt[0].Y = box.Y;
dstPt[1].X = box.X + box.Width;
dstPt[1].Y = box.Y;
dstPt[2].X = box.X + box.Width;
dstPt[2].Y = box.Y + box.Height;
dstPt[3].X = box.X;
dstPt[3].Y = box.Y + box.Height;
Mat final = new Mat();
六、透视变换显示
Mat warpmatrix = Cv2.GetPerspectiveTransform(srcPt, dstPt);//获得变换矩阵
Cv2.WarpPerspective(image, final, warpmatrix, final.Size());//投射变换,将结果赋给final
Cv2.ImShow("透视矫正图像", final);
通过掌握这六个步骤,你可以在C#中使用OpenCvSharp实现透视矫正。祝你成功!
服务器托管,北京服务器托管,服务器租用 http://www.服务器托管网fwqtg.net
添加磁盘 磁盘分区 查看机器所挂硬盘个数及分区情况服务器托管网 fdisk -l 对磁盘进行分区 fdisk /dev/sdc 增加一个新的分区 列出分区表 指定分区类型 服务器托管网检查分区信息后保存退出 扩容 查看物理卷 创建物理卷 查看卷组 vgdisp…