继上篇健康码的文章,其中判断二维码是否绿码的方法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;
}
没有情调,不懂浪漫,但朴实无华拥有爱。