PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → Assemblage DotNet   et Directshow  pour caméra Ueye
Assemblage DotNet et Directshow pour caméra Ueye
Débuté par titioun, 13 mai 2017 11:51 - 14 réponses
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 13 mai 2017 - 11:51
bonjour,

j'essaye de recupérer le signal video d'une caméra USB 2 IDS uEye.

Dans un premier temps j'ai utilisé le driver directshow dans un champ caméra. il permet de lire, enregistrer des vidéos et voir en live l'image;

Je voudrais aller un peu plus loin en particulier pouvoir enregistrer des images en sélectionnant une région (ROI region of interest ou AOI)
Je n'ai pas trouvé (ou je ne sais pas) une solution avec le champ caméra de Windev.

Je m'oriented donc vers l'assemblage dotnet mais c'est pas facile à utiliser vu mon niveau.

Pouvez-vous m'aider au démarrage.

J'ai ajouter un champ dotnet à ma fenetre est instancié une "camera"

Voici la procédure d'utilisation de l'assemblage donnée par le fabricant

1.Create a uEye .NET object, e.g.
uEye.Camera cam = new uEye.Camera();
2.Now you can start working with the .NET interface.
Capturing the first image
1.Initialize the camera: cam.Init();
2.Allocate an default image memory: cam.Memory.Allocate(out s32MemId);
You can also allocate an image memory by using: cam.Memory.Allocate();
3.Capture a live image with cam.Acquisition.Capture(s32Wait); or a single image with cam.Acquisition.Freeze(s32Wait);
With s32Wait = uEye.Defines.DeviceParameter.Wait the image acquisition waits until an image is captured and returns afterwards. With s32Wait = uEye.Defines.DeviceParameter.DontWait the image acquisition returns immediately.
4.Display the image on the screen: cam.Display.Render(uEye.Defines.DisplayRenderMode mode)
mode selects different rendering modes, e.g. mode = uEye.Defines.DisplayRenderMode.FitToWindow.


J'ai fait :
clCam_Ueye est un uEye.Camera()
clCam_Ueye.Init()

clCam_Ueye.Memory.Allocate()

clCam_Ueye.Display.Render(uEye.Defines.DisplayRenderMode.FitToWindow)


et j’obtiens le code erreur

Que s'est-il passé ?
L'invocation de la méthode <Render(uEye.Defines.DisplayRenderMode)> du type <Status> a échoué
Le framework .NET a renvoyé l'erreur suivante :
La référence d'objet n'est pas définie à une instance d'un objet.


Pourriez-vous m'aider à traduire le démarrage de code svp

Merci
Posté le 13 mai 2017 - 16:41
hello,

d'après le message d'erreur tu passes à la méthode render une référence vide.

Je pense qu'il manque quelque chose à ta méthode display.render , comme l'identifiant renvoyé par cam.Memory.Allocate(out s32MemId) et le handle de ton champ où tu veux faire afficher les images.

A définir dans la structure mode attendu en paramètre ? mais ça c'est plus le mode d'affichage d'après ce que je comprends, as tu plus de doc ?

Peut être peux tu essayer ceci en ajoutant la phase capture :

mon_id est un entier système
mon_handle est un entier
ma_capture est un entier

clCam_Ueye est un uEye.Camera()
clCam_Ueye.Init()

mon_id=clCam_Ueye.Memory.Allocate()
mon_handle = handle(champimage)

ma_capture= = uEye.Defines.DeviceParameter.Wait // on attend pas

cam.Acquisition.Capture(ma_capture) // capture

clCam_Ueye.Display.Render(mon_id,mon_handle,uEye.Defines.DisplayRenderMode.FitToWindow)


vala
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 14 mai 2017 - 08:42
hello,

j'ai essayé le code suivant car j'obtiens un message d'erreur avec mon_id et ma_capture (impossible d'affecter un objet dotnet à un entier)
mon_id est un entier système
mon_handle est un entier système
ma_capture est un entier système

clCam_Ueye est un uEye.Camera()
clCam_Ueye.Init()

SELON clCam_Ueye.get_IsOpened()
CAS Vrai
Info("Caméra connectée")
AUTRE CAS

FIN

//mon_id=clCam_Ueye.Memory.Allocate()
mon_handle = Handle(IMG_Cam)

//ma_capture= uEye.Defines.DeviceParameter.Wait // on attend pas

clCam_Ueye.Acquisition.Capture(uEye.Defines.DeviceParameter.Wait) // capture
clCam_Ueye.Display.Render(clCam_Ueye.Memory.Allocate(),mon_handle,uEye.Defines.DisplayRenderMode.FitToWindow)


cela ne plante pas mais la capture n'est pas renvoyée vers le champ image.


Je me demande si je ne devrais pas chercher vers DirectShow.

Cordialement
Posté le 14 mai 2017 - 17:49
Re,

je pense que tu n'es pas loin ...

