#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->setDefaultK(3);
knn->setIsClassifier(true);
knn->train(tData);
Mat mymt = imread("f:/RecordedImage_GO-5000C-USB__000.tif");
vector<Mat> dds=get_mats(mymt);
ostringstream oss;
for (int n = 0; n < dds.size(); n++){
dds[n].copyTo(tmp);
resize(tmp, tmp, Size(75, 125));
tmp = tmp.reshape(0, 1);
tmp.convertTo(tmp, CV_32F);
int result = knn->predict(tmp);
oss << result;
if (has_Point(dds[n])) oss << ".";
}
cout << oss.str() << endl;
}
string changename(int i,int j){
ostringstream oss;
oss <<"f:/"<< i << "_out/" <<j<< ".jpg";
string name = oss.str();
return name;
}
string get_name(int i){
ostringstream oss;
oss << "f:/tmp/" << i << ".jpg";
return oss.str();
}
vector<Mat> get_mats(Mat mt){
vector<Mat> channels,result_datas;
Mat image_bin, result, ele, image_bin2, temp;
split(mt, channels);
//阈值选取很重要
threshold(channels[2], image_bin2, 50, 255, THRESH_BINARY);
ele = getStructuringElement(MORPH_RECT, Size(5, 5)); // 膨胀
dilate(image_bin2, image_bin, ele);
image_bin.copyTo(temp);
vector<vector<Point>> conts;
vector<Vec4i> hire;
//轮廓提取
findContours(image_bin, conts, hire, RETR_EXTERNAL, CHAIN_APPROX_NONE);
vector<Rect> rects;
vector<Mat> datas;
temp.copyTo(image_bin);
//threshold(mt,image_bin,150,255,THRESH_BINARY);
for (int i = 0; i<conts.size(); i++){
Rect t = boundingRect(Mat(conts[i]));
if (t.width<40 || t.height<50) continue;
rects.push_back(t);
//rectangle(mt,t,(255,255,255));
}
// imshow("kkkl",mt);
//sort numbers
sort(rects.begin(), rects.end(), cmp);
//cut pictures
for (int i = 0; i<rects.size(); i++){
image_bin(rects[i]).copyTo(result);
result_datas.push_back(result);
// datas.push_back(result);
}
return result_datas;
}
bool cmp(const Rect &a, const Rect &b){
if (a.x<b.x){
return true;
}
else{
return false;
}
}
//取5X5方块检验小数点
bool has_Point(Mat mt){
int with = mt.rows;
int height = mt.cols;
Rect r(height - 5, with - 5, 5, 5);
mt(r).copyTo(mt);
Mat_<uchar>::iterator it = mt.begin<uchar>();
Mat_<uchar>::iterator itend = mt.end<uchar>();
int count = 0;
for (; it != itend; ++it)
{
if ((*it) == 255) count += 1;//二值化后,像素点是0或者255
}
return (!count ==0);
}
- 1
- 2
前往页