资源简介
基于opencv-KNN最邻近算法实现手写数字识别,使用Qt做UI实现手写板,可以实时测试,资源包含源代码和可执行程序(release文件夹下的exe文件可以直接运行)
代码片段和文件信息
#include “Knn.h“
Knn::Knn(QWidget *parent)
: QWidget(parent)
{
ui.setupUi(this);
ui.bRecognize->setEnabled(false);
connect(ui.bTrain SIGNAL(clicked()) this SLOT(onTrain()));
connect(ui.bRecognize SIGNAL(clicked()) this SLOT(onRecognize()));
connect(ui.bClear SIGNAL(clicked()) this SLOT(onClearImage()));
onClearImage();
}
void Knn::onTrain(){
Mat digitsSet = imread(“digits.png“);
Mat gray;
cvtColor(digitsSet gray CV_BGR2GRAY);
threshold(gray gray 0 255 CV_THRESH_BINARY);
// digits.png为2000 * 1000,其中每个数字的大小为20 * 20,则总共有5000((2000*1000) / (20*20))个数字
// 对其分割成单个20 * 20的图像并序列化成(转化成一个一维的数组)
int side = 20;
int m = gray.rows / side;
int n = gray.cols / side;
Mat data labels;
for (int i = 0; i < m; i++){
ui.lState->setText(QString(“Trainning %1“).arg(i/5));
int offsetRow = i * side;
for (int j = 0; j < n; j++){
int offsetCol = j * side;
// 截取20*20的小块
Mat tmp;
gray(Range(offsetRow offsetRow + side) Range(offsetCol offsetCol + side)).copyTo(tmp);
data.push_back(tmp.reshape(0 1)); // 序列化转换成一个一维向量
labels.push_back(i / 5);
QImage image = CvMat2QImage(tmp);
QPixmap pixmap = QPixmap::fromImage(image);
ui.label->setPixmap(pixmap.scaled(ui.label->size()));
sleep(1);
}
}
data.convertTo(data CV_32F);
// 使用KNN算法训练
int K = 51;
Ptr tData = TrainData::create(data ROW_SAMPLE labels);
model = KNearest::create();
model->setDefaultK(K);
model->setIsClassifier(true);
model->train(tData);
ui.bRecognize->setEnabled(true);
ui.bTrain->setEnabled(false);
ui.lState->setText(“Train OK!“);
}
void Knn::onRecognize(){
ui.bRecognize->setEnabled(false);
Mat zoom;
zoom = zoomImage(0.1 frame);
Mat reshapeImage = zoom.reshape(0 1);
reshapeImage.convertTo(reshapeImage CV_32F);
float r = model->predict(reshapeImage);
ui.labelResult->setText(QString(“%1“).arg(r));
ui.bRecognize->setEnabled(true);
}
void Knn::onClearImage(){
frame = Mat::zeros(200 200 CV_8UC1);
QImage image = CvMat2QImage(frame);
QPixmap pixmap = QPixmap::fromImage(image);
ui.label->setPixmap(pixmap.scaled(ui.label->size()));
}
QImage Knn::CvMat2QImage(const cv::Mat& mat){
if (mat.type() == CV_8UC1){
QImage image(mat.cols mat.rows QImage::Format_Indexed8);
image.setColorCount(256);
for (int i = 0; i < 256; i++){
image.setColor(i qRgb(i i i));
}
uchar *pSrc = mat.data;
for (int row = 0; row < mat.rows; row++){
uchar *pDest = image.scanLine(row);
memcpy(pDest pSrc mat.cols);
pSrc += mat.step;
}
return image;
}
else if (mat.type() == CV_8UC3){
const uchar *pSrc = (const uchar*)mat.data;
QImage image(pSrc mat.cols mat.rows mat.step QImage::Format_RGB888);
return image.rgbSwapped();
}
else if (mat.type() == CV_8UC4){
const uchar *pSrc = (const uchar*)mat.data;
QImage image(pSrc mat.cols mat.rows mat.step QIma
属性 大小 日期 时间 名称
----------- --------- ---------- ----- ----
文件 1463 2018-03-28 16:22 KNN数字识别\Knn\Debug\Knn.Build.CppClean.log
文件 86 2018-03-28 16:22 KNN数字识别\Knn\Debug\Knn.log
文件 721129 2014-11-06 08:49 KNN数字识别\Knn\digits.png
文件 1372 2018-03-28 16:24 KNN数字识别\Knn\GeneratedFiles\qrc_Knn.cpp
文件 3681 2018-03-28 16:24 KNN数字识别\Knn\GeneratedFiles\Release\moc_Knn.cpp
文件 5495 2018-03-28 16:29 KNN数字识别\Knn\GeneratedFiles\ui_Knn.h
文件 5341 2018-03-28 16:20 KNN数字识别\Knn\Knn.cpp
文件 1244 2018-03-28 16:04 KNN数字识别\Knn\Knn.h
文件 63 2018-03-27 14:41 KNN数字识别\Knn\Knn.qrc
文件 4780 2018-03-28 16:29 KNN数字识别\Knn\Knn.ui
文件 10438 2018-03-28 16:24 KNN数字识别\Knn\Knn.vcxproj
文件 2910 2018-03-27 14:41 KNN数字识别\Knn\Knn.vcxproj.filters
文件 713 2018-03-28 08:09 KNN数字识别\Knn\Knn.vcxproj.user
文件 177 2018-03-27 14:40 KNN数字识别\Knn\main.cpp
文件 4273 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.log
文件 200837 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.obj
文件 6198 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\cl.command.1.tlog
文件 124022 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\CL.read.1.tlog
文件 690 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\CL.write.1.tlog
文件 2092 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\custombuild.command.1.tlog
文件 402 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\custombuild.read.1.tlog
文件 510 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\custombuild.write.1.tlog
文件 154 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\Knn.lastbuildstate
文件 1736 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\li
文件 3800 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\li
文件 420 2018-03-28 16:29 KNN数字识别\Knn\Release\Knn.tlog\li
文件 113609 2018-03-28 16:29 KNN数字识别\Knn\Release\main.obj
文件 112845 2018-03-28 16:29 KNN数字识别\Knn\Release\moc_Knn.obj
文件 2137 2018-03-28 16:24 KNN数字识别\Knn\Release\qrc_Knn.obj
..A..H. 42 2018-03-28 15:46 KNN数字识别\Knn.opensdf
............此处省略40个文件信息
- 上一篇:C和指针(高清PDF)
- 下一篇:DiskGeniusX86X64.rar
评论
共有 条评论