发新帖

[C#/ASP.NET] [Cv] OpenCv案例(一):OpenCvSharp识别图像中物体个数

零下一度 2022-12-28 753
[STAThread]
static void Main(string[] args)
{ 
Mat imgsrc = Cv2.ImRead("D://source.jpg");
imgsrc = GetNumberByImg(imgsrc);
Cv2.ImShow("img", imgsrc);
//延时等待按键按下
Cv2.WaitKey(0); 
}
static Mat GetNumberByImg(Mat src)
{ 
int num = 0;
//图像灰度
Mat matGray = new Mat();
Cv2.CvtColor(src, matGray, ColorConversionCodes.BGR2GRAY);
Mat blurMat = new Mat();
Cv2.MedianBlur(matGray, blurMat, 5);
Cv2.Resize(blurMat, blurMat, new OpenCvSharp.Size(800, 600), 0, 0);
//Cv2.ImShow("blurMat", blurMat);
//图像二值化
Mat binaryMat = new Mat();
Cv2.Threshold(blurMat, binaryMat, 0, 255, ThresholdTypes.Binary | ThresholdTypes.Otsu);
////Cv2.ImShow("binaryImg", binaryMat);
//形态学操作
Mat kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 3), new Point(-1, -1));
Cv2.MorphologyEx(binaryMat, binaryMat, MorphTypes.Dilate, kernel, new Point(-1, -1), 1);
////Cv2.ImShow("Dilate", binaryMat);
//距离变换
Mat dist = new Mat();
Cv2.BitwiseNot(binaryMat, binaryMat);
////Cv2.ImShow("binaryMat", binaryMat);
Cv2.DistanceTransform(binaryMat, dist, DistanceTypes.L2, DistanceTransformMasks.Mask3);
Cv2.Normalize(dist, dist, 0, 1, NormTypes.MinMax);
////Cv2.ImShow("distImage", dist);
//阈值化二值分割
Mat dist_8U = new Mat();
dist.ConvertTo(dist_8U, MatType.CV_8U);
//自适应阈值则,是根据像素的邻域块的像素值分布来确定该像素位置上的二值化阈值
Cv2.AdaptiveThreshold(dist_8U, dist_8U, 250, AdaptiveThresholdTypes.GaussianC, ThresholdTypes.Binary, 101, 0);
////Cv2.ImShow("dist-AdaptiveThreshold", dist_8U);
kernel = Cv2.GetStructuringElement(MorphShapes.Rect, new Size(5, 3), new Point(-1, -1));
Cv2.Dilate(dist_8U, dist_8U, kernel, new Point(-1, -1), 2);
Cv2.ImShow("dist-Dilate", dist_8U);
//连通区域计算
Point[][] contours;
HierarchyIndex[] hierarchies;
Cv2.FindContours(dist_8U, out contours, out hierarchies, RetrievalModes.External, ContourApproximationModes.ApproxSimple);
//绘制结果图像
Mat markRet = Mat.Zeros(src.Size(), MatType.CV_8UC3);
RNG rng = new RNG(12345);
for (int i = 0; i < contours.Length; i++)
{
Cv2.DrawContours(markRet, contours, i, new Scalar(rng.Uniform(0, 255), rng.Uniform(0, 255), rng.Uniform(0, 255)), -1, LineTypes.Link8);
}
num = contours.Length;
return markRet;
}


@CSDN


最新回复 (0)
返回
零下一度
主题数
928
帖子数
0
注册排名
1