3 votes

Afficher les grandes images par DirectX plus rapidement ?

En tant que développeur d'applications de vision industrielle, j'ai souvent des images plutôt lourdes, de 6000x4000 pixels et plus.

Pendant que la caméra et le traitement d'image travaillent sur un flux constant de nouvelles images (et ce traitement est la tâche principale), je voudrais permettre à l'utilisateur de visualiser confortablement une autre image en parallèle.

Faire cela sur le processeur (GDI etc.) vole beaucoup trop de performance. Par exemple, il nous faut 0,2 seconde pour analyser l'image, mais 0,8 seconde pour l'afficher avec un seul zoom (redimensionné pour s'adapter à un contrôle), sans parler de laisser l'utilisateur se déplacer et plonger dans l'image.

Puisque Photoshop permet d'afficher et de zoomer à l'aide de la mémoire et du traitement très rapide de la carte graphique, je me demandais si quelqu'un pouvait me donner une idée si et comment je peux expérimenter ceci dans mon propre code : pousser les données vers la carte graphique (combien de temps cela peut prendre pour mes 76MB de données rgb ?) et les laisser s'afficher dans un contrôle sans grand effort de zoom et de déplacement par l'utilisateur vers le contrôle/la carte pour une interaction avec l'utilisateur.

Il n'est pas nécessaire d'avoir un aspect 3D, il suffit de se déplacer et de redimensionner dans une image 2D-rgb. L'objectif est de permettre une visualisation rapide et confortable avec une faible charge du processeur.

\==> Est-ce possible (sous forme de texture ou autre) ? ==> Y a-t-il des limitations avec les cartes 3D bas de gamme actuelles de >=256 Mo ? ==> Quelqu'un peut-il suggérer des durées à prévoir (copie de données, zoom) ?

2voto

snemarch Points 3328

Vous serez limité par la taille maximale des textures (qui varie d'une carte à l'autre). Vous devrez donc subdiviser votre grande image en plusieurs textures plus petites. La transmission des données de texture à votre mémoire vidéo devrait être assez rapide si la carte est AGP ou PCI-E.

1voto

unwind Points 181987

Quel est le format des pixels ? Votre taille semble correspondre au format RVB 8 bits. Une image unique de 6000x4000 pixels devrait donc occuper environ 69 Mo d'espace. Elle devrait donc tenir dans la mémoire de texture d'une carte graphique bas de gamme, en supposant qu'il n'y ait pas trop de surcharge de Windows et d'autres applications. Bien sûr, le téléchargement vers la mémoire de la carte graphique prendra un certain temps ; il est difficile de donner une estimation, car cela variera probablement en fonction de la charge du système et, bien sûr, de la configuration du matériel et du bus.

Je serais plus inquiet par la limite maximale de la taille des textures. Je pense que les cartes haut de gamme actuelles plafonnent à 4096x4096 texels dans une texture, ce qui signifie que vous ne pourriez pas faire tenir votre image dans une seule texture.

Configurer DirectX pour le tester ne devrait pas être trop difficile, il existe de nombreux tutoriels. Ici est un lien rapide montrant comment effectuer un rendu avec une texture ; consultez les parties précédentes de la même série de tutoriels pour voir comment initialiser les choses.

0voto

vartec Points 53382

Je vous recommande d'utiliser un format conçu spécifiquement pour ce genre de tâche. C'est JPEG2000 . Le site caractéristiques que vous voulez sont appelés ROI (Regions of Interest) et transmission progressive. Elle peut être sans perte si vous en avez besoin.

0voto

legalize Points 698

Vous pouvez le faire avec Direct3D. Il gérera facilement les grandes images pour les panoramiques et les zooms en dessinant un quadratique texturé.

En raison de la taille de vos images et de la taille de l'écran (vous n'avez pas un écran 6Kx4K, n'est-ce pas ?), vous voudrez créer un système pour paginer votre grande image en textures à la demande. Compte tenu de la taille de vos données d'entrée, je pense que vous trouverez que le facteur dominant dans la rapidité avec laquelle vous pouvez obtenir des choses dans la carte est la bande passante E/S entre le disque et la carte. Vous trouverez peut-être qu'il vaut la peine de créer un moyen de stocker les images sur le disque qui exploite la cohérence spatiale en deux dimensions (c'est-à-dire une disposition de stockage en mosaïque, et non une disposition de stockage en ligne de balayage) et de calculer des versions à basse résolution échantillonnées par points. Vous pouvez faire tout cela vous-même avec du RVB non compressé, vous n'avez pas besoin de JPEG2000 pour le faire. Vous pourriez faire ce stockage de données comme un processus de fond de faible priorité une fois qu'ils ont sélectionné une image. Mettez d'abord sur la carte ce qui sera visible à l'écran, puis commencez à réorganiser les données sur le disque pour accélérer le streaming/zoom.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X