透视矫正,引用文档拍照扫描,相片矫正这块。
- 读取图像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 < contours.Length; i++)
{
double area = Cv2.ContourArea(contours[i]);
if (area > 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 < 4; i++)
{
// 设置目标图像的四个顶点坐标
//Cv2.PutText(image, "H"+i, new Point(approx[i].X, approx[i].Y), HersheyFonts.HersheySimplex, 1, new Scalar(0, 0, 255), 2, LineTypes.Link4);
}
//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(

本文详细介绍了如何在C#中使用OpenCVSharp进行图像处理,包括读取图像、灰度化、高斯滤波、边缘检测、轮廓检测,最终实现对图像进行透视矫正的过程。
最低0.47元/天 解锁文章
2202

被折叠的 条评论
为什么被折叠?



