背景
在学习AutoML或ML的过程中,需要一些图片类型的数据做分类预测训练,于是想到尝试最简单的数字识别,且单个数字的识别,也就是y的取值只有10种可能,即0到9。
以下参考代码分别考虑了数字字体的大小、数字颜色的深浅、线条的粗细、数字的倾斜、字体随机、图片背景色(纯色)的深浅、噪声点的位置和大小等要素,且进行随机生成。
代码
#include <QGuiApplication>
#include <QtCore>
#include <QtGui>
#include <QTransform>
bool createImage(int number, int size, int sn)
{
qsrand(QTime::currentTime().msec() * sn * qrand());
QImage img = QImage(size, size, QImage::Format_RGB32);
QPainter painter(&img);
//白色到灰色[0.4~1.0]
double lightness = qAbs(qrand()) % 500/1000.0 + 0.4;
double v = 255 * lightness;
painter.setBrush(QBrush(QColor(v, v, v)));
painter.drawRect(0, 0, size, size);
//亮色字体
int t = qAbs(qrand());
int r = (100 + t/150) % 150;
int g = (100 + t%150) % 150;
QPen pen(QColor(r, g, 0));
pen.setWidthF(qAbs(qrand() % 4)); //线宽
painter.setPen(pen);
//旋转
QTransform ransform;
ransform.rotate(qrand() % 30* (qrand() % 3 - 1));
painter.setTransform(ransform);
//中心点随机
int randSize = 20 * size / 100;
QRectF textRect(QPointF(qAbs(qrand()) % randSize, qAbs(qrand()) % randSize),
QSizeF(size-randSize, size-randSize));
QString sNumber = QString::number(number);
int fontSize = (30 + qrand() % 20) * size / 100;
painter.setFont(QFont(qrand()%2 ? "SimSun" : "msyhbd", fontSize));
painter.setRenderHint(QPainter::TextAntialiasing); //抗锯齿
painter.drawText(textRect, Qt::AlignCenter, sNumber);
//噪声点
painter.setRenderHint(QPainter::HighQualityAntialiasing); //抗锯齿
for (int i = 0; i < 5 + qrand() % 10; ++i)
{
pen.setColor(QColor(qAbs(qrand())%255, qAbs(qrand())%255, qAbs(qrand())%255));
pen.setWidth(2 + qrand() % 4);
painter.setPen(pen);
painter.drawPoint(qAbs(qrand())%size, qAbs(qrand())%size);
}
QString fileName = QString("num_%1_%2.png").arg(sn, 6, 10, QChar('0')).arg(sNumber);
bool ok = img.save(fileName + ".tmp", "PNG", 0);
if (ok)
{
QFile::remove(fileName);
ok = QFile::rename(fileName + ".tmp", fileName);
}
qDebug() << fileName << "Created!";
return ok;
}
int main(int argc, char *argv[])
{
QGuiApplication a(argc, argv);
for (int i = 0; i < 100000; ++i)
{
createImage(qAbs(qrand())%10, 100, i);
qDebug() << "Finish" << i;
}
return 0;
}