外观
OpenCV-OpenCVSharp库
- 选择OpenCvSharp4.windows,这个是将OpenCvSharp4和OpenCvSharp4.runtime.win两个包整合到了一起。
API
Mat img = Cv2.ImRead($@"bop.jpg");//根据路径读取
Mat immm = Cv2.ImDecode();//获取内存图像数据
Mat grayimg = new Mat();
Cv2.CvtColor(img, grayimg, ColorConversionCodes.BGR2GRAY);//转灰度图
Mat equ = new Mat();
Cv2.EqualizeHist(grayimg, equ);
//equ.ShowImage("直方均衡");
Mat binaryimg = new Mat();
Cv2.Threshold(equ, binaryimg, 95, 255, ThresholdTypes.BinaryInv);
binaryimg.ShowImage("二值");
Mat dilate = new Mat();
Cv2.Dilate(binaryimg, dilate, kernel);
dilate.ShowImage("腐蚀");
Mat erode = new Mat();
Cv2.Erode(dilate, erode, kernel);
erode.ShowImage("膨胀");
//寻找轮廓、绘制轮廓
Scalar[] colors = { new Scalar(255, 0, 0), new Scalar(0, 255, 0), new Scalar(0, 0, 255) };
OpenCvSharp.Point[][] contours;
Cv2.FindContours(erode, out contours, out _, RetrievalModes.External, ContourApproximationModes.ApproxSimple, null);
for (int i = 0; i < contours.Length; i++)
{
var contour = contours[i];
if (contour.Length > 1000)
{
Cv2.DrawContours(img, new Point[][] { contour }, -1, colors[i % colors.Length], 2, LineTypes.Link8);
Rect rect = Cv2.BoundingRect(contour);
Mat roi = new Mat(img, rect);
roi.ShowImage("ROI");
}
}
//直方图|归一
Mat hist = new Mat();
Rangef[] rangefss = new Rangef[] { new Rangef(0, 256) };
Cv2.CalcHist(new Mat[] { grayimg }, channels0, new Mat(), hist, 1, histSize, rangefss);//直方
Cv2.Normalize(hist, hist);//归一
float v = hist.Get<float>(index);