保钠

  博客园 :: 首页 :: 博问 :: 闪存 :: 新随笔 :: 联系 :: 订阅 订阅 :: 管理 ::

继上篇健康码的文章,其中判断二维码是否绿码的方法ImageToMatExistGreen黄绿码互相识别问题。

在对比之后发现,手机端健康码的颜色是正常,但截图上传到PC端之后,放大图片,会发现:

黄码中会带有很多绿色的点;绿码中也有零星的黄色点;

通过图像二值化对比后确实存在:

绿码中针对color黄 二值化之后如图1,黄码中color绿 二值化之后如图2:

      

                图 1                                    图 2

于是就找到了黄码绿码能互相识别的原因了。

我们可以通过计算来判断是否绿码,修改方法如下:

public bool ImageToMatExistGreen2(Image cutImage)
{
  Bitmap bm = new Bitmap(cutImage);
  Mat srcImg = OpenCvSharp.Extensions.BitmapConverter.ToMat(bm);
  Mat hsvImage = new Mat();
  Cv2.CvtColor(srcImg, hsvImage, ColorConversionCodes.BGR2HSV);
  Mat maskGreen = new Mat();
  Mat maskYellow = new Mat();

  bool green = false;
  int greenNum = 0;
  int yellownum = 0;
  Cv2.InRange(hsvImage, new Scalar(35, 43, 46), new Scalar(77, 255, 255), maskGreen);//绿
  Bitmap bitmapGreen = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(maskGreen);
  bitmapGreen.Save(@"QRcodeImg\bitMapGreen.png");
  for (int r = 0; r < hsvImage.Rows; r++)
  {
    for (int c = 0; c < hsvImage.Cols; c++)
    {
      if (maskGreen.At<byte>(r, c) == 255)
      {
        greenNum++;
      }
    }
  }
  Cv2.InRange(hsvImage, new Scalar(26, 43, 46), new Scalar(34, 255, 255), maskYellow);//黄
  Bitmap bitmapYellow = OpenCvSharp.Extensions.BitmapConverter.ToBitmap(maskYellow);
  bitmapYellow.Save(@"QRcodeImg\bitMapYellow.png");
  for (int r = 0; r < hsvImage.Rows; r++)
  {
    for (int c = 0; c < hsvImage.Cols; c++)
    {
      if (maskYellow.At<byte>(r, c) == 255)
      {
        yellownum++;
      }
    }
  }

  return green = greenNum > yellownum ? true : false;
}

没有情调,不懂浪漫,但朴实无华拥有爱。

 

posted on 2022-07-18 09:37  保钠  阅读(557)  评论(2编辑  收藏  举报