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

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 版权声明:本文为博主原创文章,转载请附上博文链接!

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

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

相关文章

Elasticsearch 搜索不到数据问题(_mapping 设置)

需求 由于 kibana3 中&#xff0c;不支持直接在请求的 url 中设置搜索的 type &#xff08;是不是我不知道&#xff1f;&#xff1f;&#xff1f;&#xff09;。 为了支持特定 type 的搜索&#xff0c;所以我设置了个下每个 panel 的查询语句&#xff0c;让它增加一个&#xff…

SVM之交叉验证【转】

交叉验证(CrossValidation)方法思想简介 以下简称交叉验证(Cross Validation)为CV.CV是用来验证分类器的性能一种统计分析方法,基本思想是把在某种意义下将原始数据(dataset)进行分组,一部分做为训练集(train set),另一部分做为验证集(validation set),首先用训练集对分类器进…

linux命令学习-1-less

less 工具也是对文件或其它输出进行分页显示的工具&#xff0c;应该说是linux正统查看文件内容的工具&#xff0c;功能极其强大。less 的用法比起 more 更加的有弹性。在 more 的时候&#xff0c;我们并没有办法向前面翻&#xff0c; 只能往后面看&#xff0c;但若使用了 less …

python问题汇总

问题1&#xff1a;如何解决python3中numpy报错No module named numpy 打开terminal pip3 install numpy 问题2&#xff1a;ModuleNotFoundError No module named matplotlib 打开terminal pip3 install matplotlib

jspspy database help

.转载于:https://www.cnblogs.com/outline/p/5316051.html

SVM 调参策略

转自&#xff1a;SVM 调参策略&#xff1a;https://blog.csdn.net/u014484783/article/details/78220646 SVM 怎样能得到好的结果 1. 对数据做归一化&#xff08;simple scaling&#xff09; 2. 应用 RBF kernel 3. 用cross-validation和grid-search 得到最优的c和g 4. 用…

美好的⼀天 从ActionTab开始 美观、智能、⾼效的新标签⻚ iTab 新标签页iTab新标签页Atop100工具推荐

文章目录 ActionTabiTab 新标签页iTab新标签页&#xff0c;小组件&#xff0c;起始页&#xff0c;标签页&#xff0c;日历&#xff0c;股票&#xff0c;浏览器扩展 https://www.actiontab.cn/ ActionTab 收费&#xff1f;&#xff1f;&#xff1f;&#xff1f; iTab 新标签页iT…

Oracle学习之merge

--使用merge语句 create table new as select * from emp where 10; insert into new (empno,ename) select empno,ename from emp where deptno10;merge into new n using emp e on (n.empnoe.empno) when matched then update set n.sale.salwhen not matched then insert (…

机器学习中的算法(2)-支持向量机(SVM)基础

from:http://www.cnblogs.com/LeftNotEasy/archive/2011/05/18/2034566.html 版权声明&#xff1a; 本文由LeftNotEasy发布于http://leftnoteasy.cnblogs.com, 本文可以被全部的转载或者部分使用&#xff0c;但请注明出处&#xff0c;如果有问题&#xff0c;请联系wheeleastgm…

HDU 2586 How far away ?【LCA】

题目链接&#xff1a; http://acm.hdu.edu.cn/showproblem.php?pid2586 题意&#xff1a; 无向图&#xff0c;给定边及边权重&#xff0c;任意两点之间都有一条唯一的道路&#xff0c;道路上每个点只能出现一次。给定询问&#xff0c;求询问的结点之间的距离。 分析&#xff1…

深入理解拉格朗日乘子法(Lagrange Multiplier) 和KKT条件

from:https://blog.csdn.net/xianlingmao/article/details/7919597 在求取有约束条件的优化问题时&#xff0c;拉格朗日乘子法&#xff08;Lagrange Multiplier) 和KKT条件是非常重要的两个求取方法&#xff0c;对于等式约束的优化问题&#xff0c;可以应用拉格朗日乘子法去求…

android一些若干回调测试

1.activity&#xff1a;onAttachedToWindow在onResume后回调 2.onCreate和onResume调用间隔为29ms, onAttachedToWindow和OnResume相差11ms, viewTreeObserver:OnGloballayout和onAttachedtoWindow相差19ms 注:以上的测试时间间隔不能保证精确相同&#xff0c;但是可以从中看出…

Kinect深度图与摄像头RGB的标定与配准(转载文章)

作者原文地址&#xff1a;http://blog.csdn.net/aichipmunk/article/details/9264703 自从有了Kinect&#xff0c;根据深度图提取前景就非常方便了。因此出现了很多虚拟现实、视频融合等应用。但是&#xff0c;Kinect自身的RGB摄像头分辨率有限&#xff0c;清晰度也不及一些专业…

台北到淡水版Firefox无法播放视频

台北到淡水版的Firefox所有的视频都无法播放&#xff0c;禁用了各种插件也还是没法播放&#xff0c;最后才确定是SWF的问题&#xff0c;大家有同样问题的&#xff0c;可以下载我的放到SWF文件夹下&#xff0c;目录结构如下图&#xff1a; ​Firefox的SWF下载地址1 ​Firefox的S…

最详细、最完整的相机标定讲解

相机标定详解 最近做项目要用到标定&#xff0c;因为是小白&#xff0c;很多东西都不懂&#xff0c;于是查了一堆的博客&#xff0c;但没有一个博客能让我完全能看明白整个过程&#xff0c;绝大多数都讲的不全面&#xff0c;因此自己总结了一篇博客&#xff0c;给自己理一下思…

时间日志和缺陷日志

项目计划总结&#xff1a; 日期&&任务 听课 编写程序 阅读相关书籍 网上查找资料 日总计 周一 2 2 1 1 6 周二 2 1 3 周三 1 2 2 5 周四 2 2 1 5 周五 4 1 1 6 周六 3 1 1 4 周日 4 2 2 周总计 4 …

卷积与反卷积动图

各种卷积与反卷积动态图 反卷积: 详细文字链接&#xff1a;https://www.zhihu.com/question/43609045/answer/132235276(该链接中并没有下面的动态图) Deconvolution大致可以分为以下几个方面&#xff1a;&#xff08;1&#xff09;unsupervised learning&#xff0c;其实就…

ASP.NET-权限管理五张表

ASP.NET 权限管理五张表权限管理的表&#xff08;5张表&#xff09;每个表里面必有的一些信息序号名称 字段 类型 主键默认值是否为空备注1 用户ID ID INT 是 null 否用户ID2用户名称UserNamevarchar(100)否null否用户名称3用户密码UserPasswordvarchar(20)否null否用…

神经网络CNN解释

from&#xff1a;https://blog.csdn.net/ruiyiin/article/details/77113973 这篇文章原地址为An Intuitive Explanation of Convolutional Neural Networks&#xff0c;卷积神经网络的讲解非常通俗易懂。 什么是卷积神经网络&#xff1f;为什么它们很重要&#xff1f; 卷积神经…

线条的属性

1.lineCap"butt“ /"round" /"square" 只能用于线段的结尾处 不能用于线段的衔接处 2.lineJoin:线条与线条相交时的形态 miter(default)/ bevel (斜接&#xff09;/round&#xff08;圆接&#xff09; 1.后绘制的图形&#xff0c;如果与前绘制的图形区…