PC SOFT

FORUMS PROFESSIONNELS
WINDEVWEBDEV et WINDEV Mobile

Accueil → WINDEV 2024 → assemblage .net aforge : conversion vers windev
assemblage .net aforge : conversion vers windev
Débuté par BBF, 16 mai 2014 14:26 - 17 réponses
Membre enregistré
148 messages
Popularité : +3 (3 votes)
Posté le 16 mai 2014 - 14:26
bonjour
suite à un lien fourni par Jurrasic Pork
je m'attèle à utiliser l'assemblage .net aforge.
j'ai intégré les assemblages.
àsavoir
AForge.Video
AForge.Video.DirectShow
AForge.Controls

j'ai posé sur une fenêtre un contrôle dotnet en faisant référence au control video
aforge.controls.videosourceplayer

videoDevices est un FilterInfoCollection(FilterCategory::VideoInputDevice)
ListeSupprimeTout(COMBO_test)
SI videoDevices:Count > 0 ALORS
POUR I=1 _A_ videoDevices:Count
ListeAjoute(COMBO_test, videoDevices:get_Item(I-1):Name)
FIN
FIN

permet de lister les webcams dans une combo.

voici un exemple en vb.net
Dim VideoCaptureSource As VideoCaptureDevice
Dim VideoDevices As New FilterInfoCollection(FilterCategory.VideoInputDevice)
VideoCaptureSource = New VideoCaptureDevice(VideoDevices(COMBO_test.SelectedIndex).MonikerString)


c'est précisément cette dernière ligne que je tente de traduire.

j'ai fait un tout bête :

VideoDevices est un FilterInfoCollection(FilterCategory::VideoInputDevice)
Videocapturesource est un VideoCaptureDevice(COMBO_test..ValeurAffichée)


qui ne bug pas, mais une fois que j'ai fait le start via

DOTNET_VideoSourcePlayer.VideoSource = Videocapturesource
DOTNET_VideoSourcePlayer.Start()


m'affiche dans le contrôle DOTNET, le message suivant : "Video was stopped"

Je me doute que j'utilise très mal l'assemblage.
Mais si toutefois qqun pouvait m'aiguiller, ca serait sympa
merci
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 17 mai 2014 - 00:25
hello BBF,
effectivement avec le contrôle VideoSourcePlayer de AFORGE on peut visualiser la vidéo d'une webcam dans un contrôle dotnet windev mais attention, le son n'est pas géré. Concernant ton problème tu n'étais pas loin de la vérité mais pour videocapturesource tu utilisais la propriété Name alors qu'il faut utiliser la propriété MonikerString. Cela ne suffisait pas car au lieu d'avoir Video was stopped tu aurais eu connecting... mais pas d'image. Il faut rajouter des dll AForge pour enlever ce problème.
En résumé pour que cela marche voici ce qu'il faut faire :
Ajouter les assemblages AForge, AForge.Controls, AForge.Imaging, AForge.Imaging.Formats, AForge.Video, AForge.Video.DirectShow
Ajouter dans sa fenêtre un champ dotnet [B]DOTNET_VideoSourcePlayer[/B] avec comme classe le contrôle VideoSourcePlayer.
Passer la ligne suivante dans le code d'initialisation du projet plutôt que l'initialisation de la combo :
videoDevices est un FilterInfoCollection(FilterCategory::VideoInputDevice)


le code d'initialisation de la combo :
ListeSupprimeTout(MoiMême)
SI videoDevices:Count > 0 ALORS
POUR I=1 _A_videoDevices:Count
ListeAjoute(MoiMême, videoDevices:get_Item(I-1):Name)
FIN
FIN


le code de Sélection de ligne de la Combo :
ChaineMoniker est une chaîne = videoDevices:get_Item(MoiMême-1):MonikerString
Videocapturesource est un VideoCaptureDevice(ChaineMoniker )
DOTNET_VideoSourcePlayer.VideoSource = Videocapturesource
DOTNET_VideoSourcePlayer.Start()


