Biorąc pod uwagę obraz z przezroczystym tłem, chcę znaleźć obwiednię nieprzejrzystych danych. Używanie zagnieżdżonych pętli for
z QImage.pixel()
jest bardzo powolne. Czy istnieje wbudowana metoda robienia tego w Qt?Czy Qt ma sposób na znalezienie obwiedni obrazu?
Odpowiedz
Jeśli piksel() jest zbyt powolne dla Ciebie, zastanów się więcej Efektywne dane w wierszach, biorąc pod uwagę QImage p:
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;
}
}
Wątpię, czy będzie to szybsze.
Istnieje jedna opcja, która wymaga użycia QGraphicsPixmapItem
i zapytania o obwiednię obszaru nieprzezroczystego (QGraphicsPixmapItem::opaqueArea().boundingRect()
). Nie jestem pewien, czy to najlepszy sposób, ale działa :) Może warto zagłębić się w kod źródłowy Qt, aby zobaczyć, jaki kod jest w jego sercu.
Poniższy kod wypisze szerokość i wysokość obrazu, a następnie przez szerokość i wysokość nieprzezroczystych części obrazka:
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() tworzy całą ścieżkę opisującą obszar. To powinno być wolniejsze niż proste obliczanie prostokąta granicznego. – ypnos
Mam nadzieję, że OP może opublikować wyniki czasowe. Byłbym zainteresowany, aby zobaczyć, ile czasu zajmuje obie opcje. Ale tak, w przypadku skomplikowanych obrazów mogę sobie tylko wyobrazić, że jest wolniejszy. –
Zrobiłem kilka trudnych chwil w moim ogólnym zadaniu bez tworzenia mikro-testu porównawczego. Podejście to wykorzystywało w zasadzie taką samą ilość czasu w ścianie jak moje zagnieżdżone pętle for, ale zabierało mniej czasu procesora. – retracile
- 1. Czy istnieje sposób na uzyskanie obwiedni (w pikselach) elementu DOM?
- 2. Czy Qt ma interfejs C?
- 3. Czy istnieje sposób na znalezienie nieużywanego CSS na stronie internetowej?
- 4. Czy istnieje sposób na znalezienie sumy cyfr 100 !?
- 5. Łatwy sposób na znalezienie Subtree w drzewie
- 6. Czy istnieje sposób na znalezienie ID Teamviewer w języku C#?
- 7. Czy to właściwy sposób na znalezienie sumy kontrolnej?
- 8. Czy istnieje szybki sposób na znalezienie brakujących końców w Ruby?
- 9. Skuteczny sposób na znalezienie długości wyliczenia flag?
- 10. Obrót obrazu w Qt
- 11. Inteligentny sposób na znalezienie kodowania ciągów znaków?
- 12. Szybki sposób na znalezienie następnej wielokrotności numeru
- 13. Skuteczny sposób na znalezienie liczbę kwot możliwych
- 14. Skuteczny sposób na znalezienie zamawianych par?
- 15. Ustawianie obrazu na etykiecie w Qt
- 16. powiększ mapView do pewnej obwiedni na osmdroidie
- 17. Najbardziej efektywny sposób na znalezienie sąsiadów na liście
- 18. Czy istnieje sposób na odtwarzanie plików MP3 w Qt 4.5?
- 19. czy rozdzielczość obrazu ma znaczenie dla przeglądarek?
- 20. Czy Qt ma coś równego modułowi Boost's assign?
- 21. Szybki sposób na znalezienie przyczyny niezakończonego ostrzeżenia o wykonaniu
- 22. Uzyskiwanie "wyświetlania" obwiedni przyciętego obiektu
- 23. Najlepszy sposób na znalezienie/zastąpienie w kilku plikach?
- 24. Najlepszy sposób na parsowanie HTML w Qt?
- 25. Sposób dokumentowania kodu źródłowego opartego na Qt
- 26. Czy istnieje przyzwoite polecenie Vim regexp OR? Jaki jest najlepszy sposób na znalezienie niedopasowanych, jeśli nie ma innych?
- 27. Qt. Najszybszy sposób rysowania 1024x1024 punktów na ekranie
- 28. Jaki jest najlepszy sposób na znalezienie odwrotności datetime.isocalendar()?
- 29. Sposób na znalezienie pasującego klina JavaScript w Chrome Devtools?
- 30. kernel: skuteczny sposób na znalezienie task_struct przez pid?
+1: Nice. Właśnie miałem spojrzeć na opcję scanLine(). –
To nie tak, że docenci docenili to dobrze. Zajęło mi to pół roku, żeby się o tym dowiedzieć. – ypnos
Zrobiłem kilka trudnych chwil w moim ogólnym zadaniu bez tworzenia mikro-testu porównawczego. Podejście to wykorzystywało zasadniczo tę samą ilość czasu procesora, co rozwiązanie Arnolda, ale zmniejszyło czas zegara ściennego. – retracile