A priori tout est ok, cela viendrait donc de windev ( il faut quand même vérifier ce que te renvoie display.render)

Plutôt que de récupérer l'identifiant du champ via la fonction handle(), essaie d'utiliser ddebutdessin qui va te permettre de récupérer l'identifiant du champ et indiquer à windev que tu vas dessiner / modifier un champ image.

comme ceci : mon_handle = ddebutdessin(IMG_Cam,deffacer).

Et regarde si en troisième paramètre de la méthode display.render qu'il me semble être le mode de rendu si il n'y a pas autre chose que uEye.Defines.DisplayRenderMode.FitToWindow

Bon courage !
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 15 mai 2017 - 12:17
Bonjour,

j'ai essayé mais sans succès.
Il y a bien plein de constantes Normal, MirrorUpDown,DownScale_1_2,PlanarColorBlue,Rotate_90...
que j'ai essayées sans plus de succès.

Et pas de plantage ce qui est surprenant.

Peut être une autre piste ?


Merci d'avance
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 15 mai 2017 - 14:34
Coucou,

3.Capture a live image with cam.Acquisition.Capture(s32Wait); or a single image with cam.Acquisition.Freeze(s32Wait);
With s32Wait = uEye.Defines.DeviceParameter.Wait the image acquisition waits until an image is captured and returns afterwards. With s32Wait = uEye.Defines.DeviceParameter.DontWait the image acquisition returns immediately.


Te manques as sa ?

Que s'est-il passé ?
L'invocation de la méthode <Render(uEye.Defines.DisplayRenderMode)> du type <Status> a échoué
Le framework .NET a renvoyé l'erreur suivante :
La référence d'objet n'est pas définie à une instance d'un objet

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 15 mai 2017 - 14:41
Coucou,

Tu devrais essayer d utiliser la variable d affectation

Le WLangage propose l'inférence de type à partir de la version 18. Par exemple le code :

https://forum.pcsoft.fr/fr-FR/pcsoft.fr.windev/163494-inference-type-soit-variable-valeur/read.awp

sPile est une chaîne
sPile = dbgInfo(dbgPile)
peut avantageusement être Remplace par :

soit sPile = dbgInfo(dbgPile)



Frédéric G
A priori tout est ok, cela viendrait donc de windev - Non, pour l editeur UML -> oui, mais la non ;o


Plutôt que de récupérer l'identifiant du champ via la fonction handle(), essaie d'utiliser ddebutdessin qui va te permettre de récupérer l'identifiant du champ et indiquer à windev que tu vas dessiner / modifier un champ image.

comme ceci : mon_handle = ddebutdessin(IMG_Cam,deffacer).

-> Non. Et du coup pourquois ? parceque Handle renvent une reference, pas un identifiant.

Et regarde si en troisième paramètre de la méthode display.render qu'il me semble être le mode de rendu si il n'y a pas autre chose que uEye.Defines.DisplayRenderMode.FitToWindow

Putain, t es vraimment convaincu que c de la faute d un autre !

--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
Membre enregistré
948 messages
Popularité : +30 (92 votes)
Posté le 15 mai 2017 - 14:57
Coucou,
je pense que c juste que tu t embrouille pour rien .-)

// 2.1
// Initialize the camera: cam.Init()
clCam_Ueye est un uEye.Camera()
clCam_Ueye.Init()

// 2.2
// Allocate an default image memory: cam.Memory.Allocate(out s32MemId);
// You can also allocate an image memory by using: cam.Memory.Allocate();
soit mon_id=clCam_Ueye.Memory.Allocate()

// 3.Capture a live image with cam.Acquisition.Capture(s32Wait); or a single image with cam.Acquisition.Freeze(s32Wait);
// With s32Wait = uEye.Defines.DeviceParameter.Wait the image acquisition waits until an image is
// captured and returns afterwards. With s32Wait = uEye.Defines.DeviceParameter.
// DontWait the image acquisition returns immediately.

//ma_capture= uEye.Defines.DeviceParameter.Wait // on attend pas
clCam_Ueye.Acquisition.Capture(uEye.Defines.DeviceParameter.Wait) // capture <=- Tu attend aussi

// uEye.Defines.DeviceParameter ?

// 4.Display the image on the screen: cam.Display.Render(uEye.Defines.DisplayRenderMode mode)
// mode selects different rendering modes, e.g. mode = uEye.Defines.DisplayRenderMode.FitToWindow.

soit mon_handle = Handle(IMG_Cam)
clCam_Ueye.Display.Render(mon_id,mon_handle,uEye.Defines.DisplayRenderMode.FitToWindow)

// clCam_Ueye.Display.Render(uEye.Defines.DisplayRenderMode.FitToWindow) ?


--
Charly CanDo.
Forg en Nouvelle-Zélande ;-) - In üs we trust
Message modifié, 15 mai 2017 - 15:11
Posté le 15 mai 2017 - 15:47
bonjour,