Ami calmant, J.P
Membre enregistré
148 messages
Popularité : +3 (3 votes)
Posté le 19 mai 2014 - 08:10
Bonjour

et merci pour le coup de main.

Jurassic Pork a écrit :
> avec le contrôle VideoSourcePlayer de AFORGE on peut visualiser la vidéo d'une webcam dans un contrôle dotnet windev mais attention, le son > n'est pas géré.

mince, ça ne m'arrange pas.
je cherche justement un moyen de sélectionner une webcam, puis de visionner, enregistrer la vidéo avec le son.

à ton avis, y a t'il un moyen de l'avoir ?
peut etre en combinant aforge pour la selection et l'usage de ton composant pour lire et enregistrer la webcam ?

ps : sans passer par l'exemple fourni par pcsoft, qui ne permet pas la sélection et qui de toute facon ne fonctionne pas sur tous les pcs.
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 19 mai 2014 - 13:50
hello,
oui en fait le mieux c'est de combiner mon exemple de la classe clibvlc et l'assemblage AForge.Video.directshow pour la sélection de la webcam. Surtout que l'exemple possède déjà de quoi enregistrer la video ( en wmv sinon il faut régler les paramètres dans options).
La modification pour le démarrage de la webcam serait du genre :
LesOptions est une chaîne = EOT
// Tempo sinon cela ne marche pas à tous les coups
Multitâche(10)
oVLC:StopPlay()
oVLC:PlaylistClear()
LesOptions = ":dshow-vdev=" + Combo[Combo] + TAB + ":dshow-adev=" + Combo[Combo]
// AddTarget pour version vlc 2.0
// oVLC:AddTarget("dshow://",LesOptions)
// AddLocation pour version vlc 2.1
oVLC:AddLocation("dshow://",LesOptions)
oVLC:SetHWND(Handle(IMG_Vidéo))
oVLC:Play()
oVLC:PositionSet(0)


Attention utiliser AddTarget ou AddLocation suivant la version de vlc et la classe que tu utilises.

Ami calmant, J.P
Membre enregistré
5 messages
Posté le 07 octobre 2014 - 17:07
Bonjour,

J'aimerais faire pour le moment une simple capture d'image ou un enregistrement d'une vidéo à partir d'une webCam d'une tablette (soit celle de devant soit celle de derrière)

J'ai d'abord utilisé le champ caméra et Videocapture mais je rencontre plusieurs :
- si utilisation de directshow => je ne peut pas choisir ma caméra et l'enregistrement d'une vidéo ne fonctionne pas
- si utilisation les API 'Video for Windows' => j'ai le message d'erreur "erreur de l'API vidéo lors de l'appel à la fonction '?????'"

Donc je me suis penché sur l'assemblage AForge mais je rencontre déjà des difficultés sur la capture d'image
Dans les forums j'ai vu le code suivant :

private void button1_Click(object sender, EventArgs e)
{
cam = new VideoCaptureDevice(webcam[comboBox1.SelectedIndex].MonikerString);
cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
cam.Start();
}
void cam_NewFrame(object sender, NewFrameEventArgs eventArgs)
{
bitmap = (Bitmap)eventArgs.Frame.Clone();
pictureBox1.Image = bitmap;
}
private void pictureBox1_Click(object sender, EventArgs e)
{
pictureBox1.Image = bitmap;
}

Mais je bloque sur la traduction en WinDev de
cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);

je l'ai traduite par :
cam.NewFrame += DotNetDélégué("gf_Capture","VideoSourcePlayer.NewFrameHandler")

mais j'ai le message suivant :
L'objet de type <WL.CWLDelegate_void_VideoSourcePlayer_NewFrameHandler_object_System_Drawing_Bitmap&> (assemblage <D:\Développement\Sources\Mes Projets\Camera\Exe\TestAForge.dll>) n'a pas pu être créé

Merci de votre aide
Membre enregistré
283 messages
Popularité : +3 (3 votes)
Posté le 10 octobre 2014 - 09:45
Bonjour,

Depuis la découverte de cette conversation, ça fait plus d'une semaine que je me suis penché sur l'assemblage AForge.

