qt多边形的绘制,填充与显示
直接在QWidget界面显示,重写paintEvent即可
QtTest::QtTest(QWidget *parent)
: QMainWindow(parent)
{
ui.setupUi(this);
}
void QtTest::paintEvent(QPaintEvent *)
{
QPainterPath path;
// 跳到第一个点,没有这一行默认第一个点是(0,0),会有一条线连到 (0,0)
path.moveTo(10, 10);
path.lineTo(10,50);
path.lineTo(100,100);
path.lineTo(156,86);
path.lineTo(80, 36);
//结束,没有的画也可以画出来,但是最后封闭的那条线就没有了
path.closeSubpath();
QPainter painter(this);
QPen pen(QColor(0, 255,0), 2);
painter.setPen(pen);
painter.drawPath(path);
//随机取颜色
QColor color(qrand() % 255, qrand() % 255, qrand() % 255, 150);
painter.fillPath(path, color);
path.moveTo(200, 200);
path.lineTo(200, 400);
path.lineTo(400,400);
path.lineTo(400, 200);
path.closeSubpath();
painter.setPen(pen);
painter.drawPath(path);
color =QColor(qrand() % 255, qrand() % 255, qrand() % 255, 150);
painter.fillPath(path, color);
}
如上图所示:
没有path.moveTo(10, 10); 会从左上点开始画
没有path.closeSubpath(); 最后封闭多边形的那条线就没有了。
转灰度图
场景:
输入:多边形的点集(有多个多边形)
输出:一个矩阵,存成灰度图
要求: 多边形1,圈出来的地方都填充数字1;多边形2圈出来的地方填充数字2.。。。。。背景全是0
分析:
- 灰度图是单通道的,符合矩阵的要求
- 暂时没有找到qt直接绘制灰度图,只能从彩色图入手
- 目前只找到了彩色图填充多边形的算法
步骤:
在彩图上绘制并填充多边形
这里我假设 ,从彩图转灰度图是只用到 rgb中的g,所以颜色只有g有值
QPixmap pix(200, 200);
//背景取0
pix.fill(QColor(0,0,0));
QPainter painter(&pix);
QPainterPath path;
path.moveTo(10, 10);
path.lineTo(10, 50);
path.lineTo(100, 100);
path.lineTo(156, 86);
path.lineTo(80, 36);
path.closeSubpath();
//边框和多边形里面取相同的颜色
QPen pen(QColor(0, 10, 0), 1);
painter.setPen(pen);
painter.drawPath(path);
QColor color(0,10,0);
//填充多边形
painter.fillPath(path, color);
painter.end();
然后把彩图转为灰度图
QImage image = pix.toImage();
image.save("color.png");
int width = image.width();
int height = image.height();
QImage iGray(width, height, QImage::Format_Indexed8);
//1
iGray.setColorCount(21);
for (int i = 0; i < 21; i++)
{
iGray.setColor(i, qRgb(0, i, 0));
}
//2
for (int i = 0; i < width; i++)
{
for (int j = 0; j < height; j++)
{
QRgb pixel = image.pixel(i, j);
int g = qGreen(pixel);
iGray.setPixel(i, j, g);
}
}
return iGray.save("a.png", "png");
解释:
首先灰度图的格式为: QImage iGray(width, height, QImage::Format_Indexed8);
如果 //1 到//2这里不要
那么这里的设置是无效的 iGray.setPixel(i, j, g);
index_or_rgb 是指颜色的索引,如果直接写iGray.setPixel(i, j, g);根本存不进去
所以我们手动建一个索引,假设需要保存数量的最大值是20
//1
iGray.setColorCount(21);
for (int i = 0; i < 21; i++)
{
iGray.setColor(i, qRgb(0, i, 0));
}
//2
这样保存下来的图片就没有问题了
可以给语义分割算法调用了