• 大小: 32.48MB
    文件类型: .rar
    金币: 1
    下载: 0 次
    发布日期: 2023-06-13
  • 语言: 其他
  • 标签:

资源简介

基于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\link.command.1.tlog

     文件       3800  2018-03-28 16:29  KNN数字识别\Knn\Release\Knn.tlog\link.read.1.tlog

     文件        420  2018-03-28 16:29  KNN数字识别\Knn\Release\Knn.tlog\link.write.1.tlog

     文件     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个文件信息

评论

共有 条评论

相关资源