前一段儿想用opencv做一下数字识别,用神经网络做识别。
在网上搜了一下关于opencv中ANN的使用方法,@小魏的修行路 的【模式识别】OpenCV中使用神经网络 CvANN_MLP 这篇文章写得挺好,照搬里面的例程运行了一下,发现有些错误,而且从他最后的结果图片来看明显是分类分错了。但是他的这篇博文还是写的挺好的,简单,通俗易懂。关于OPENCV中神经网络相关的使用方法这里就不作介绍了,大家可以直接看他的博客。
这里说一下例程的简单思路:
1.首先定义两种类型的若干个点,
2.然后利用这些样本点训练出一个模型,
3.新建一张图片,使用图片中的每一个像素作为测试点,利用上一步训练出的模型把这些像素分为两类,并用不同的颜色标记出来。
这里是程序运行的结果:

以下源码只是对 @小魏的修行路 的程序作了小部分改动:
源码

//编程环境:VS2010 + Opencv2.4.8
#include <opencv2/core/core.hpp>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/ml/ml.hpp>
#include <iostream>
#include <string>  using namespace std;
using namespace cv;  int main()
{  //Setup the BPNetwork  CvANN_MLP bp;   // Set up BPNetwork's parameters  CvANN_MLP_TrainParams params;  params.train_method=CvANN_MLP_TrainParams::BACKPROP;  //(Back Propagation,BP)反向传播算法params.bp_dw_scale=0.1;  params.bp_moment_scale=0.1;  // Set up training data  float labels[10][2] = {{0.9,0.1},{0.1,0.9},{0.9,0.1},{0.1,0.9},{0.9,0.1},{0.9,0.1},{0.1,0.9},{0.1,0.9},{0.9,0.1},{0.9,0.1}};  //这里对于样本标记为0.1和0.9而非0和1,主要是考虑到sigmoid函数的输出为一般为0和1之间的数,只有在输入趋近于-∞和+∞才逐渐趋近于0和1,而不可能达到。Mat labelsMat(10, 2, CV_32FC1, labels);  float trainingData[10][2] = { {11,12},{111,112}, {21,22}, {211,212},{51,32}, {71,42}, {441,412},{311,312}, {41,62}, {81,52} };  Mat trainingDataMat(10, 2, CV_32FC1, trainingData);  Mat layerSizes=(Mat_<int>(1,5) << 2, 2, 2, 2, 2); //5层:输入层,3层隐藏层和输出层,每层均为两个perceptronbp.create(layerSizes,CvANN_MLP::SIGMOID_SYM);//CvANN_MLP::SIGMOID_SYM ,选用sigmoid作为激励函数bp.train(trainingDataMat, labelsMat, Mat(),Mat(), params);  //训练// Data for visual representation  int width = 512, height = 512;  Mat image = Mat::zeros(height, width, CV_8UC3);  Vec3b green(0,255,0), blue (255,0,0);  // Show the decision regionsfor (int i = 0; i < image.rows; ++i){for (int j = 0; j < image.cols; ++j)  {  Mat sampleMat = (Mat_<float>(1,2) << i,j);  Mat responseMat;  bp.predict(sampleMat,responseMat);  float* p=responseMat.ptr<float>(0);  //if (p[0] > p[1]){image.at<Vec3b>(j, i)  = green;  } else{image.at<Vec3b>(j, i)  = blue;  }}  }// Show the training data  int thickness = -1;  int lineType = 8;  circle( image, Point(111,  112), 5, Scalar(  0,   0,   0), thickness, lineType); circle( image, Point(211,  212), 5, Scalar(  0,   0,   0), thickness, lineType);  circle( image, Point(441,  412), 5, Scalar(  0,   0,   0), thickness, lineType);  circle( image, Point(311,  312), 5, Scalar(  0,   0,   0), thickness, lineType);  circle( image, Point(11,  12), 5, Scalar(255, 255, 255), thickness, lineType);  circle( image, Point(21, 22), 5, Scalar(255, 255, 255), thickness, lineType);       circle( image, Point(51,  32), 5, Scalar(255, 255, 255), thickness, lineType);  circle( image, Point(71, 42), 5, Scalar(255, 255, 255), thickness, lineType);       circle( image, Point(41,  62), 5, Scalar(255, 255, 255), thickness, lineType);  circle( image, Point(81, 52), 5, Scalar(255, 255, 255), thickness, lineType);       imwrite("result.png", image);        // save the image   imshow("BP Simple Example", image); // show it to the user  waitKey(0);  return 0;
}  