Pourquoi ? Parce que, avec les fonctions WD Vidéoxxx() il n'est pas possible d'avoir le "nom" des caméras mais seulement un "nom de driver".
Proposer à un utilisateur de choisir une caméra d'après un driver tel que "Microsoft WDM Image Capture (Win32)" ça ne fait pas très pro !!!
Après moultes recherches, j'ai trouvé un code VB6 qui peut aider à récupérer les noms :
https://social.msdn.microsoft.com/Forums/vstudio/en-US/c4fd12d8-2870-47ed-8f2e-3dc613afeb6f/selecting-a-particular-webcam…
C'est parce que ça fait un peu "bricolo" que je me suis tourné vers l'assemblage AForge.

Ton problème : cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
traduite par : cam.NewFrame += DotNetDélégué("gf_Capture","VideoSourcePlayer.NewFrameHandler")

D'après la doc, l'évènement est déclenché A CHAQUE IMAGE de la vidéo pour ajouter un sous-titrage, par exemple, à la vidéo.

Pour prendre UNE SEULE PHOTO (snapshot) il existe une méthode : AForge.Controls.VideoSourcePlayer.GetCurrentVideoFrame()

Ce que j'ai fait avec un champ .NET appelé DOTNET_VideoSourcePlayer : (352, 288) c'est la taille de la photo à connaître à l'avance.
clImgbitmap est System.Drawing.Bitmap(DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)
clImgbitmap contient l'image. Pour l'enregistrer, méthode SAVE() de Bitmap :
clImgbitmap.Save("C:\Users\admin\temp\MaphotoNET.jpg", system.Drawing.Imaging.ImageFormat.Jpeg)

2 choses m'em...bêtent :
1 ) Je ne sais pas et je ne suis pas arrivé à déclarer clImgbitmap isolé à part (donc impossible de faire une boucle pour plusieurs caméras à cause de la REdéclaration de l'objet Bitmap clImgbitmap , [pas testé non plus])
2 ) Je ne sais pas et je ne suis pas arrivé à récupérer l'objet Bitmap clImgbitmap pour le copier dans une variable WD Image ou dans un champ WD Image (donc obligé d'utiliser la méthode SAVE() de Bitmap et du taf en sus si on veut gérer la qualité JPG par exemple)

Si tu as des soluces pour moi sur ces 2 problèmes... Merci. J'espère que mon VideoSourcePlayer.GetCurrentVideoFrame() te fera avancer.

Jurassic Pork, si tu passes par ici et que tu ais un commentaire à faire, merci aussi (je sais que tu es balaise dans les proc "bas niveau" et autres API.

Bon dev à tous et A+
Tony
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 10 octobre 2014 - 11:02
hello tony,
avec ça tu devrais t'en sortir :
// J.P Octobre 2014
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)
// clImgbitmap contient l'image
// IMG_CaptureVideo est un champ image
dcimg est un entier = dDébutDessin(IMG_CaptureVideo)
hdcCompatible est un entier = API("gdi32","CreateCompatibleDC",dcimg)
API("gdi32","SelectObject",hdcCompatible,clImgbitmap.GetHBitmap())
// pour copier le bitmap du champ dotnet video vers le champ image
API("gdi32","BitBlt",dcimg,0,0,352,288,hdcCompatible,0,0,0x00CC0020)
// pour rafraîchir le champ image
API("user32","InvalidateRgn",Handle(IMG_CaptureVideo),0,True)
;)

--
Ami calmant, J.P
Posté le 11 octobre 2014 - 12:03
Bonjour J.P.

Merci beaucoup. Ton code est "nickel-chrome" et marche très bien.

Entre-temps j'ai trouvé un code source qui fait la même chose sans API (à première vue).
Je l'ai adapté au WL : voir plus loin le résultat, ça peut servir à d'autres personnes.

Le top serait de pouvoir récupérer directement l'image (frame) à partir du "Videocapturesource" sans avoir le champ .NET d'affichage (DOTNET_VideoSourcePlayer). Question d'alléger le prog et peut-être de l'utiliser en "service windows" ou dans des threads (pas de fenêtres), etc...

