from:https://blog.csdn.net/akadiao/article/details/79278072

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/akadiao/article/details/79278072

问题描述:

现对6种不同颜色药品(胶囊)分别进行图像采集,并进行类别标注(0-5)。如图所示(文末附有图像源文件链接):

现使用胶囊的RGB通道的均值作为特征,利用SVM建立分类器模型并进行训练,然后利用训练好的模型,在多个样本混合的图像中将各类样本标记出位置并识别出其所属类别。
具体详细处理过程见代码及注释。

示例代码:

#include <iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/ml.hpp>
using namespace cv;
using namespace ml;void findSamplecontours(InputArray src, OutputArrayOfArrays contours);//使用SVM进行胶囊分类
int main()
{  //样本总类别数const int classSum = 6;//每个样本选取的特征个数const int featureSum = 3;//训练样本总数const int sampleSum = 57;//每种类别对应的名称const std::string labelName[6] = {"green_peru", "brown", "darkcyan", "black", "white_brown", "saddlebrown"};//训练数据及标签Mat trainDataMat = Mat::zeros(sampleSum, featureSum, CV_32FC1);Mat labelsMat = Mat::zeros(sampleSum, 1, CV_32SC1);int k = 0;========================创建训练数据==================================for (int label = 0; label < classSum; label++){//训练图像所在文件夹std::string path = "E:/image/image/classification/capsule/pills_class_";char temp[256];sprintf_s(temp, "%d", label);path = path + temp + ".png";Mat src = imread(path);if (src.empty()){std::cout<<"can not load image. \n"<<std::endl;return -1;}//imshow("input", src);//获取每个胶囊的轮廓std::vector<std::vector<Point>>contours;findSamplecontours(src, contours);for(int i = 0; i < contours.size(); i++){if(contourArea(contours[i]) > 50){//建立掩模MASKMat mask = Mat::zeros(src.size(), src.type());drawContours(mask, contours, i, Scalar(255, 255, 255), -1);//获得MASK对应区域的图像src.copyTo(mask,mask);//求各个通道的均值Scalar maskSum = sum(mask);maskSum = maskSum/contourArea(contours[i]);//取前三个通道即BGR通道的均值作为特征for (int j = 0; j < featureSum; j++){trainDataMat.at<float>(k,j) = maskSum[j];}labelsMat.at<int>(k,0) = label;k++;}}}std::cout<<"trainDataMat: \n"<<trainDataMat<<"\n"<<std::endl;std::cout<<"labelsMat: \n"<<labelsMat<<"\n"<<std::endl;========================使用SVM训练部分==================================Ptr<SVM> model = SVM::create();  model->setType(SVM::C_SVC);  model->setKernel(SVM::POLY);model->setDegree(1.0);model->setTermCriteria(TermCriteria(TermCriteria::MAX_ITER,100,1e-6)); model->train(trainDataMat,ROW_SAMPLE,labelsMat); ========================测试部分==================================Mat testImg = imread("E:/image/image/classification/capsule/pills_test.png");if (testImg.empty()){std::cout<<"can not load image. \n"<<std::endl;return -1;}std::vector<std::vector<Point>>testContours;findSamplecontours(testImg, testContours);//对测试图像中的样本进行逐个判断for(int i = 0; i < testContours.size(); i++){if(contourArea(testContours[i]) > 50){Mat testDataMat = Mat::zeros(1, featureSum, CV_32FC1);Mat testLabelsMat;Mat testMask = Mat::zeros(testImg.size(), testImg.type());drawContours(testMask, testContours, i, Scalar(255, 255, 255), -1);testImg.copyTo(testMask,testMask);//求各个通道的均值Scalar testMaskSum = sum(testMask);testMaskSum = testMaskSum/contourArea(testContours[i]);//取前三个通道即BGR通道的均值作为特征for (int j = 0; j < featureSum; j++){testDataMat.at<float>(0,j) = testMaskSum[j];}//使用训练好的SVM模型进行预测model->predict(testDataMat, testLabelsMat);//预测结果int testLabel = testLabelsMat.at<float>(0,0);std::cout <<"testLabel:\n"<<labelName[testLabel]<<std::endl;//在测试图像上绘制出预测结果RotatedRect minRect = minAreaRect(testContours[i]); //使用对应颜色的矩形框将样本框选中rectangle(testImg, minRect.boundingRect(),testMaskSum,2,8);putText(testImg, labelName[testLabel],Point(minRect.boundingRect().x,minRect.boundingRect().y),1, 1.5,Scalar(0,255,0),2);imshow("test image", testImg);waitKey(2000);}}waitKey();return 0;
}  void findSamplecontours(InputArray src, OutputArrayOfArrays contours)
{Mat dst,blueChannels, redChannels;std::vector<Mat>channels;//将原图像分成多个单通道图像split(src, channels);blueChannels = channels.at(0);redChannels = channels.at(2);//分别在R通道和B通道使用不同的阈值进行二值化threshold(redChannels, redChannels, 60, 255, THRESH_BINARY_INV);threshold(blueChannels, blueChannels, 100, 255, THRESH_BINARY_INV);//合并两个二值化后的区域add(blueChannels,redChannels, dst);//对获得区域进行闭操作,去除中心的小孔Mat kernel = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1,-1));morphologyEx(dst,dst,CV_MOP_CLOSE,kernel);//腐蚀操作,去除部分过渡边缘Mat kernel2 = getStructuringElement(MORPH_RECT, Size(5,5), Point(-1,-1));erode(dst, dst,kernel2);//imshow("00", dst);//waitKey();Canny(dst, dst, 20, 100, 3, false);std::vector<Vec4i>hierarchy;//获取轮廓findContours(dst, contours, hierarchy, RETR_EXTERNAL, CHAIN_APPROX_SIMPLE, Point(0,0));
}

