給定具有透明背景的.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. 有沒有什麼辦法給圖像使用CSS的邊框?
- 5. 有沒有辦法使圖像的形狀與圖像的透明邊框?
- 6. 找到旋轉圖像的邊框
- 7. Python:找到點是否位於多邊形的邊界上
- 8. 是否在邊界框內是緯度?
- 9. 圖像中物體的邊界框Matlab
- 10. 查找有界圖像的算法
- 11. 找到繪製文本的邊界框
- 12. 圖像邊框上的圓角 - 圖像延伸到邊界之外
- 13. 有界上下文找到邊界?
- 14. 是否可以將多邊形剪切到基礎地圖的邊界框?
- 15. 圖像邊界圖像php
- 16. 圍繞圖像QT繪製邊框。
- 17. 有沒有辦法在CSS3邊框圖像的每一邊使用不同的圖像?
- 18. 查找文本邊界圖像
- 19. matlab圖像:沿圖像中的邊界框返回像素值?
- 20. Scipy在圖像中繪製邊界框
- 21. IE9圖像邊界
- 22. 確定點是否在邊界框內
- 23. 找出邊界框是否位於開放層的矢量圖層中3
- 24. 有沒有辦法找到網站上是否有文字?
- 25. C# - 尋找一個圖像的邊界(不是大小)
- 26. 計算邊界圖像寬度與邊界圖像首先
- 27. 查找CALayer的邊界框繪製到圖形上下文
- 28. AVPlayerLayer沒有邊界到UIView的框架
- 29. 有沒有辦法隱藏'System.Windows.Forms.ListBox()'邊框?
- 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