ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

C#之二维码生成 · 图像文本识别 · 图像二维码识别和裁剪

2022-07-15 10:03:11  阅读:217  来源: 互联网

标签:Mat int bmp qrCodeEncoder 二维码 图像 new 识别


在NuGet程序包中查询添加以下内容(二维码和图片处理,可酌情安装):

OpenCvSharp4.Extensions
OpenCvSharp4.Windows
ThoughtWorks.QRCode.Standard
ZXing.Net
Spire.OCR

二维码生成相关方法:

/// <summary>
/// 生成二维码:根据传进去的数据 生成二维码
/// </summary>
/// <param name="data">用于生成二维码的数据</param>
/// <returns></returns>
public static Image GenerateQRCode(String data)
{
//创建编码器,设置编码格式。Byte格式的编码,只要能转成Byte的数据,都可以进行编码,比如中文。NUMERIC 只能编码数字。
QRCodeEncoder qrCodeEncoder = new QRCodeEncoder();
qrCodeEncoder.QRCodeEncodeMode = QRCodeEncoder.ENCODE_MODE.BYTE;

//大小,值越大生成的二维码图片像素越高
qrCodeEncoder.QRCodeScale = 5;

//版本,设置为0主要是防止编码的字符串太长时发生错误
qrCodeEncoder.QRCodeVersion = 0;

//生成二维码 Bitmap
qrCodeEncoder.QRCodeErrorCorrect = QRCodeEncoder.ERROR_CORRECTION.L;//错误效验、错误更正(有4个等级)
qrCodeEncoder.QRCodeBackgroundColor = Color.White;//背景色
qrCodeEncoder.QRCodeForegroundColor = Color.Black;//前景色
var pbImg = qrCodeEncoder.Encode(data, Encoding.UTF8);
return pbImg;
}

生成Image对象,之后可以转换为不同格式的图片保存

/// <summary>
/// Image图片格式转换(gif/jpg/png/bmp)
/// </summary>
/// <param name="img">Image对象</param>
/// <param name="filePath">保存路径图片名称</param>
/// <returns></returns>
public bool SavePng(Image img, string filePath)
{
try
{
using (var bmp = new Bitmap(img.Width, img.Height))
{
bmp.SetResolution(img.HorizontalResolution, img.VerticalResolution);

using (var g = Graphics.FromImage(bmp))
{
g.Clear(Color.White);
g.DrawImageUnscaled(img, 0, 0);
}

//存储各种格式
//bmp.Save(filePath, System.Drawing.Imaging.ImageFormat.Gif);
//bmp.Save(filePath, System.Drawing.Imaging.ImageFormat.Png);
//bmp.Save(filePath, ImageFormat.Jpeg);
bmp.Save(filePath, ImageFormat.Jpeg);
}

return true;
}
catch(Exception ex)
{
return false;
}
}

二维码识别相关方法:

方法原理:先识别图片中的二维码,获取二维码的坐标,再根据坐标切割

//fileName为图片的路径

public bool CutAreaRQCode(string fileName)
{
Mat src = new Mat(fileName);
OpenCvSharp.Point2f[] points;
QRCodeDetector rqCode = new QRCodeDetector();
rqCode.Detect(src, out points);

Bitmap bm = new Bitmap(fileName);
int width = (int)(points[1].X - points[0].X);
int height = (int)(points[2].Y - points[0].Y);

Bitmap newBm = bm.Clone(new Rectangle((int)points[0].X, (int)points[0].Y, width, height), bm.PixelFormat);
newBm.Save(@"QRcodeImg\rqCode.png");
bool isHaveGreen = ImageToMatExistGreen(newBm);

var color1 = newBm.GetPixel(0, 0);

return isHaveGreen;

}

上述方法中包含了一个判断二维码是否绿码的方法ImageToMatExistGreen,存在一个问题就是黄码也会被识别为绿码,感兴趣的可以深入研究一下:

public bool ImageToMatExistGreen(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 mask = new Mat();

//Canny算法--边缘检测
//Mat src = new Mat(@"QRcodeImg\text2.jpg", ImreadModes.Grayscale);
//Mat result = new Mat();
////Cv2.Blur(src, src, new OpenCvSharp.Size(3, 3));
//Cv2.Canny(src, result, 40, 120, 3);
//result.SaveImage(@"QRcodeImg\testCanny.png");

Cv2.InRange(hsvImage, new Scalar(35, 43, 46), new Scalar(77, 255, 255), mask);
bool green = false;
for (int r = 0; r < hsvImage.Rows; r++)
{
for (int c = 0; c < hsvImage.Cols; c++)
{
if (mask.At<byte>(r, c) == 255)
{
green = true;
}
}
}
return green;
}

识别图像中的文本(特别适合识别车牌等场景)

//读取图片文字信息
public void PicContainSensitiveText(string fileName)
{
try
{
OcrScanner scanner = new OcrScanner();
var res = scanner.Scan(fileName);
string content = scanner.Text.ToString();
catch (Exception ex)
{
}
}

 干净又卫生呀兄弟们

标签:Mat,int,bmp,qrCodeEncoder,二维码,图像,new,识别
来源: https://www.cnblogs.com/UsefulIdiot/p/16480215.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有