Mais là, je pense qu'on retombe sur le problème de Mick85 :
cam.NewFrame += new NewFrameEventHandler(cam_NewFrame);
cam.NewFrame += DotNetDélégué("gf_Capture","VideoSourcePlayer.NewFrameHandler")

Bon, ci-dessous mon nouveau code :
taille_TableauBytes est un entier
TableauBytes est tableau d'entiers sans signe sur 1// tableau de bytes
BufferBytes est Buffer//
VariableImgageWD est WL.Image// variable Image WD
MemStream est MemoryStream()// MemoryStream de .NET

// DOTNET_VideoSourcePlayer est un champ .NET associé à la classe AForge.Controls.VideoSourcePlayer
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)
// clImgbitmap contient maintenant l'image

clImgbitmap.Save(MemStream, ImageFormat.Bmp)// pas de compression jpg ou png
TableauBytes = MemStream.ToArray()// copie de MemoryStream vers TableauBytes

taille_TableauBytes = Dimension(TableauBytes)// récupère la taille du tableau de Bytes
// il n'est pas possible d'utiliser une chaîne à la place du buffer !!!
BufferBytes = Complete(BufferBytes, taille_TableauBytes, Caract(0)) // remplit le buffer de 0
Transfert(&BufferBytes,&TableauBytes, taille_TableauBytes) // copie de TableauBytes vers le buffer

VariableImgageWD = BufferBytes// Affecte le buffer à la variable image WD

SI VariableImgageWD.Valide ALORS// teste si le buffer passé correspond à une image valide
IMG_CaptureVideo = VariableImgageWD// affiche dans le champ Image IMG_CaptureVideo
FIN


Bon dev et A+
Tony
Membre enregistré
283 messages
Popularité : +3 (3 votes)
Posté le 14 octobre 2014 - 17:06
Bonjour,

Pour ceux qui sont intéressés, j'ai modifié légèrement mon dernier code (basé sur celui de Jurassic Pork) car j'ai eu des erreurs d'exception.
En effet, "DOTNET_VideoSourcePlayer.GetCurrentVideoFrame()" renvoie parfois un NULL s'il n'arrive pas à "capturer" une image.
Le NULL affecté à "clImgbitmap" (qui est un "System.Drawing.Bitmap dynamique") génère l'exception.
Donc à la place de :
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)

J'ai maintenant :
NbreFois est entier
objBitmap est un Variant = Null
TANTQUE objBitmap = Null ET NbreFois < 10
NbreFois++ // NbreFois pour éviter une boucle infinie
Multitâche(-10)
objBitmap = DOTNET_VideoSourcePlayer:GetCurrentVideoFrame()
FIN
SI objBitmap <> Null ALORS
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(objBitmap, 352, 288)
// objBitmap remplace : DOTNET_VideoSourcePlayer.GetCurrentVideoFrame()
// etc ......
FIN

Bon dev et A+
Membre enregistré
283 messages
Popularité : +3 (3 votes)
Posté le 14 octobre 2014 - 18:55
Re-bonjour,

Au final je me suis penché sur la possibilité de récupérer une image sans avoir une zone d'affichage (sans champ DOTNET).
L'idée est de récupérer le "Bitmap" généré après le déclenchement de l'événement "NewFrame" (pour chaque image de la caméra).
A l'inverse de Mick85 (voir son post plus haut) je n'ai aucune erreur, tous mes codes de mise en place de l'événement passent bien mais......
Ma procédure callback n'est jamais appelée !!!
J'ai cherché du côté du "DotNetDélégué" et des "delegate" en C# (que je ne connais pas) mais je n'ai pas trouvé mon bonheur.
Peut-être y a t-il une propriété pour "démarrer" l'événement mais je ne vois pas laquelle.

