栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

这样保存下来的图片就没有问题了

可以给语义分割算法调用了

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/960216.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号