EMGU.CV进阶 (一、银行卡识别)

一、效果

识别出银行卡上的数字,并显示
注:本文所用所有知识,均在入门系列提到过
原图:
在这里插入图片描述
效果:
在这里插入图片描述

二、模板制作

目的,将10个数分成10个模板

2.1 加载模板

在这里插入图片描述

var imgTemplate = new Mat("NumberTemplate.png");
CvInvoke.Imshow("template", imgTemplate);

2.2 转为灰度

在这里插入图片描述

var imgTemplateGray = new Mat();
CvInvoke.CvtColor(imgTemplate, imgTemplateGray, ColorConversion.Bgr2Gray);
CvInvoke.Imshow("template Gray", imgTemplateGray);

2.3 阈值

在这里插入图片描述

var imgThreshold = new Mat();
CvInvoke.Threshold(imgTemplateGray, imgThreshold, 10, 255, ThresholdType.BinaryInv);
CvInvoke.Imshow("imgThreshold", imgThreshold);

2.4 轮廓检测

在这里插入图片描述

VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
var hierarchy = new Mat();
CvInvoke.FindContours(imgThreshold, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
//RetrType.External 只检测外轮廓, 2. ChainApproxMethod.ChainApproxSimple 只保留终点坐标
var img0 = imgTemplate.Clone();
CvInvoke.DrawContours(img0, contours, -1, new MCvScalar(0, 0, 255), 2);
CvInvoke.Imshow("imgContours", img0);

2.5 轮廓排序

一个简单的冒泡排序,根据其X坐标的大小,将轮廓从左到右一一对应:

var array = contours.ToArrayOfArray();
for (int i = 0; i < contours.Size - 1; i++)
{for (int j = 0; j < contours.Size - i - 1; j++)if (array[j][0].X > array[j + 1][0].X){var temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}
}
var img1 = imgTemplate.Clone();
VectorOfVectorOfPoint contoursSorted = new VectorOfVectorOfPoint(array);
CvInvoke.DrawContours(img1, contoursSorted, -1, new MCvScalar(0, 0, 255), 2);
CvInvoke.Imshow("imgContours2", img1);

2.6 计算外接矩形

在这里插入图片描述

 Rectangle[] rects = new Rectangle[contours.Size];for (int i = 0; i < contoursSorted.Size; i++){rects[i] = CvInvoke.BoundingRectangle(contoursSorted[i]);}var img2 = imgTemplate.Clone();CvInvoke.Rectangle(img2, rects[3], new MCvScalar(0, 0, 255), 2);CvInvoke.Rectangle(img2, rects[4], new MCvScalar(0, 0, 255), 2);CvInvoke.Imshow("imgContours3", img2);

2.7 模板裁剪

将模板裁剪为10个类似下图的小模板
在这里插入图片描述

 VectorOfMat imgTemplates = new VectorOfMat();foreach (var r in rects){var mat = new Mat(imgTemplateGray, r);imgTemplates.Push(mat);}CvInvoke.Imshow("imgTemplate3", imgTemplates[3]);

三、银行卡操作

3.1 读取银行卡

在这里插入图片描述

3.2 转为灰度

在这里插入图片描述

var imgCardGray = new Mat();
CvInvoke.CvtColor(imgCard, imgCardGray, ColorConversion.Bgr2Gray);
CvInvoke.Imshow("CardGray", imgCardGray);

3.3 阈值

在这里插入图片描述

 var imgCardThreshold = new Mat();
CvInvoke.Threshold(imgCardGray, imgCardThreshold, 0, 255, ThresholdType.Otsu | ThresholdType.Binary);
CvInvoke.Imshow("imgCardThreshold", imgCardThreshold);

3.4 顶帽

在这里插入图片描述

var rectKernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(9, 3), new Point(-1, -1));
var imgTophat = new Mat();
CvInvoke.MorphologyEx(imgCardThreshold, imgTophat, MorphOp.Tophat, rectKernel, new Point(-1, -1), 1, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("tophat", imgTophat);

3.5 sobel

在这里插入图片描述

var imgSobel = new Mat();
CvInvoke.Sobel(imgTophat, imgSobel, DepthType.Cv32F, 1, 0, -1);
CvInvoke.ConvertScaleAbs(imgSobel, imgSobel, 1, 0);
CvInvoke.Imshow("sobel", imgSobel);

3.6 闭运算

在这里插入图片描述

var imgClose = new Mat();
CvInvoke.MorphologyEx(imgSobel, imgClose, MorphOp.Close, rectKernel, new Point(-1, -1), 4, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Close", imgClose);

3.7 查找轮廓

在这里插入图片描述

VectorOfVectorOfPoint cardContours = new VectorOfVectorOfPoint();
var cardHierarchy = new Mat();
CvInvoke.FindContours(imgClose, cardContours, cardHierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
// RetrType.External 只检测外轮廓, 2. ChainApproxMethod.ChainApproxSimple 只保留终点坐标
var imgCardContours = imgCard.Clone();
CvInvoke.DrawContours(imgCardContours, cardContours, -1, new MCvScalar(0, 0, 255), 2);
CvInvoke.Imshow("imgCardContours", imgCardContours);

3.8 过滤轮廓

在这里插入图片描述

int CardRectCount = 4;
Rectangle[] cardRects = new Rectangle[CardRectCount];
CardRectCount = 0;
var imgCardTest = imgCard.Clone();
for (int i = 0; i < cardContours.Size; i++)
{var rect = CvInvoke.BoundingRectangle(cardContours[i]);var radio = rect.Width / (double)rect.Height;if (radio > 2.5 && radio < 4.0 && rect.Height > 20){cardRects[CardRectCount] = rect;CvInvoke.Rectangle(imgCardTest, rect, new MCvScalar(0, 0, 255), 2);CvInvoke.Imshow("imgCardTest", imgCardTest);CardRectCount++;}
}

3.9 轮廓排序

在这里插入图片描述

for (int i = 0; i < cardRects.Length - 1; i++)
{for (int j = 0; j < cardRects.Length - i - 1; j++)if (cardRects[j].X > cardRects[j + 1].X){var temp = cardRects[j + 1];cardRects[j + 1] = cardRects[j];cardRects[j] = temp;}
}
var imgcard1 = imgCard.Clone();
CvInvoke.Rectangle(imgcard1, cardRects[0], new MCvScalar(0, 0, 255), 2);
CvInvoke.Rectangle(imgcard1, cardRects[1], new MCvScalar(0, 0, 255), 2);
CvInvoke.Imshow("imgContours2", imgcard1);

四、模板匹配

4.1 裁剪轮廓

在这里插入图片描述

VectorOfMat cardResizes = new VectorOfMat();
foreach(var rect in cardRects) { // 裁剪四个轮廓var mat= new Mat(imgCardGray,new Rectangle(rect.X-5,rect.Y-5,rect.Width+10,rect.Height+10) );cardResizes.Push(mat);
}
CvInvoke.Imshow("cardResizes[2]", cardResizes[2]);

4.2 裁剪数字

在这里插入图片描述

VectorOfMat NumberVector =  new VectorOfMat();
for(int i = 0; i < cardResizes.Size; i++)
{// 二值化阈值var th = new Mat();CvInvoke.Threshold(cardResizes[i], th, 0, 255, ThresholdType.Binary | ThresholdType.Otsu);// CvInvoke.Imshow("t", th);// 查找轮廓VectorOfVectorOfPoint c = new VectorOfVectorOfPoint();var h = new Mat();CvInvoke.FindContours(th, c, h, RetrType.External, ChainApproxMethod.ChainApproxSimple);// RetrType.External 只检测外轮廓, 2. ChainApproxMethod.ChainApproxSimple 只保留终点坐标var imgTemp = cardResizes[i].Clone();CvInvoke.DrawContours(imgTemp, c, -1, new MCvScalar(0, 0, 0), 2);// CvInvoke.Imshow("c", imgTemp);// 计算外接矩形Rectangle[] rs = new Rectangle[4];for (int j = 0; j < c.Size; j++){rs[j] = CvInvoke.BoundingRectangle(c[j]);}// 排序外接矩形for (int x = 0; x < rs.Length - 1; x++){for (int y = 0; y < rs.Length - x - 1; y++)if (rs[y].X > rs[y + 1].X){var temp = rs[y + 1];rs[y + 1] = rs[y];rs[y] = temp;}}// 裁剪数字foreach (var r in rs) {NumberVector.Push(new Mat(cardResizes[i],r));}
}
CvInvoke.Imshow("NumberVector[2]", NumberVector[2]);

4.3 匹配数字

double minLoc = 0, maxLoc = 0;
Point minPoint = new Point();
Point maxPoint = new Point();
int[] result = new int[16];
double[] score = new double[16];
for (int i = 0; i < 16; i++)
{CvInvoke.Threshold(NumberVector[i], NumberVector[i], 0, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);CvInvoke.Resize(NumberVector[i], NumberVector[i], new Size(20, 40));for (int j = 0; j < imgTemplates.Size; j++) {var res = new Mat();CvInvoke.Resize(imgTemplates[j], imgTemplates[j], new Size(20, 40));CvInvoke.MatchTemplate(NumberVector[i], imgTemplates[j], res, TemplateMatchingType.Ccoeff);CvInvoke.MinMaxLoc(res, ref minLoc, ref maxLoc, ref minPoint, ref maxPoint);if (score[i] < maxLoc) {score[i] = maxLoc;result[i] = j;}}}

五、最终显示

5.1 绘制选择框

在这里插入图片描述

var display = imgCard.Clone();
foreach (var r in cardRects)
{CvInvoke.Rectangle(display, r, new MCvScalar(0, 0, 255), 2);}

5.2 显示数字

在这里插入图片描述

for (int i = 0; i < 16; i++) {CvInvoke.PutText(display, result[i].ToString(), new Point(cardRects[0].X+i*20+i/4*50+10,    cardRects[0].Y-10), FontFace.HersheyTriplex, 1, new MCvScalar(0, 0, 255),2);
}CvInvoke.Imshow("result", display);

六、完整代码

// 一、模板操作
// 1. 读取模板
var imgTemplate = new Mat("NumberTemplate.png");
//CvInvoke.Imshow("template", imgTemplate);// 2. 转换为灰度
var imgTemplateGray = new Mat();
CvInvoke.CvtColor(imgTemplate, imgTemplateGray, ColorConversion.Bgr2Gray);
//CvInvoke.Imshow("template Gray", imgTemplateGray);// 3. 阈值
var imgThreshold = new Mat();
CvInvoke.Threshold(imgTemplateGray, imgThreshold, 10, 255, ThresholdType.BinaryInv);
//CvInvoke.Imshow("imgThreshold", imgThreshold);// 4. 轮廓检测
VectorOfVectorOfPoint contours = new VectorOfVectorOfPoint();
var hierarchy = new Mat();
CvInvoke.FindContours(imgThreshold, contours, hierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
//RetrType.External 只检测外轮廓, 2. ChainApproxMethod.ChainApproxSimple 只保留终点坐标
var img0 = imgTemplate.Clone();
CvInvoke.DrawContours(img0, contours, -1, new MCvScalar(0, 0, 255), 2);
// CvInvoke.Imshow("imgContours", img0);// 5. 轮廓排序
var array = contours.ToArrayOfArray();
for (int i = 0; i < contours.Size - 1; i++)
{for (int j = 0; j < contours.Size - i - 1; j++)if (array[j][0].X > array[j + 1][0].X){var temp = array[j + 1];array[j + 1] = array[j];array[j] = temp;}
}
var img1 = imgTemplate.Clone();
VectorOfVectorOfPoint contoursSorted = new VectorOfVectorOfPoint(array);
CvInvoke.DrawContours(img1, contoursSorted, -1, new MCvScalar(0, 0, 255), 2);
// CvInvoke.Imshow("imgContours2", img1);// 6. 计算外接矩形
Rectangle[] rects = new Rectangle[contours.Size];
for (int i = 0; i < contoursSorted.Size; i++)
{rects[i] = CvInvoke.BoundingRectangle(contoursSorted[i]);
}
var img2 = imgTemplate.Clone();
CvInvoke.Rectangle(img2, rects[3], new MCvScalar(0, 0, 255), 2);
CvInvoke.Rectangle(img2, rects[4], new MCvScalar(0, 0, 255), 2);
//CvInvoke.Imshow("imgContours3", img2);// 7. 模板裁剪
VectorOfMat imgTemplates = new VectorOfMat();
foreach (var r in rects)
{var mat = new Mat(imgTemplateGray, r);imgTemplates.Push(mat);
}
//CvInvoke.Imshow("imgTemplate3", imgTemplates[3]);
// CvInvoke.Imshow("imgTemplate5", imgTemplates[5]);// 二、银行卡操作
// 2.1 读取银行卡
var imgCard = new Mat("Card1.png");
CvInvoke.Imshow("card", imgCard);// 2.2 转为灰度
var imgCardGray = new Mat();
CvInvoke.CvtColor(imgCard, imgCardGray, ColorConversion.Bgr2Gray);
CvInvoke.Imshow("CardGray", imgCardGray);// 2.3 阈值
var imgCardThreshold = new Mat();
CvInvoke.Threshold(imgCardGray, imgCardThreshold, 0, 255, ThresholdType.Otsu | ThresholdType.Binary);
CvInvoke.Imshow("imgCardThreshold", imgCardThreshold);// 2.4 顶帽操作
var rectKernel = CvInvoke.GetStructuringElement(ElementShape.Rectangle, new Size(9, 3), new Point(-1, -1));
var imgTophat = new Mat();
CvInvoke.MorphologyEx(imgCardThreshold, imgTophat, MorphOp.Tophat, rectKernel, new Point(-1, -1), 1, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("tophat", imgTophat);// 2.5 sobel
var imgSobel = new Mat();
CvInvoke.Sobel(imgTophat, imgSobel, DepthType.Cv32F, 1, 0, -1);
CvInvoke.ConvertScaleAbs(imgSobel, imgSobel, 1, 0);
CvInvoke.Imshow("sobel", imgSobel);// 2.6 闭运算
var imgClose = new Mat();
CvInvoke.MorphologyEx(imgSobel, imgClose, MorphOp.Close, rectKernel, new Point(-1, -1), 4, BorderType.Default, new MCvScalar());
CvInvoke.Imshow("Close", imgClose);// 2.7 查找轮廓
VectorOfVectorOfPoint cardContours = new VectorOfVectorOfPoint();
var cardHierarchy = new Mat();
CvInvoke.FindContours(imgClose, cardContours, cardHierarchy, RetrType.External, ChainApproxMethod.ChainApproxSimple);
// RetrType.External 只检测外轮廓, 2. ChainApproxMethod.ChainApproxSimple 只保留终点坐标
var imgCardContours = imgCard.Clone();
CvInvoke.DrawContours(imgCardContours, cardContours, -1, new MCvScalar(0, 0, 255), 2);
CvInvoke.Imshow("imgCardContours", imgCardContours);// 2.8 过滤轮廓
int CardRectCount = 4;
Rectangle[] cardRects = new Rectangle[CardRectCount];
CardRectCount = 0;
var imgCardTest = imgCard.Clone();
for (int i = 0; i < cardContours.Size; i++)
{var rect = CvInvoke.BoundingRectangle(cardContours[i]);var radio = rect.Width / (double)rect.Height;if (radio > 2.5 && radio < 4.0 && rect.Height > 20){cardRects[CardRectCount] = rect;CvInvoke.Rectangle(imgCardTest, rect, new MCvScalar(0, 0, 255), 2);CvInvoke.Imshow("imgCardTest", imgCardTest);CardRectCount++;}
}// 2.9 轮廓排序
for (int i = 0; i < cardRects.Length - 1; i++)
{for (int j = 0; j < cardRects.Length - i - 1; j++)if (cardRects[j].X > cardRects[j + 1].X){var temp = cardRects[j + 1];cardRects[j + 1] = cardRects[j];cardRects[j] = temp;}
}
var imgcard1 = imgCard.Clone();
CvInvoke.Rectangle(imgcard1, cardRects[0], new MCvScalar(0, 0, 255), 2);
CvInvoke.Rectangle(imgcard1, cardRects[1], new MCvScalar(0, 0, 255), 2);
CvInvoke.Imshow("imgContours2", imgcard1);// 三、轮廓匹配
// 3.1 裁剪轮廓
VectorOfMat cardResizes = new VectorOfMat();
foreach(var rect in cardRects) { // 裁剪四个轮廓var mat= new Mat(imgCardGray,new Rectangle(rect.X-5,rect.Y-5,rect.Width+10,rect.Height+10) );cardResizes.Push(mat);
// CvInvoke.Imshow("c",mat);}
CvInvoke.Imshow("cardResizes[2]", cardResizes[2]);
// 3.2 裁剪每一个数字
VectorOfMat NumberVector =  new VectorOfMat();
for(int i = 0; i < cardResizes.Size; i++)
{// 二值化阈值var th = new Mat();CvInvoke.Threshold(cardResizes[i], th, 0, 255, ThresholdType.Binary | ThresholdType.Otsu);
// CvInvoke.Imshow("t", th);// 查找轮廓VectorOfVectorOfPoint c = new VectorOfVectorOfPoint();var h = new Mat();CvInvoke.FindContours(th, c, h, RetrType.External, ChainApproxMethod.ChainApproxSimple);// RetrType.External 只检测外轮廓, 2. ChainApproxMethod.ChainApproxSimple 只保留终点坐标var imgTemp = cardResizes[i].Clone();CvInvoke.DrawContours(imgTemp, c, -1, new MCvScalar(0, 0, 0), 2);
// CvInvoke.Imshow("c", imgTemp);// 计算外接矩形Rectangle[] rs = new Rectangle[4];for (int j = 0; j < c.Size; j++){rs[j] = CvInvoke.BoundingRectangle(c[j]);}// 排序外接矩形for (int x = 0; x < rs.Length - 1; x++){for (int y = 0; y < rs.Length - x - 1; y++)if (rs[y].X > rs[y + 1].X){var temp = rs[y + 1];rs[y + 1] = rs[y];rs[y] = temp;}}// 裁剪数字foreach (var r in rs) {NumberVector.Push(new Mat(cardResizes[i],r));}
}
CvInvoke.Imshow("NumberVector[2]", NumberVector[2]);
// 3.3 匹配数字
double minLoc = 0, maxLoc = 0;
Point minPoint = new Point();
Point maxPoint = new Point();
int[] result = new int[16];
double[] score = new double[16];
for (int i = 0; i < 16; i++)
{CvInvoke.Threshold(NumberVector[i], NumberVector[i], 0, 255, ThresholdType.BinaryInv | ThresholdType.Otsu);CvInvoke.Resize(NumberVector[i], NumberVector[i], new Size(20, 40));NumberVector[i].Save($"0{i}.jpg");for (int j = 0; j < imgTemplates.Size; j++) {var res = new Mat();CvInvoke.Resize(imgTemplates[j], imgTemplates[j], new Size(20, 40));imgTemplates[j].Save($"1_{j}.jpg");CvInvoke.MatchTemplate(NumberVector[i], imgTemplates[j], res, TemplateMatchingType.Ccoeff);CvInvoke.MinMaxLoc(res, ref minLoc, ref maxLoc, ref minPoint, ref maxPoint);if (score[i] < maxLoc) {score[i] = maxLoc;result[i] = j;}}}// 四、 最终显示
var display = imgCard.Clone();
// 4.1 绘制选择框
foreach (var r in cardRects)
{CvInvoke.Rectangle(display, r, new MCvScalar(0, 0, 255), 2);}
CvInvoke.Imshow("result1", display);
// 4.2 显示数字
for (int i = 0; i < 16; i++) {CvInvoke.PutText(display, result[i].ToString(), new Point(cardRects[0].X+i*20+i/4*50+10, cardRects[0].Y-10), FontFace.HersheyTriplex, 1, new MCvScalar(0, 0, 255),2);
}CvInvoke.Imshow("result", display);CvInvoke.WaitKey(0);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/60608.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

OpenCV之识别银行卡号

一、简介 利用OpenCV所学的简单基础&#xff08;点我进入&#xff09;&#xff0c;制作一个识别银行卡号的程序。 也可以由深度学习来完成这个任务&#xff0c;具体可以参考: 项目1. PPOCRLabel半自动工具标注自制身份证数据集项目2. 基于OCR身份证号码识别全流程 结果输出如…

Coremail专家观点:如何应对当前AI技术对邮件安全的影响

近日&#xff0c;ChatGPT在互联网上掀起了一阵热潮&#xff0c;目前月活用户超过 1 亿&#xff0c;注册用户之多导致服务器一度爆满。 人工智能的话题遍地可见&#xff0c;如“ChatGPT会取代哪些行业&#xff1f;”、“ChatGPT的实现原理”、“ChatGPT的玩转攻略”等等&#x…

对话式AI系列:任务型多轮对话的实践与探索

移动互联网带来了大数据的普及&#xff0c;摩尔定律预言了计算机硬件的发展&#xff0c;深度学习则借助这阵东风实现了技术上的突破&#xff0c;人工智能成功进入大众视野&#xff0c;并改变了人们的日常生活。 “小X同学&#xff0c;请打开电视”、“小X小X&#xff0c;请播放…

晋飞碳纤科创板IPO被终止:曾拟募资近6亿 凯辉基金是股东

雷递网 雷建平 5月9日 上海晋飞碳纤科技股份有限公司&#xff08;简称&#xff1a;“晋飞碳纤”&#xff09;日前IPO被终止。晋飞碳纤是2022年12月底递交招股书&#xff0c;曾准备在科创板上市。 晋飞碳纤原计划募资5.89亿元&#xff0c;其中&#xff0c;3.2亿元用于高性能复合…

三大部门七场面试,终拿字节AI NLP 算法offer

作者 | Maxxiel 编辑 | NewBeeNLP 面试锦囊之面经分享系列&#xff0c;持续更新中 后台回复『面试』加入讨论组交流噢 写在前面 背景美本cs英硕ai在读&#xff0c;无paper无实习无研究无比赛。方向是深度学习、nlp&#xff0c;项目主要是情感分析 和模型蒸馏。leetcode 刷了…

【论文阅读】空间圆形拟合检测新方法

目录 1、空间圆拟合模型1.1、空间平面拟合1.2、空间圆拟合 2、参考文献3、算法伪码4、算法结果 摘 要 根据空间圆中任意两条弦所对应的中垂面与空间圆所处的平面必然相交且交点即为圆心这一空间圆特性&#xff0c;利用空间向量按照最小二乘法推导出圆心计算方程&#xff0c;按照…

海外硕士苏明哲回国后哀叹:我美本英硕,找不到工作很难受

推荐阅读&#xff1a; 欢迎加入我们的架构师社群 阿里跳槽拼多多&#xff0c;80万年薪涨到160万&#xff0c;值不值得去&#xff1f; 一名海外留学生回国后找工作&#xff0c;却屡受打击&#xff0c;感慨自己美本英硕&#xff0c;却找不到工作&#xff0c;内心真的很难受&#…

玩转AI绘图 电脑配置怎么选?

大家好&#xff0c;我是网媒智星&#xff0c;很多小伙伴留言想了解一下AI绘图相关知识&#xff0c;那么&#xff0c;想要玩转AI绘图&#xff0c;电脑配置该怎么选呢&#xff1f; 首先我们了解一下什么叫AI绘图&#xff1f; AI绘图指的是利用人工智能技术实现的自动绘图&#x…

chatgpt赋能python:Python做图:一个强大而灵活的工具

Python做图&#xff1a;一个强大而灵活的工具 Python是一个流行的编程语言, 越来越多的人开始使用它进行数据分析和可视化。 Python做图的功能非常强大&#xff0c;使得它成为许多人的首选工具。在这篇文章中, 我们将讨论 Python做图及其SEO优化。 Python做图的优势 Python做…

人工智能基础部分19-强化学习的原理和简单应用,一看就懂

大家好&#xff0c;我是微学AI&#xff0c;今天给大家介绍一下人工智能基础部分19-强化学习的原理和简单应用&#xff0c;随着人工智能的不断发展&#xff0c;各种新兴技术不断涌现。作为人工智能的一个重要分支&#xff0c;强化学习近年来受到了广泛关注。本文将介绍强化学习的…

TT语音:游戏社交乱象难平

游戏在人们生活中占据的时间越来越多&#xff0c;用户对游戏内的体验也愈发的丰富&#xff0c;有时候和朋友三五结队打几把王者荣耀&#xff0c;但大部分玩家是处于一个人玩游戏的状态&#xff0c;而这种状态也影射了当前Z世代的孤独状态。 人在孤独后会产生强烈的社交需求&am…

Android(仿QQ登入+网易新闻)

文章目录 场景内容&#xff1a;效果参考 场景 提示&#xff1a;基于期末作业开发&#xff08;自增轮播图&#xff09; 自评&#xff1a;效果蛮丑的&#xff0c;功能都在&#xff0c;仅供参考&#xff01; 内容&#xff1a; 一&#xff0c;引导页 1&#xff0c;设计引导页Log…

运维有趣项目:搭建个人博客安全版(Appache2.4防盗链与防泄漏,防盗链httpd.conf无Load,include版)

这次算是呕心沥血了,网上的防盗链文章简直一个模子的,全部都是采用httpd.conf修改LoadModule rewrite_module modules/mod_rewrite.so或是httpd-default.conf,可是我用阿里云自动搭建的apache环境压根就没有啊,如果有相同经历的,可以看这篇文章,希望留下评论,给个鼓励不,QAQ,域…

chatgpt赋能python:Python打包成手机可执行文件指南

Python 打包成手机可执行文件指南 作为一名有着10年Python编程经验的工程师&#xff0c;我认为将Python打包成手机可执行文件是一项非常有用的技能。在这篇文章中&#xff0c;我将介绍Python打包成手机可执行文件的重要性&#xff0c;以及如何使用PyInstaller工具轻松打包Pyth…

优酷“首月1元”会员引争议:取消续费却被扣24元;马斯克欲在推特建立支付系统,并包含加密货币功能;Deno 1.3发布|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

chatgpt赋能python:Python多个%d在SEO中的应用

Python多个%d在SEO中的应用 在当今的互联网时代&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;已经成为了每个网站的重要任务之一。而在Python编程中&#xff0c;有一个非常常见的占位符%d&#xff0c;用来替代一个整数。在本文中&#xff0c;我们将介绍Python中多个%d…

38年来,NBA最有价值球员|数据分析

使用工具:Ipython notebook/Anacoda-Spyder 使用的库:Pandas,Matplotlib,Seaborn Python版本:Py3.6 1 数据来源 1).本次用到的数据 来源于https://www.basketball-reference.com/awards/mvp.html,其中可以选择多种形式,我选的是CSV格式,方便后面的数据分析,(文末会分享…

kaggle:谁是NBA最佳防守球员?(二)

接着前几天发的关于kaggle中NBA球员投篮数据探索性数据分析和可视化分析之后&#xff0c;小编本打算对这13万的投篮数据跑几个机器学习模型预测一下投篮的&#xff0c;可是电脑内存不给力&#xff0c;试了几次之后便作罢了。还打算第一次试一下kaggle上被传的神乎其技的大杀器x…

篮球中各个位置的名称及介绍…

正规篮球比赛是5对5&#xff0c;赛场上分布着五个篮球位置&#xff0c;分别是&#xff1a;中锋&#xff08;C&#xff09;、大前锋&#xff08;PF&#xff09;、小前锋&#xff08;SF&#xff09;、得分后卫&#xff08;SG&#xff09;、控球后卫&#xff08;PG&#xff09; 来…

几行代码,GPT-3变ChatGPT!吴恩达高徒、华人CEO震撼发布Lamini引擎

点击下方卡片&#xff0c;关注“CVer”公众号 AI/CV重磅干货&#xff0c;第一时间送达 点击进入—>【计算机视觉】微信技术交流群 转载自&#xff1a;新智元 | 编辑&#xff1a;Aeneas 好困 【导读】这个全新发布的Lamini引擎&#xff0c;大大拉低了模型训练的门槛&#xff…