攝像頭識別手寫數字
ubuntu16.04,opencv2, ide : qt5.9.1creator, 編譯器:cmake
(1)寫了主程式main.cpp將開啟攝像頭並處理訓練資料放在主函式裡了,讀取資料,提取特徵還是呼叫的原程式
原程式為windows下的,讀取檔案的路徑需要更改,原dealdata.h中:
//樣本資料的儲存路徑
string dir_path = "e:\\data1\\sample\\";
// 更改為
string dir_path = "/home/sun/catkin_nr/src/nub_r/data1/sample/";
//其中雙斜槓都要改為單斜槓
sprintf(path, "%s%d/.", dir_path.c_str(), i);
sprintf(tmp, "%s%d/%s", dir_path.c_str(), i, ptr->d_name);
原
(2)findcontours輸入為二值資料圖,在閾值二值化之前必須先將rgb圖灰度化,開始不了解,浪費了好長時間找問題,唉。。。
cvtcolor(dstimage, grayimage, color_bgr2gray);//extremely important
threshold(grayimage, image, 120, 255, cv_thresh_binary_inv);
(3)關於訓練的尺寸,可以修改,原來部落格中為128×128,後來我考慮到數字寬高不是1:1,所以將寬高改為64:96(此處取值也需注意,詳見下面的部落格),主要是作特徵提取用。opencv命令為 hogdescriptor(),關於此命令相關介紹參考:opencv hogdescriptor 引數**
講的很詳細。
(4)識別效果圖:
門牌識別:
攝像頭識別:
該程式僅能進行 簡單的數字識別,且識別距離有限,對影象光照要求比較高,改進空間很大,對於門牌識別還需要對門牌區域進行識別,切割,影象增強處理,畸變處理,路還很長。。。。。。識別演算法比knn好的還有很多,就當是乙個開始吧!
//created 2018.4.17#include //用ros_info來輸出資訊,沒有ros環境可以改掉
#include #include #include // for converting the command line parameter to integer
#include #include #include #include "dealdata.h"
#include "hogmat.h"
using namespace cv;
using namespace std;
using namespace ml;
mat trainimage;//用於存放訓練圖
mat labelimage;//用於存放標籤
int predict(mat inputimage);
mat deal_camera(mat srcimage);
ptrknn;
int result;
//load picture part added
vectorroi;//用於存放圖中摳出的數字區域
vectorroiposition;//roi在影象中的位置
vector> contours;//點容器的容器,用於存放輪廓的點的容器的容器
vectorhierarchy;//點的指標容器
int result_2;//**的結果
int weigth;//寬度
int height;//高度
mat _roi;
rect rect;
point positiosn;
int brx; //右下角的橫座標
int bry; //右下角的豎座標
int tlx; //左上角的橫座標
int tly; //左上角的豎座標
int main(int argc, char** argv)
istringstream video_sourcecmd(argv[1]);//local computer is 0,usb camera is 1!
int video_source;
if(!(video_sourcecmd >> video_source))
videocapture cap(video_source);
if (!cap.isopened())
//train data!
vectorsamplepath;
vectorlabels;
dealdata::samplepath(samplepath, labels);
//匯入樣本,並做好標籤圖
for (int i = 0, _size = (int)samplepath.size(); i < _size; ++i)
//建立knn,並且設定n值為5
knn = knearest::create();
knn->setdefaultk(5);
knn->setisclassifier(true);
//生成訓練資料
ptrtdata = traindata::create(trainimage, row_sample, labelimage);
cout << "it's training!" << endl;
knn->train(tdata);
//send picture
for(;;)
return 0;
}int predict(mat inputimage)
mat input = hogmat::gothogmat(inputimage);
return (int)knn->predict(input); //返回**結果
}mat deal_camera(mat srcimage)
char output[10] = ;
sprintf(output, "%d", result);
positiosn = point(rect.br().x - 7, rect.br().y + 25);
puttext(srcimage,output,positiosn,1, 1.0,scalar(0, 0, 0),1);//在螢幕上列印字
cout<
}} return srcimage ;
}
基於KNN的手寫數字識別
from numpy import import operator import os def classify0 inx,dataset,labels,k 構造分類器 knn原理 datasetsize dataset.shape 0 diffmat tile inx,datasetsize,1 ...
KNN手寫數字識別
以歐幾里得距離度量樣本間的相似程度。對於乙個測試樣本首先計算該樣本與每個訓練樣本間的距離,然後按距離值對訓練樣本進行公升序排序,排序後前k個樣本進行投票,即哪個標籤出現的次數多,就將測試樣例劃為該類。程式使用資料 預先將資料處理為,標籤資訊轉化為txt文件。from numpy import imp...
kNN 手寫數字識別
識別手寫的數字0 9,影象為32畫素 32畫素的黑白影象 1.將影象轉換為向量 將32 32的二進位制影象矩陣轉換為1 1024的向量。將影象轉化為向量 defimgvector filename returnvect zeros 1,1024 fr open filename 讀取檔案的前32行 ...