给定具有透明背景的.png
图像,我想查找非透明数据的边界框。使用嵌套for
循环与QImage.pixel()
是痛苦缓慢。在Qt中是否有内置的方法?Qt是否有办法找到图像的边界框?
8
A
回答
4
如果像素()是用于你太慢,考虑更多高效的逐行数据adressing,给定一个QImage的号码:
int l =p.width(), r = 0, t = p.height(), b = 0;
for (int y = 0; y < p.height(); ++y) {
QRgb *row = (QRgb*)p.scanLine(y);
bool rowFilled = false;
for (int x = 0; x < p.width(); ++x) {
if (qAlpha(row[x])) {
rowFilled = true;
r = std::max(r, x);
if (l > x) {
l = x;
x = r; // shortcut to only search for new right bound from here
}
}
}
if (rowFilled) {
t = std::min(t, y);
b = y;
}
}
我怀疑它会得到任何比这更快。
3
有一个选项涉及使用QGraphicsPixmapItem
并查询不透明区域的边界框(QGraphicsPixmapItem::opaqueArea().boundingRect()
)。不知道它是否是最好的方式,但它的工作原理:)可能值得深入研究Qt的源代码,看看它的核心是什么代码。
下面的代码将打印的图像,然后通过图像的不透明部分的宽度和高度的宽度和高度:
QPixmap p("image.png");
QGraphicsPixmapItem *item = new QGraphicsPixmapItem(p);
std::cout << item->boundingRect().width() << "," << item->boundingRect().height() << std::endl;
std::cout << item->opaqueArea().boundingRect().width() << "," << item->opaqueArea().boundingRect().height() << std::endl;
相关问题
- 1. 寻找图像边界
- 2. 找到两个图像之间的差异的边界框?
- 3. 有没有办法使图像的形状与图像的透明边框?
- 4. 找到旋转图像的边框
- 5. 图像边框上的圆角 - 图像延伸到边界之外
- 6. 找到绘制文本的边界框
- 7. 图像边界图像php
- 8. 围绕图像QT绘制边框。
- 9. 有没有办法在CSS3边框图像的每一边使用不同的图像?
- 10. 查找文本边界图像
- 11. 找出边界框是否位于开放层的矢量图层中3
- 12. C# - 寻找一个图像的边界(不是大小)
- 13. 计算边界图像宽度与边界图像首先
- 14. 边界前的图像
- 15. 古怪的图像边界
- 16. 有没有办法隐藏'System.Windows.Forms.ListBox()'边框?
- 17. VTK将图像移动到边界框的中心
- 18. 检测像素是否在边界内的算法
- 19. 有没有办法去除ggplot2中图例的边框?
- 20. (Elasticsearch)有没有办法将±范围添加到地理边界框查询的边缘?
- 21. 有没有办法找到是否显示软件键盘?
- 22. Qt C++边框图标
- 23. 有没有办法将边框插入到物体的高度?
- 24. 有办法检查表单是否有表单边框? (通过句柄)
- 25. OpenCV绘图边界框CenterPoint
- 26. 图像边界半径
- 27. 拖动边界图像
- 28. 图像卷积和边界
- 29. 有没有办法让drawText()更新QPicture的边界矩形?
- 30. 有没有办法使基础列超出其行的边界?
+1:很好。我正要看看scanLine()选项。 – 2010-09-15 22:01:54
这不像是Qt文档正在做广告。花了我半年的时间来了解它。 – ypnos 2010-09-15 22:05:19
我在没有创建微基准的情况下完成了我的全部任务的一些粗略计时。这种方法基本上使用了与Arnold解决方案相同的CPU时间量,但减少了挂钟时间。 – retracile 2010-09-15 23:33:18