攝像頭手寫數字識別(基於KNN演算法)

2021-08-19 03:36:56 字數 3380 閱讀 1226

攝像頭識別手寫數字

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行 ...