J'ai téléchargé un exemple en VB


Pour l'affichage la première valeur passée en paramètre à Display.render est obtenue via GetActive

Camera.Memory.GetActive(out s32MemID);
Camera.Display.Render(s32MemID, displayHandle, uEye.Defines.DisplayRenderMode.FitToWindow);

pour l'identifiant /reference / valeur du champ destination je pencherai plutôt pour ddebutdessin() que pour handle().

pour le displayrendermode essaie 1 (normal) :







à priori pour la capture Camera.Acquisition.Capture() suffit.

// Open Camera and Start Live Video
if (Camera.Acquisition.Capture() == uEye.Defines.Status.Success)
{
bLive = true;
}

tu peux également tester à ne récupérant qu'une image :





Voila tiens moi au courant c'est toujours sportif les assemblages .net ...
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 15 mai 2017 - 16:52
Merci beaucoup.

J'ai testé le code suivant qui fonctionne.
mon_handle est un entier système

pclCam_Ueye est un uEye.Camera dynamique

pclCam_Ueye = allouer un uEye.Camera

mon_handle = Handle(IMG_Cam)

pclCam_Ueye.Init(0,EntierSystèmeVersEntier(mon_handle))
pclCam_Ueye.Memory.Allocate()
pclCam_Ueye.Acquisition.Capture(uEye.Defines.DeviceParameter.Wait) // capture
pclCam_Ueye.Display.AutoRender.SetEnable(True)


je peux maintenant aller plus loin.

merci
Posté le 15 mai 2017 - 17:28
Super !!!
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 16 mai 2017 - 14:20
Et quelques améliorations pour qu'il soit plus propre en intégrant la classe Status de la caméra.
mon_handle est un entier système
mon_handle = Handle(IMG_Cam)
// Open Camera

clStatusRet<-clCam_Ueye.Init(0,EntierSystèmeVersEntier(mon_handle))
IF (clStatusRet <> uEye.Defines.Status.SUCCESS) THEN
Info("Camera initializing failed")

END
//Allocate Memory
clStatusRet<-clCam_Ueye.Memory.Allocate()
IF (clStatusRet <> uEye.Defines.Status.SUCCESS) THEN
Info("Allocate Memory failed")

END

//Start Live
clStatusRet<-clCam_Ueye.Acquisition.Capture(uEye.Defines.DeviceParameter.Wait) // capture
IF (clStatusRet <> uEye.Defines.Status.SUCCESS) THEN
Info("Start Live Video failed")
ELSE
gbLive = True
clCam_Ueye.Display.Render(mon_handle,uEye.Defines.DisplayRenderMode.FitToWindow)
clCam_Ueye.Display.AutoRender.SetEnable(True)

END
Message modifié, 16 mai 2017 - 14:21
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 17 mai 2017 - 18:40
Bonjour

j'ai encore besoin d'un coup de main pour récupérer les paramètres de ma caméra.
je n'arrive pas à traduire .

je ne parviens pas à déclarer un " range "
Quand je liste l'explorateur d'objet de la classe uEye.types je vois l'objet Range<T> qui contient des membres get-Maximum() , get-Minimum

:
uEye.Types.Range<Double> range;

statusRet = m_Camera.Timing.Framerate.GetFrameRateRange(out range);

Int32 s32Steps = Convert.ToInt32((range.Maximum - range.Minimum) / range.Increment);


Pouvez-vous m'aider svp.
Merci
Posté le 17 mai 2017 - 23:26
hello,

l'aventure continue, on vise les J.O...

La classe Range à un constructeur qui ne prend aucun paramètre, normalement tu devrais t'en sortir comme ça :

mon_range est un "uEye.Types.Range<System.Double>"

et ensuite pointer sur son adresse (ou pas) avec la méthode GetFrameRateRange

statusRet = m_Camera.Timing.Framerate.GetFrameRateRange(&mon_range);

sur un malentendu ça peut marcher...
Membre enregistré
92 messages
Popularité : +2 (2 votes)
Posté le 18 mai 2017 - 18:32
J'aimerais bien être un champion mais on ne fait pas un cheval de course avec un âne.

J'ai pas réussi avec le type Range mais heureusement il existe un autre méthode qui renvoie directement des rééls sur 4 octets MIN MAX et incrément.

Procedure Check_Exposure_Range()


clStatusRet<-clCam_Ueye.Timing.Exposure.GetRange(gtab_Exposure[1],gtab_Exposure[2],gtab_Exposure[3])
IF (clStatusRet <> uEye.Defines.Status.SUCCESS) THEN
Info("Camera Get Exposure Range failed")

END
//On récupère la valeur actuelle
clStatusRet<-clCam_Ueye.Timing.Exposure.Get(grExposure)


IF (clStatusRet <> uEye.Defines.Status.SUCCESS) THEN
Info("Camera Exposure Get failed")

END


Merci encore