识别结果:


训练数据、标签及测试样本标签:


相关链接:

图片及代码下载

--------------------- 作者:阿卡蒂奥 来源:CSDN 原文:https://blog.csdn.net/akadiao/article/details/79278072?utm_source=copy 版权声明:本文为博主原创文章,转载请附上博文链接!

opencv3/C++ 机器学习-SVM应用实例:药品(胶囊)识别与分类相关推荐

  1. OpenCV3 Java 机器学习使用方法汇总

    原文链接:OpenCV3 Java 机器学习使用方法汇总  前言 按道理来说,C++版本的OpenCV训练的版本XML文件,在java中可以无缝使用.但要注意OpenCV本身的版本问题.从2.4 到3 ...

  2. 【opencv机器学习】基于SVM和神经网络的车牌识别

    基于SVM和神经网络的车牌识别 深入理解OpenCV:实用计算机视觉项目解析 本文用来学习的项目来自书籍<实用计算机视觉项目解析>第5章Number Plate Recognition 提 ...

  3. 机器学习——SVM(支持向量机)与人脸识别

    目录 系列文章目录 一.SVM的概念与原理 1.SVM简介 2.SVM基本流程 3.SVM在多分类中的推广 二.经典SVM运用于图像识别分类 三.SVM运用于人脸识别 1.预处理 1.1 数据导入与处 ...

  4. 机器学习-SVM算法

    机器学习-基础知识 机器学习-线性回归 机器学习-逻辑回归 机器学习-聚类算法 机器学习-决策树算法 机器学习-集成算法 机器学习-SVM算法 文章目录 支持向量机 1. 间隔与支持向量 1.1. 点 ...

  5. 文本分类学习 (五) 机器学习SVM的前奏-特征提取(卡方检验续集)

    前言: 上一篇比较详细的介绍了卡方检验和卡方分布.这篇我们就实际操刀,找到一些训练集,正所谓纸上得来终觉浅,绝知此事要躬行.然而我在躬行的时候,发现了卡方检验对于文本分类来说应该把公式再变形一般,那样 ...

  6. python机器学习 | SVM算法介绍及实现

    本篇博客具体学习参考: 1 [机器学习]支持向量机SVM及实例应用 2 [ML]支持向量机(SVM)从入门到放弃再到掌握 这两篇文章讲得特别清楚,数学推导(第一篇)也能看明白,强烈推荐学习~~ 本篇博 ...

  7. 支持向量机SVM详细原理,Libsvm工具箱详解,svm参数说明,svm应用实例,神经网络1000案例之15

    目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例,基于SVM的股票价格预测 支持向量机SVM的详细原理 SVM的定义 ...

  8. 程序员转型AI,这里有最全的机器学习介绍+应用实例

    编译 | AI科技大本营 参与 | 张子琦 编辑 | 明明 机器学习是人工智能的一个分支,已经成为当今最热门的趋势之一.据Gartner公司预测,到2020年,包括机器学习在内的人工智能(AI)技术几 ...

  9. OpenCV支持向量机SVM的实例(附完整代码)

    OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 OpenCV支持向量机SVM的实例 #include <opencv2/core.hpp> #include < ...

最新文章

  1. (转)Unity Assets目录下的特殊文件夹名称(作用和是否会被打包到build中)
  2. matlab-绘图-直角坐标系
  3. 初探Java设计模式1:创建型模式(工厂,单例等)
  4. layuiajax提交表单控制层代码_Ninja Forms:免费的联系表单插件,却提供了付费表单才有的功能【视频+图文】...
  5. django 1.8 官方文档翻译: 6-6-4 部署静态文件
  6. ATHK弄出个有道词典加入生词本的快接键...
  7. Docker国内Yum源和国内镜像仓库
  8. c 程序设计语言第一次作业,重大2017年C++程序设计语言第一次作业(含答案).doc...
  9. python 获取qq群成员信息_Python获取统计自己的qq群成员信息的方法
  10. 基于用户的协同过滤推荐算法研究
  11. 项目管理表格模板/实用表格-需求
  12. 解决ASUS P5GC-MX/1333声卡驱动不能正常安装的问题
  13. 基金绿到发慌,教你用Python看破藏在盈损动态里的秘密
  14. freemarker中空值 null的处理 ?exists ?default()
  15. 万物皆有裂痕,可心存希望,那便是光照进来的地方。
  16. Nernst 方程推导
  17. 上海弈云计算机,网吧特权尽在掌握!云电脑与你“弈起来夏棋”
  18. 在vue中使用腾讯地图绘制围栏功能
  19. 50个极好的bootstrap 后台框架主题下载
  20. 打谱软件Guitar Pro8许可证序列号使用和下载

热门文章

  1. 什么是 NoSQL 数据库、NoSQL 与 SQL 的区别
  2. 【转】 JMeter学习(二十四)linux启动jmeter,执行./jmeter.sh报错解决方法
  3. SJXXX串口扩展芯片 4串口芯片 UART串口芯片
  4. hadoop fs 运维常用的几个命令
  5. PyCharm光标变粗的解决办法
  6. [恢]hdu 1846
  7. 关于我曾经做过的一个商业社区的ui框架
  8. 初识NIO之Java小Demo
  9. HTML5 webfont字体图标的使用
  10. java输出一些内容到日志文件