Opencv中ANN神经网络使用示例相关推荐

  1. OpenCV中的神经网络

    来源:http://blog.csdn.net/delltdk/article/details/8912867 OpenCV中封装了类CvANN_MLP,因而神经网络利用很方便. 首先构建一个网络模型 ...

  2. OpenCV中使用神经网络 CvANN_MLP

    原文:http://blog.csdn.net/xiaowei_cqu/article/details/9027617 OpenCV的ml模块实现了人工神经网络(Artificial Neural N ...

  3. opencv(python)使用ann神经网络识别手写数字

    opencv中也提供了一种类似于Keras的神经网络,即为ann,这种神经网络的使用方法与Keras的很接近. 关于mnist数据的解析,读者可以自己从网上下载相应压缩文件,用python自己编写解析 ...

  4. OpenCV中神经网络的应用

    OpenCV中神经网络的应用 OpenCV中也提供神经网络的算法,下面对其中的一些参数进行介绍. 激活函数 OpenCV中提供三种激活函数,分别是线性激活函数.sigmoid激活函数和高斯激活函数. ...

  5. OpenCV实现车牌识别,OCR分割,ANN神经网络

    主要步骤: 准备车牌单个字符图像作为神经网络分类器的训练数据,越多越好.当然需要对每幅图像提取特征,这里使用的是水平和垂直累计直方图和缩小后的图像信息. 获取车牌图像,这里的车牌图像已经完成抠图,并且 ...

  6. Ubuntu中OpenCV的安装及使用示例

    安装环境:VMware虚拟机安准的Ubuntu系统 OpenCV版本:3.4.11 一.OpenCV下载及安装 1.安装包 (1)下载OpenCV数据包 国内下载网址:https://www.bzbl ...

  7. OpenCV中检测ChArUco的角点(2)

    论文阅读模块将分享点云处理,SLAM,三维视觉,高精地图相关的文章.公众号致力于理解三维视觉领域相关内容的干货分享,欢迎各位加入我,我们一起每天一篇文章阅读,开启分享之旅,有兴趣的可联系微信diany ...

  8. opencv中使用K-近邻分类算法KNN

    K-近邻(K-Nearest Neighbors, KNN)是一种很好理解的分类算法,简单说来就是从训练样本中找出K个与其最相近的样本,然后看这K个样本中哪个类别的样本多,则待判定的值(或说抽样)就属 ...

  9. OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别

    连接:OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别 OpenCV中使用Eigenfaces 或 Fisherfaces进行人脸识别 Translate by Dawn ...

最新文章

  1. CentOS 7安装gitlab服务器
  2. 全球及中国再生橡胶产业发展动态及十四五运营状况分析报告2021版
  3. iptv管理系统php制作,双子星IPTV管理系统搭建教程
  4. Docker安装Mysql8.0,并配置忽略大小写,一句命令搞定
  5. base64 能放数组里面么_手把手教你Vue解析pdf(base64)转图片【实践】
  6. 没解决:RuntimeWarning: tp_compare didn't return -1 or -2 for exception
  7. Java中String、StringBuffer、StringBuilder的区别详解
  8. 卡分区 shell脚本_分享一个实用脚本--一键获取linux内存、cpu、磁盘IO等信息
  9. 国家计算机机房地址,国家电子计算机机房设计规范..doc
  10. 用自己的设备跑各种VI-SLAM算法(1)——VINS/PL-VINS/ROVIO/MSCKF
  11. 腾讯天龙八部手游服务器账号上线,天龙八部手游服务器的注册已达到上限 服务器注册上限怎么解决...
  12. javascript接口鸭式辨型法实现
  13. python采集小说网站完整教程(附完整代码)
  14. java毕业设计的健身俱乐部综合管理系统mybatis+源码+调试部署+系统+数据库+lw
  15. nginx安装教程(centos系统)
  16. Unity云渲染开源框架UnityRenderStreaming使用说明
  17. 双线双路网络路由设置
  18. 工程造价课程-广联达GTJ2018功能介绍-新手看下
  19. 计算机模拟动物打架,动物打架模拟器
  20. S=x+xx+xxx+xxxx……的代码实现过程

热门文章

  1. FinalShell 高级版离线激活方法 已经过亲自验证
  2. 华为S2700 交换机配置
  3. 财务报表是用来排雷的-《手把手教你读财报》
  4. mingw64+Rust+Windows11安装
  5. 等保windows server安全策略三权分立设置
  6. 操作系统实验四——使用命名管道实现进程通信
  7. mint ui tabbar选中后怎么改变icon图标_微信朋友圈怎么转发 微信里面的朋友圈发的怎样再转发一次?...
  8. [环境配置]Win10 这台计算机中已经安装了 .NET Framework 4.5.2 或版本更高的更新
  9. 基于西门子S7-1500的大型焊接机全套程序,使用博图V14打开(带全部注释,需要源程序的可以加微信x241602)...
  10. 【WaterRemind】用Arduino与SSD1306做一款提醒喝水的杯垫(何同学同款)