Saydam bir arka plana sahip bir .png
görüntü verildiğinde, saydam olmayan verilerin sınırlayıcı kutusunu bulmak istiyorum. Yuvalanmış for
döngülerinin QImage.pixel()
ile kullanılması ağrılı bir şekilde yavaştır. Bunu Qt'de yapmanın yerleşik bir yöntemi var mı?Qt'nin bir resmin sınırlayıcı kutusunu bulma yolu var mı?
cevap
, daha düşünün bir Qimage p verilen verimli sıra sıra veri hitap,:
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;
}
}
Ben daha hızlı bundan daha bulunacağını zannetmiyorum.
QGraphicsPixmapItem
'u kullanmayı ve opak alanın sınırlayıcı kutusunu sorgulamayı içeren bir seçenek var (QGraphicsPixmapItem::opaqueArea().boundingRect()
). En iyi yol olup olmadığından emin değil ama işe yarıyor :) QT'nin kaynak kodunun içine ne tür bir kodun geldiğini görmek için kazmaya değer olabilir.
Aşağıdaki kod görüntünün opak kısımlarının genişliği ve yüksekliği ardından görüntünün genişliğini ve yüksekliğini yazdıracaktır: piksel() sizin için çok yavaş ise
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;
opaqueArea() alanı tanımlayan bir yol oluşturur. Bu basit sınırlayıcı dikdörtgen hesaplamadan daha yavaş olmalıdır. – ypnos
Umarım, OP bazı zamanlama sonuçlarını yayınlayabilir. Her iki seçeneğin ne kadar zaman alacağını görmek isterdim. Ama evet, karmaşık görüntüler için sadece daha yavaş olduğunu hayal edebiliyorum. –
Bir mikro ölçüt oluşturmadan, tüm görevlerimin birkaç zor zamanlamasını yaptım. Bu yaklaşım aslında benim iç içe geçmiş döngülerimle aynı miktarda duvar saati kullanmış, ancak daha az cpu süresi almıştır. – retracile
- 1. 3d nokta bulutunun minimum sınırlayıcı kutusunu hesaplamak için hızlı ve güçlü bir uygulama var mı?
- 2. , geodjango multipolygon nesnesinin sınırlayıcı kutusunu döndürür
- 3. Bir metin kutusunu düzenlemeyi programlı olarak iptal etmenin bir yolu var mı?
- 4. Bir resmin
- 5. PIL'de bir dikdörtgenin genişliğini belirtmenin bir yolu var mı?
- 6. sınırlayıcı
- 7. sınırlayıcı
- 8. AlertDialog'un geçersiz girişleri kapatmasını engellemenin bir yolu var mı?
- 9. CGPoints'i karşılaştırmanın bir yolu var mı?
- 10. RubyGems'i çevrimdışı güncellemenin bir yolu var mı?
- 11. Düzenleri canlandırmanın bir yolu var mı? [Android]?
- 12. Hafızayı sınırlamanın bir yolu var mı?
- 13. Pydev'de REPL almanın bir yolu var mı?
- 14. YQL'i HTML'ye döndürmenin bir yolu var mı?
- 15. Parametreyi çıkarmanın bir yolu var mı?
- 16. WiX yapılarını hızlandırmanın bir yolu var mı?
- 17. Tip bildirimlerini genişletmenin bir yolu var mı?
- 18. cuBLAS'da "saypx" yapmanın bir yolu var mı?
- 19. Files.write (...) yöntemini almanın bir yolu var mı?
- 20. "Vurgulu" kodun herhangi bir yolu var mı?
- 21. SKActions'i duraklatmanın bir yolu var mı?
- 22. Keyboard.FocusedElement öğesine bağlamanın bir yolu var mı?
- 23. Scala'nın RichString'ini genişletmenin bir yolu var mı?
- 24. django.db.connection.queries öğesini temizlemenin bir yolu var mı?
- 25. Özel SmartArt geliştirmenin bir yolu var mı?
- 26. ConfigurationManager.AppSettings'i geçersiz kılmanın bir yolu var mı?
- 27. C harflerini saymanın bir yolu var mı?
- 28. IComparer'dan IEqualityComparer türetmenin bir yolu var mı?
- 29. Python'da + = aşırı yüklenmenin bir yolu var mı?
- 30. Bunu F # yazmanın bir yolu var mı?
+1: Güzel. ScanLine() seçeneğine bakmak üzereydim. –
Qt dokümanları iyi reklam gibi değil. Bunu öğrenmek için yarım yılımı aldım. – ypnos
Bir mikro ölçüt oluşturmadan tüm aşırı görevimin birkaç zor zamanlamasını yaptım. Bu yaklaşım esas olarak Arnold'un çözümü olarak aynı miktarda cpu süresi kullanmış, ancak duvar saati süresini azaltmıştır. – retracile