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.pswp.cn/news/458144.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/458144.shtml
英文地址,請注明出處:http://en.pswp.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;如果與前繪制的圖形區…