Je mets le code simplifié ci-dessous. Si quelqu'un peut m'aiguiller... Merci (Je pense fortement à toi Jurassic Pork qui semble bien connaître l'assemblage "Aforge").
VideoDevices est un FilterInfoCollection(FilterCategory::VideoInputDevice)
VideoSource est un VideoCaptureDevice

SI VideoDevices:Count < 1 ALORSRETOUR
// prépare pour l'affichage
VideoSource:Source = VideoDevices:get_Item(0):MonikerString
DOTNET_VideoSourcePlayer:VideoSource = VideoSource
// prépare l'évènement
// j'ai testé une après l'autre toutes les lignes ci-dessous sans succès
VideoSource:add_NewFrame(DotNetDélégué("Proc_traiter_IMG", "NewFrameEventHandler"))
VideoSource:NewFrame += DotNetDélégué("Proc_traiter_IMG", "NewFrameEventHandler")
DOTNET_VideoSourcePlayer:add_NewFrame(DotNetDélégué("Proc_traiter_IMG", "NewFrameEventHandler"))
DOTNET_VideoSourcePlayer:newframe += DotNetDélégué("Proc_traiter_IMG", "NewFrameEventHandler")
// et aussi
clEventHandler est un NewFrameEventHandler dynamique
clEventHandler = DotNetDélégué("Proc_traiter_IMG", "NewFrameEventHandler")
VideoSource:add_NewFrame(clEventHandler)
// et aussi.........d'autres
//
// on démarre l'affichage
VideoSource:Start()

Bon dev à tous et A+
Tony
Membre enregistré
962 messages
Popularité : +183 (185 votes)
Posté le 17 octobre 2014 - 01:01
hello Tony,
je crois que ton problème est peut-être dû au fait que ta procédure Proc_traiter_IMG est locale ?
Moi j'avais le même problème que Mick85 c'est à dire l'erreur :
L'objet de type <WL.CWLDelegate_void_VideoSourcePlayer_NewFrameHandler_object_System_Drawing_Bitmap&> (assemblage <D:\Développement\Sources\Mes Projets\Camera\Exe\TestAForge.dll>) n'a pas pu être créé

quand je lançais l'appli en mode debug (WDTest) . Quand je lance l'exécutable directement je n'ai pas ce problème.
Je ne suis pas du tout certain que ta routine sans utilisation des api windows soit plus performante. Je ne peux pas la tester car je suis en WD16 et je n'ai pas de variable image. Il faudrait que tu compares les performances avec l'analyseur de performance.
Finalement j'arrive au code suivant :
code du projet (Initialisation) :
Videocapturesource est un VideoCaptureDevice
videoDevices est un FilterInfoCollection(FilterCategory::VideoInputDevice)
CaptureActivée est un booléen = Faux


Procédure globale Proc_Traiter_IMG
Procedure Proc_Traiter_IMG(sender,trame)
SI PAS CaptureActivée ALORS RETOUR
Trace("Nouvelle Capture")
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(Fenêtre1.DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)
// clImgbitmap contient l'image
// IMG_CaptureVideo est un champ image
dcimg est un entier = dDébutDessin(Fenêtre1.IMG_CaptureVideo)
hdcCompatible est un entier = API("gdi32","CreateCompatibleDC",dcimg)
API("gdi32","SelectObject",hdcCompatible,clImgbitmap.GetHBitmap())
// pour copier le bitmap du champ dotnet video vers le champ image
API("gdi32","BitBlt",dcimg,0,0,352,288,hdcCompatible,0,0,0x00CC0020)
// pour rafraîchir le champ image
API("user32","InvalidateRgn",Handle(Fenêtre1.IMG_CaptureVideo),0,True)
Libérer clImgbitmap
CaptureActivée = Faux


Initialisation de la combo de choix de webcam :
ListeSupprimeTout(MoiMême)
SI videoDevices:Count > 0 ALORS
POUR I=1 _A_ videoDevices:Count
ListeAjoute(MoiMême, videoDevices:get_Item(I-1):Name)
FIN
FIN


Sélection d'une ligne de la combo :
SI DOTNET_VideoSourcePlayer.IsRunning ALORS DOTNET_VideoSourcePlayer.Stop()
ChaineMoniker est une chaîne = videoDevices:get_Item(MoiMême-1):MonikerString
Videocapturesource:Source = ChaineMoniker
DOTNET_VideoSourcePlayer.VideoSource = Videocapturesource
Videocapturesource:add_NewFrame(DotNetDélégué("Proc_Traiter_IMG", "NewFrameEventHandler"))
DOTNET_VideoSourcePlayer.Start()


et pour le bouton qui lance la capture tout simplement :
CaptureActivée = Vrai


Le principe :
Dès que l'on démarre la source vidéo les événements NewFrame arrivent mais dans la routine de traitement on ne fait rien (retour immédiat) car
la variable CaptureActivée est à faux. Quand on appuie sur le bouton de capture on déroule le traitement qui transfert la trame vidéo vers le champ image et à la fin on remet CaptureActivée à faux pour éviter de nouvelles captures.

--
Ami calmant, J.P
Membre enregistré
283 messages
Popularité : +3 (3 votes)
Posté le 18 octobre 2014 - 15:43
Mon cher ami Jurassic Pork (si je puis me permettre)

Merci mille fois, ça marche !!!

Mon problème ne venait pas de ce que la procédure "Proc_traiter_IMG" était locale ou pas mais parce que je lançais le debug (WDTest) sur une fenêtre isolée.
En la mettant en "Première fenêtre du projet" et en lançant le projet complet c'est OKayyyyyyyy.
Je peux désormais récupérer une image sans avoir besoin du champ d'affichage "DOTNET_VideoSourcePlayer".
En ce qui concerne les performances en utilisant ou pas les API c'est insignifiant car il me semble que c'est presque instantané donc je ne vais pas faire des tests pour gagner quelques millisecondes.

Encore merci, je ne sais pas si je serais arrivé sans toi.

Bon dev à tous et A+
Membre enregistré
5 messages
Posté le 20 octobre 2014 - 10:13
bonjour,
Tout d'abord merci à Toni et à Jurassic Pork pour vos réponses et je suis désolé de ne pas avoir donné de nouvelles plus tôt. Pour ma part et pour une question de répondre rapidement au besoin de mon client, j'ai gardé le champ caméra (DirectShow), et par chance la caméra par défaut est celle de derrière ce qui lui convient (pour le moment). En ce qui concerne la prise de vidéo, cela ne lui convenait pas non plus car les vidéos sont au format AVI et sont trop grosses.

Je vais étudié attentivement vos réponses et adapté mon programme.

Encore merci,
Posté le 24 février 2016 - 09:45
Bonjour à vous 2 et merci de partager vos trouvailles.
Suite à des soucis avec le champ Camera et Windows 10, j'ai regardé de près ce sujet et malheureusement je n'arrive pas à avoir l'image de la webcam.
Pour résumé, j'ai créé un projet avec un fenêtre en Windev 20 qui doit tourner sur des tablettes PC en Windows 10 (pas en mode Windows App Store).
Avec le champ Camera de Windev, l'application plante alors qu'en Windows 8 ca marchait.
L'application doit afficher l'apercu de la webcam en vidéo et prendre une photo lors de l'appui sur un bouton.

Dans un nouveau projet, j'ai ajouté les assemblages .NET :
Aforge, AForge.Controls, AForge.Imaging, AForge.Imaging.Formats, AForge.Video et AForge.Video.DirectShow (versions à jour du site AForge).
J'ai mis le code suivant dans l'initialisation du projet :
videoDevices est un FilterInfoCollection(FilterCategory::VideoInputDevice)

Dans une nouvelle fenêtre, j'ai ajouté une liste déroulante "COMBO_Source" pour sélectionner la caméra (la tablette possède 2 caméras : façade et dos).
J'ai mis le code suivant dans l'initialisation de la liste déroulante :
ListeSupprimeTout(MoiMême)
SI videoDevices:Count > 0 ALORS
POUR I=1 _A_ videoDevices:Count
ListeAjoute(MoiMême, videoDevices:get_Item(I-1):Name)
FIN
FIN

J'ai mis le code suivant dans sélection d'une ligne de la liste déroulante :
ChaineMoniker est une chaîne = videoDevices:get_Item(MoiMême-1):MonikerString
Videocapturesource est un VideoCaptureDevice(ChaineMoniker )
DOTNET_VideoSourcePlayer.VideoSource = Videocapturesource
DOTNET_VideoSourcePlayer.Start()

J'ai ajouté dans la fenêtre un champ .NET appelé "DOTNET_VideoSourcePlayer" dans la fenêtre. Ce champ est lié à la classe .NET "AForge.Controls.VideoSourcePlayer".
Lorsque je lance l'executable, je sélectionne la caméra dans la liste déroulante et le champ .NET affiche "Connecting..." et l'image reste grise.
Ou me suis-je trompé ?
Merci d'avance
Posté le 24 novembre 2016 - 08:54
bonjour

nous avons réussi à palier ce problème en compilant en 64 bits et en mettant les DLL AFORGE dans le rep exe

par contre on a pas encore trouvé comment pivoter l'image de la webcam ...
Posté le 12 juillet 2019 - 10:58
// J.P Octobre 2014
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)
// clImgbitmap contient l'image
// IMG_CaptureVideo est un champ image
dcimg est un entier = dDébutDessin(IMG_CaptureVideo)
hdcCompatible est un entier = API("gdi32","CreateCompatibleDC",dcimg)
API("gdi32","SelectObject",hdcCompatible,clImgbitmap.GetHBitmap())
// pour copier le bitmap du champ dotnet video vers le champ image
API("gdi32","BitBlt",dcimg,0,0,352,288,hdcCompatible,0,0,0x00CC0020)
// pour rafraîchir le champ image
API("user32","InvalidateRgn",Handle(IMG_CaptureVideo),0,True)
////
Message d'erreur :

