2009-04-02 9 views
3

en tant que développeur d'applications de vision industrielle J'ai souvent des images plutôt maladroites comme 6000x4000Pixels et plus gros. Alors que l'appareil photo et le traitement d'image travaillent sur un flux régulier de nouvelles images (et ce traitement est la tâche principale), je voudrais permettre à l'utilisateur de voir confortablement une autre image en parallèle.Affichage de grandes images par DirectX plus rapidement?

Cette opération sur le processeur (GDI, etc.) entraîne trop de pertes de performance. Par exemple, il faut 0,2 secondes pour analyser l'image mais 0,8 seconde pour la montrer avec un seul zoom (redimensionné pour s'adapter à un certain contrôle), sans parler de laisser l'utilisateur se déplacer et y plonger. Comme 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 de la façon dont je pourrais expérimenter cela dans mon propre code: carte (combien de temps cela peut-il prendre pour mes 76 Mo de données rgb?) et laissez-le montrer dans un certain contrôle sans trop d'effort pour zoomer et déplacer dedans par l'utilisateur au contrôle/carte pour l'interaction de l'utilisateur.

Pas besoin de regarder en 3D, juste de déplacer et de redimensionner une image 2D-rgb. L'objectif est de permettre une visualisation rapide et confortable avec une faible charge de processeur.

==> Est-ce possible (comme texture ou quelque chose comme ça)? ==> 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 à attendre (copier des données, zoomer)?

Répondre

1

Quel est le format de pixel? Votre numéro de taille semble fonctionner avec ce RVB 8 bits, une seule image à 6000x4000 pixels devrait alors avoir besoin d'environ 69 Mo d'espace. Il devrait donc tenir dans la mémoire de texture d'une carte graphique de bas de gamme, en supposant qu'il n'y a pas trop de frais généraux de Windows et d'autres applications. Bien sûr, il faudra un certain temps pour télécharger vers la mémoire de la carte graphique; Il est cependant difficile de fournir une estimation car elle variera très probablement avec la charge du système et bien sûr avec la configuration matérielle/bus.

Je serais plus préoccupé par la limite maximale des tailles de texture. Je pense que les cartes haut de gamme d'aujourd'hui atteignent un maximum de 4096x4096 texels dans une texture, ce qui signifie que vous ne pourriez pas adapter votre image en une seule texture.

Configurer DirectX pour tester cela ne devrait pas être trop dur, il y a beaucoup de tutoriels autour. Here est un lien rapide montrant comment rendre avec la texture; consultez les parties précédentes de la même série de tutoriels pour voir comment initialiser des choses.

+0

l'image est disponible sous la forme de trois plans simples de gris 8 bits pour R, G et B. Le mélange d'une autre manière ne posera aucun problème. Donc la mémoire entre dans la mémoire mais pas sur une seule texture? Est-ce que placer deux avions côte à côte est une option ou va-t-il apporter des artefacts? Merci pour le lien et l'idée! –

+0

Placer un ou plusieurs plans l'un à côté de l'autre, en subdivisant les données d'image pour correspondre, est la solution évidente. Il devrait être possible de définir des modes de filtrage de texture pour éviter les artefacts. Vous êtes invités à upvote la réponse si cela vous a aidé. :) – unwind

0

Je vous recommande d'utiliser un format conçu spécifiquement pour ce type de tâche. C'est JPEG2000. Les features que vous voulez sont appelés ROI (régions d'intérêt) et transmission progressive. Il peut être sans perte si vous en avez besoin.

+0

Merci pour l'idée, mais le codage des données en JPEG2000 prend environ cinq secondes. Ce n'est pas une option car cela prend beaucoup trop de temps et de charge de processeur. –

+0

Vous ne pouvez pas stocker ou mettre en mémoire cache ces données dans JPEG2000? – vartec

+0

BTW. vous pouvez accélérer le GPU. Voir par exemple http://www.cse.cuhk.edu.hk/~ttwong/software/dwtgpu/dwtgpu.html – vartec

2

Vous allez être limité par la taille maximale de la texture (qui varie d'une carte à l'autre), vous devrez donc subdiviser votre grande image en plusieurs textures plus petites. Obtenir les données de texture réelles à votre mémoire vidéo devrait être très rapide tant que la carte est AGP ou PCI-E.

0

Vous pouvez le faire avec Direct3D. Il va facilement gérer de grandes images pour le panoramique et le zoom en dessinant un quad texturé.

En raison de la taille de vos images et de la taille de l'écran (vous n'avez pas d'écran 6Kx4K, vous voulez?), Vous voudrez créer un système de pagination de 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 vitesse à laquelle vous pouvez mettre des choses dans la carte est la bande passante d'E/S entre le disque et la carte.Vous trouverez peut-être utile de créer un moyen de stocker les images sur disque exploitant la cohérence spatiale en deux dimensions (mise en page en mosaïque et non mise en page scanline) et en calculant des versions à résolution inférieure échantillonnées ponctuellement. Vous pouvez faire tout cela vous-même avec RVB non compressé, vous n'avez pas besoin de JPEG2000 pour ce faire. Vous pouvez effectuer ce stockage de données en tant que processus d'arrière-plan de faible priorité une fois qu'ils ont sélectionné une image. D'abord, obtenez ce qui va être visible à l'écran dans la carte dès que possible, puis commencez à le réorganiser sur disque pour un streaming/zoom plus rapide.

Questions connexes