本程序只对扑克牌的花色进行训练和识别,对扑克牌上的数字的识别在以后的学习中再进行完善。

本次只是简单的提取了扑克牌的RGB均值、HSV均值、7 个不变矩以及长宽比等14个简单的特征,其中,长宽比为了防止图像的位置等因素的影响,提取了目标区域的最小外接矩形。

部分图像如下图所示:

特征提取的部分代码如下所示:

void CPokeAlgorithmDlg::CollectCharacter(IplImage* img, CvMat* mat, int rows)
{if (img != nullptr){showImage(img, IDC_PIC1);                 //显示图像IplImage* bitImage = nullptr, *grayImage = nullptr, *hsvImage = nullptr;bitImage = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);grayImage = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 1);hsvImage = cvCreateImage(cvGetSize(img), IPL_DEPTH_8U, 3);cvCvtColor(img, hsvImage, CV_RGB2HSV);cvCvtColor(img, grayImage, CV_RGB2GRAY);cvSmooth(grayImage, grayImage, CV_MEDIAN);cvThreshold(grayImage, bitImage, 128, 255.0, CV_THRESH_BINARY);cvNot(bitImage, bitImage);IplConvKernel* element = cvCreateStructuringElementEx(5, 5, 2, 2, CV_SHAPE_ELLIPSE);cvSmooth(bitImage, bitImage, CV_MEDIAN);cvErode(bitImage, bitImage, element, 1);cvDilate(bitImage, bitImage, element, 1);cvReleaseStructuringElement(&element);element = NULL;CvMemStorage* storage = cvCreateMemStorage(0);CvSeq* contour = 0;cvFindContours(bitImage, storage, &contour, sizeof(CvContour), CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);      //轮廓检索for (; contour != 0; contour = contour->h_next){double area = fabs(cvContourArea(contour, CV_WHOLE_SEQ));if (area > 2000)   //此处阈值需重新调节{cvDrawContours(bitImage, contour, cvScalarAll(255), cvScalarAll(255), -1, CV_FILLED, 8);CvRect rect = cvBoundingRect(contour, 0);CvBox2D minRect = cvMinAreaRect2(contour, storage);CvPoint2D32f rectPts[4] = { 0 };cvBoxPoints(minRect, rectPts);int nPts = 4;  // 4 个顶点CvPoint minRectPts[4] = { 0 };for (int i = 0; i < 4; ++i){minRectPts[i] = cvPointFrom32f(rectPts[i]);    //将 cvPoint2D32f 转化为 CvPoint}CvPoint *pt = minRectPts;//在图像中绘制矩形框cvPolyLine(bitImage, &pt, &nPts, 1, 1, cvScalarAll(255), 1);int l1 = sqrtf((pt[0].x - pt[1].x)*(pt[0].x - pt[1].x) + (pt[0].y - pt[1].y)*(pt[0].y - pt[1].y));int l2 = sqrtf((pt[2].x - pt[1].x)*(pt[2].x - pt[1].x) + (pt[2].y - pt[1].y)*(pt[2].y - pt[1].y));int length = l1 > l2 ? l1 : l2;   //取较长边为图形的长int width = l1 > l2 ? l2 : l1;    //取较短边为图形的宽double r = (width * 1.0) / length;   //长宽比cvSetReal2D(mat, rows, 0, r);double RMean = 0, GMean = 0, BMean = 0;double HMean = 0, SMean = 0, VMean = 0;int nCount = 0;for (int imgRow = rect.y; imgRow < rect.y + rect.height; ++imgRow){for (int imgCol = rect.x; imgCol < rect.x + rect.width; ++imgCol){CvScalar s = cvGet2D(bitImage, imgRow, imgCol);if (s.val[0] == 255){s = cvGet2D(img, imgRow, imgCol);RMean += s.val[2];GMean += s.val[1];BMean += s.val[0];s = cvGet2D(hsvImage, imgRow, imgCol);HMean += s.val[0];SMean += s.val[1];VMean += s.val[2];++nCount;}}}// end RGB,HSV forRMean /= nCount;GMean /= nCount;BMean /= nCount;HMean /= nCount;SMean /= nCount;VMean /= nCount;cvSetReal2D(mat, rows, 1, RMean);cvSetReal2D(mat, rows, 2, GMean);cvSetReal2D(mat, rows, 3, BMean);cvSetReal2D(mat, rows, 4, HMean);cvSetReal2D(mat, rows, 5, SMean);cvSetReal2D(mat, rows, 6, VMean);//7个不变矩CvMoments moments;cvMoments(contour, &moments, 1);CvHuMoments  huMoments;cvGetHuMoments(&moments, &huMoments);double hu1 = huMoments.hu1;double hu2 = huMoments.hu2;double hu3 = huMoments.hu3;double hu4 = huMoments.hu4;double hu5 = huMoments.hu5;double hu6 = huMoments.hu6;double hu7 = huMoments.hu7;cvSetReal2D(mat, rows, 7, hu1);cvSetReal2D(mat, rows, 8, hu2);cvSetReal2D(mat, rows, 9, hu3);cvSetReal2D(mat, rows, 10, hu4);cvSetReal2D(mat, rows, 11, hu5);cvSetReal2D(mat, rows, 12, hu6);cvSetReal2D(mat, rows, 13, hu7);}// end if}showImage(hsvImage, IDC_PIC3);showImage(bitImage, IDC_PIC2);//释放内存cvReleaseMemStorage(&storage);storage = nullptr;cvReleaseImage(&bitImage);bitImage = nullptr;cvReleaseImage(&grayImage);grayImage = nullptr;cvReleaseImage(&hsvImage);hsvImage = nullptr;}//释放内存cvReleaseImage(&img);img = nullptr;
}

Bayes训练代码:

Book* book = xlCreateXMLBookW();CvMat* dataMat = NULL;if (book->load(L"Data.xlsx")){Sheet *sheet = book->getSheet(0);int myrow = sheet->lastRow();int mycol = sheet->lastCol();if (sheet){CvMat* importMat = cvCreateMat(myrow, mycol, CV_32FC1);  //存储导入数据for (auto i = 0; i < myrow; ++i){for (auto j = 0; j < mycol; j++){double temp = sheet->readNum(i, j);cvSetReal2D(importMat, i, j, temp);}}// end fordataMat = cvCloneMat(importMat);}// end if}book->release();MessageBox(L"数据导入完成");CvMat* lableMat = cvCreateMat(dataMat->rows, 1, CV_32FC1);     //构建样本的分类标签cvZero(lableMat);for (int i = 0; i < 4; ++i)           //共分了 20 个不同的种类{for (int j = 0; j < 10; ++j)      //每个品种共50个籽粒{cvSetReal2D(lableMat, i * 10 + j, 0, i + 1);}}CvNormalBayesClassifier nbc;nbc.train(dataMat, lableMat);nbc.save("bayes.txt");MessageBox(L"数据训练完成");CvMat* nbcResult = cvCreateMat(dataMat->rows, 1, CV_32FC1);CvMat* nbcRow = NULL;for (int i = 0; i < dataMat->rows; ++i){nbcRow = cvCreateMat(1, dataMat->cols, CV_32FC1);for (int j = 0; j < dataMat->cols; ++j){float temp = cvGetReal2D(dataMat, i, j);cvSetReal2D(nbcRow, 0, j, temp);}unsigned int ret = 0;ret = nbc.predict(nbcRow);cvSetReal2D(nbcResult, i, 0, ret);cvReleaseMat(&nbcRow);nbcRow = NULL;}int nCount = 0;for (int i = 0; i < 4; ++i){for (int j = 0; j < 10; ++j){int ret = cvGetReal2D(nbcResult, i * 10 + j, 0);if (ret == (i + 1)){++nCount;}}}float recognize = 100 * nCount / 10 / 4;CString str;str.Format(L"朴素贝叶斯 识别率为: %f", recognize);str = str + L"%";MessageBox(str);

识别代码如下所示:

CvNormalBayesClassifier nbc;nbc.load("bayes.txt");CFileDialog dlg(TRUE, NULL, NULL, 0, L"图片文件(*.jpg)|*.jpg||");if (dlg.DoModal() == IDOK){USES_CONVERSION;const char* loadPath = W2A(dlg.GetPathName());IplImage* testImage = cvLoadImage(loadPath);CvMat* mat = cvCreateMat(1, 14, CV_32FC1);CollectCharacter(testImage, mat, 0);int  ret = nbc.predict(mat);CString str;switch (ret){case 1:str = L"黑桃";break;case 2:str = "红桃";break;case 3:str = "梅花";break;case 4:str = "方块";break;}AfxMessageBox(str);cvReleaseMat(&mat);mat = NULL;}//end if   

基于朴素贝叶斯的扑克牌花色识别相关推荐

  1. 基于朴素贝叶斯的垃圾邮件识别

    在网上看到很多用朴素贝叶斯算法来实现垃圾邮件分类的,有直接调用库的,也有自己写的.出于对贝叶斯算法的复习,我也想用贝叶斯算法写写邮件识别,做一个简单的识别系统. 一.开发环境 Python3.6,邮件 ...

  2. 基于朴素贝叶斯的手写数字识别

    基于朴素贝叶斯的手写数字识别 关于数据集 关于SIMD 关于python 数据预处理 总结 关于数据集 MNIST数据库(http://www.cs.nyu.edu/~roweis/data.html ...

  3. 朴素贝叶斯网络matlab实现_基于朴素贝叶斯的文本分类方法实战

    基于朴素贝叶斯的文本分类方法 一.朴素贝叶斯原理的介绍 二.朴素贝叶斯分类器的代码实现 分类器有时会产生错误结果,这时可以要求分类器给出一个最优的类别猜测结果,同时会给出这个猜测的概率估计值.朴素贝叶 ...

  4. 基于朴素贝叶斯的垃圾邮件分类器Java实现和讲解

    朴素贝叶斯算法最典型的应用就是垃圾邮件的识别,在数据量非常大的情况下,识别的正确率可以达到接近100%,同时实现起来思路并不复杂.本文介绍的就是基于朴素贝叶斯算法的垃圾邮件识别的实现.如果之前对贝叶斯 ...

  5. 基于朴素贝叶斯算法的脱贫攻坚小数据分类算法

    通过对**县**乡**村扶贫工作数据分析,提出一种适用于精准扶贫的小数据分析方法.将机器学习.数据理论中的相关性分析和推理方法进行改进,得出基于朴素贝叶斯的小数据分析方法.本程序依据如下公式设计: 式 ...

  6. 基于朴素贝叶斯的垃圾分类算法(Python实现)

    有代码和数据集的 https://blog.csdn.net/weixin_33734785/article/details/91428991 附有git库代码的 https://www.cnblog ...

  7. 详解基于朴素贝叶斯的情感分析及 Python 实现

    相对于「 基于词典的分析 」,「 基于机器学习 」的就不需要大量标注的词典,但是需要大量标记的数据,比如: 还是下面这句话,如果它的标签是: 服务质量 - 中 (共有三个级别,好.中.差) ╮(╯-╰ ...

  8. Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报 分类: 机器学习(19) 听说

    Python实现基于朴素贝叶斯的垃圾邮件分类 标签: python朴素贝叶斯垃圾邮件分类 2016-04-20 15:09 2750人阅读 评论(1) 收藏 举报  分类: 机器学习(19)  听说朴 ...

  9. NLP之NBGBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva)、梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测)

    NLP之NB&GBT:基于朴素贝叶斯(count/tfidf+网格搜索+4fCrva).梯度提升树(w2c+网格搜索+4fCrva)算法对IMDB影评数据集进行文本情感分析(情感二分类预测) ...

最新文章

  1. PHP str_word_count
  2. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题
  3. sqlserver sql语句|经典sql语句|实用sql语句
  4. 简单的WinInet编程
  5. 服务器操作系统字符集,设置服务器字符集
  6. 服务器日志记录_5种改善服务器日志记录的技术
  7. Android 基础 —— 模拟实现拨打电话功能
  8. 【SpringMVC】SpringMVC系列6之@CookieValue 映射请求Cookie 值
  9. 自定义控件 一 创建最简单的控件
  10. ES6高级技巧(五)
  11. redhat,centos Linux常用命令LS之常用功能
  12. DB2中sql语句占位符问题
  13. 爬虫笔记1-Requests库的基本方法
  14. NPAPI确实不安全,因为功能太强大
  15. python经典书籍推荐-7本经典的Python书籍,你都读过了么?
  16. OCX 添加方法和事件
  17. Canvas绘制圆点线段
  18. module github.com/jinzhu/gorm/dialects/mysql: git ls-remote -q origin in E:\go_gin\pkg\mod\cache\vcs
  19. 构建岗位胜任力模型至关重要
  20. Web Service 测试

热门文章

  1. matlab 浮雕,基于MATLAB实现石刻浮雕图像“数字拓片”技术的研究
  2. 在uniapp的webview组件引用的网页内如何实时定位
  3. Java架构师成长直通车(一):学习指南
  4. Python全栈工程师特训班-第二期直播回放-韦玮-专题视频课程
  5. mindmanage2020中文注册码思维导图软件,教你如何高效学习
  6. LabVIEW 编程思想(第2版)传送门
  7. 运行 apt-get 更新时 lgn、Hit、Get 的意思
  8. 慕课 简书项目 个人笔记
  9. 用户体验地图的一个不错的例子(极客时间用户体验设计课笔记)
  10. Java 记事本存MySQL_java日历记事本内容如何保存到数据库