qt 多边形填充 生成语义分割的mask 灰度图

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

分析:

  1. 灰度图是单通道的,符合矩阵的要求
  2. 暂时没有找到qt直接绘制灰度图,只能从彩色图入手
  3. 目前只找到了彩色图填充多边形的算法

步骤:
在彩图上绘制并填充多边形
这里我假设 ,从彩图转灰度图是只用到 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

这样保存下来的图片就没有问题了
在这里插入图片描述
可以给语义分割算法调用了

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值