'invocation de la méthode <GetCurrentVideoFrame()> du type <Bitmap> a échoué
Le framework .NET a renvoyé l'erreur suivante :
Impossible de charger le fichier ou l'assembly 'AForge, Version=2.2.5.0, Culture=neutral, PublicKeyToken=c1db6ff4eaa06aeb' ou une de ses dépendances. Le fichier spécifié est introuvable.
j'ai utilise Win7 framework 4.6.1 32 bits
Posté le 14 juillet 2019 - 12:39
j'ai besoin Code reconnaissance Faciale avec Windev
Posté le 09 août 2019 - 03:56
Thank all thé gentlemen and especially Jurassic Pork about all how to integrate the external API and deal with .NET Technology on This Powerful Tool PC-SOFT WIndev
SO ... now I am Trying to work on EmguCV with WIndev and I explorer in this forum in past . how to display a Picture Bitmap in Image Windev Control (Champ Image WIndev) ... and I see its so Hard to make this properly and many problems appear like Memory Leak with SelectObject Method in DLL gdi32 ...
clImgbitmap est un System.Drawing.Bitmap dynamique
clImgbitmap = allouer un "System.Drawing.Bitmap"(DOTNET_VideoSourcePlayer.GetCurrentVideoFrame(), 352, 288)
// clImgbitmap contient l'image
// IMG_CaptureVideo est un champ image
dcimg est un entier = dDébutDessin(IMG_CaptureVideo)
hdcCompatible est un entier = API("gdi32","CreateCompatibleDC",dcimg)
API("gdi32","SelectObject",hdcCompatible,clImgbitmap.GetHBitmap())
// pour copier le bitmap du champ dotnet video vers le champ image
API("gdi32","BitBlt",dcimg,0,0,352,288,hdcCompatible,0,0,0x00CC0020)
// pour rafraîchir le champ image
API("user32","InvalidateRgn",Handle(IMG_CaptureVideo),0,True)

SO ... the question why not use the .NET Controler (Champ .NET) and Select System.Windows.Forms and use the PicterBox controler instead to use all code about API and DLL to only Draw the Picture ....
Thank you so mutch