效果演示:
效果1:靜態識別
效果2:動態實時識別
可以看到,雖然不太穩定,但是好歹還是識別出來了的,就是需要調參,然鵝我不是專業的,目前還沒有調好。。。 T_T 先這樣吧。以后再說。
覺得文章質量可以的,請點個贊哦,謝謝。
前言
最近需要完成使用opencv識別攝像頭的LED數字,說實話,這個方向之前從來沒有搞過,大概就類似這種:
這種是最理想的情況,但是實際上可能有非常多的噪點,比如:
以上這種情況,還算好了,實際的情況,可能更加復雜,目前先用這種情況的來識別:
方案研究
因為要求在不能聯網的情況之下進行識別,而且識別的又是LED數字,不是英文和普通數字,那么就需要自己訓練模型。
自己訓練模型的話,要么是機器學習,要么是深度學習。 考慮到深度學習比較繁瑣,我這個功能相對比較簡單,使用機器學習的話,應該就可以實現。但是機器學習有很多的模型和算法,從網上搜集資料,發現使用KNN算法是可以實現的。最原始是借鑒的是手寫數字識別,后來發現有別人大概準備好的LED識別的demo,于是結合之前的知識,實現了大概的demo,效果如下:
項目測試demo源碼
效果1:靜態識別
1. 準備訓練素材:
我的路徑是:/home/enpht/test/下 ,會防止一個samples/ 文件夾:訓練素材是網上下載的,這里我分享出來: 123網盤鏈接:
opencv和KNN識別LED數字官方版下載丨最新版下載丨綠色版下載丨APP下載-123云盤
將其中的 “knn_test.zip” 解壓,將samples文件夾放在指定目錄下即可。如果大家用戶名跟我不一樣,可以在代碼中修改
2.pro文件: 新增opencv環境
如果沒有安裝opencv,請參考我上一篇文章:OpenCV運行gstreamer管道獲取相機數據,處理以后,再交給gstreamer顯示(QT實現)-CSDN博客
CONFIG += link_pkgconfig
PKGCONFIG += opencv4
LIBS += -L/usr/lib/x86_64-linux-gnu/ -lopencv_core -lopencv_highgui -lopencv_imgproc -lopencv_imgcodecs -lopencv_videoio
INCLUDEPATH += /usr/include/opencv4/opencv2
INCLUDEPATH += /usr/include/opencv4/
3.main.cpp
注意:大家的路徑,需要在changename和get_name函數中的路徑
#include<iostream>
#include<opencv2/opencv.hpp>
#include<opencv2/core/core.hpp>
#include<opencv2/highgui/highgui.hpp>
#include<opencv2/ml/ml.hpp>
#include<opencv2/imgproc/imgproc.hpp>
using namespace std;
using namespace cv;
using namespace cv::ml;
bool cmp(const Rect &a, const Rect &b);
vector<Mat> get_mats(Mat mt);
bool has_Point(Mat mt);
int main(){string changename(int i,int j);string get_name(int i);Mat traindata, train_label, tmp;for (int j = 0; j < 10; j++){for (int i = 0; i < 40; i++){string name = changename(j,i);//cout << name << endl;tmp = imread(name, 0);resize(tmp, tmp, Size(75, 125));traindata.push_back(tmp.reshape(0, 1));train_label.push_back(j);}}traindata.convertTo(traindata, CV_32F);Ptr<TrainData> tData = TrainData::create(traindata, ROW_SAMPLE, train_label);Ptr<KNearest> knn = KNearest::create();knn->setDef