输入路径直接调用,需改region5的mask区域,加入了模板定位和mask,主体是regionP0那里
public Point Center(string str)
{
OpenCvSharp.Mat oriPic = Cv2.ImRead(str);
OpenCvSharp.Mat src1 = Cv2.ImRead(str);
Mat tempImg_path = Cv2.ImRead(operatelog.tmpicPath + "5x7.png");
//tempImg_path = tempImg_path.Resize(new Size(tempImg_path.Width / 6, tempImg_path.Height / 6));
OpenCvSharp.Mat gray = new OpenCvSharp.Mat(), binary = new OpenCvSharp.Mat(), vline = new OpenCvSharp.Mat();
double wh = double.Parse(src1.Width.ToString()) / double.Parse(src1.Height.ToString());
Size size = new Size(src1.Width / 3, (src1.Width / 3) / wh);
gray = src1.Resize(size);
vline = gray;
var w = vline.Width / 3;
var h = vline.Height / 4;
//Cv2.ImShow("gray", gray);
//其他
#region 5
OpenCvSharp.Point point17 = new OpenCvSharp.Point(w * 1.3, h * 1.75);//左上
OpenCvSharp.Point point18 = new OpenCvSharp.Point(w * 1.75, h * 1.75);//右上
OpenCvSharp.Point point19 = new OpenCvSharp.Point(w * 1.3, h * 2.2);//左下
OpenCvSharp.Point point20 = new OpenCvSharp.Point(w * 1.75, h * 2.2);//右下
#endregion
OpenCvSharp.Point[] poi5 = { point17, point18, point20, point19 };
List<Point[]> pListAll = new List<Point[]>() { poi5 };
OpenCvSharp.Mat invertedMask = new OpenCvSharp.Mat();
OpenCvSharp.Mat mask = OpenCvSharp.Mat.Zeros(vline.Size(), MatType.CV_8U);
Cv2.DrawContours(mask, new[] { poi5 }, -1, new Scalar(255), -1);
//Cv2.ImShow(2.ToString(), mask);
Cv2.BitwiseAnd(vline, vline, invertedMask, mask: mask);//实现遮罩//
//Cv2.ImShow("invertedMask", invertedMask);
#region 模板匹配
// 读取输入图像和模板图像
Mat srcImage = invertedMask;
Mat tempImage = tempImg_path;
// 创建用于存储模板和匹配结果的图像
Mat result = new Mat();
// 使用模板匹配方法进行匹配,这里使用归一化相关系数匹配法
Cv2.MatchTemplate(srcImage, tempImage, result, TemplateMatchModes.CCoeffNormed);
// 获取匹配结果中的最小值、最大值以及对应的位置
double minVal, maxVal;
OpenCvSharp.Point minLoc, maxLoc;
Cv2.MinMaxLoc(result, out minVal, out maxVal, out minLoc, out maxLoc);
// 获取最佳匹配的位置
OpenCvSharp.Point matchLoc = maxLoc;
// 在输入图像上用绿色矩形框标记匹配的位置
Cv2.Rectangle(srcImage, matchLoc, new OpenCvSharp.Point(matchLoc.X + tempImage.Cols, matchLoc.Y + tempImage.Rows), Scalar.Green, 2);
#endr