Jeu de périphérique de capture EmguCV
Im en utilisant la classe Capture
de EmguCV pour prendre des images à partir d'une WebCam.
Selon la documentation de la classe (http://www.emgu.com/wiki/files/2.0.0.0/html/18b6eba7-f18b-fa87-8bf2-2acff68988cb.htm), la Capture a 3 constructeurs.
À l'aide de public Capture()
son supposé utiliser la valeur par défaut de la caméra et qu'il fonctionne correctement.
Comme je l'ai vu dans un des exemples, semble que
public Capture(string fileName) //takes a video file as the source for the captures.
Le dernier constructeur est
public Capture(int camIndex) //which is supposed to "Create a capture using the specific camera"
J'ai essayé d'utiliser cette dernière constructeur afin de permettre à l'utilisateur de choisir l'appareil dans le cas où il a plus d'un appareil photo (par exemple, la caméra intégrée dans un ordinateur portable ou une caméra USB branché)
Mon problème est que je ne sais pas comment pour obtenir une liste des périphériques disponibles. Essayé de créer capte avec indice de 0 à 99 et essayer d'attraper un cadre attendre une exception, mais il faut juste une image noire avec le 100 captures. Aussi, lorsque j'utilise la valeur par défaut de la caméra, je ne sais pas comment pour obtenir son index.
Toute aide?
Edit: Avec l'info dans la réponse de la Shiva je l'ai eu à travailler avec cette (je l'ai poster pour de futures références):
private void onLoad(object sender, RoutedEventArgs e)
{
//Add the image processing to the dispatcher
this.Dispatcher.Hooks.DispatcherInactive += new EventHandler(dispatcherTimer_Tick);
//Get the information about the installed cameras and add the combobox items
DsDevice[] _SystemCamereas = DsDevice.GetDevicesOfCat(FilterCategory.VideoInputDevice);
Video_Device[] WebCams = new Video_Device[_SystemCamereas.Length];
for (int i = 0; i < _SystemCamereas.Length; i++)
{
WebCams[i] = new Video_Device(i, _SystemCamereas[i].Name, _SystemCamereas[i].ClassID); //fill web cam array
ComboBoxDevices.Items.Add(WebCams[i].ToString());
}
}
private void dispatcherTimer_Tick(object sender, EventArgs e)
{
if (capture != null)
{
//Capture an image
Image<Bgr, byte> img = capture.QueryFrame();
//Show the image in the window
ImageOriginal.Source = ImageProcessor.ToBitmapSource(img);
}
}
private void ComboBoxDevices_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
//If there is already a capture, dispose it
if (capture != null)
{
capture.Dispose();
}
//Get the selected camera
int selectedDevice = ComboBoxDevices.SelectedIndex;
try
{
//Create new capture with the selected camera
capture = new Capture(selectedDevice);
}
catch (Exception excpt)
{
MessageBox.Show(excpt.Message);
}
}
OriginalL'auteur Evans | 2013-06-18
Vous devez vous connecter pour publier un commentaire.
La capture de l'objet peut être utilisé pour donner les fichiers statiques comme entrée en utilisant le code suivant
Pour trouver la liste des caméras web aura besoin d'importer quelque chose comme Direct Show (DirectShow.Net.dll) dans le projet et d'utiliser le code suivant pour récupérer la liste des web cams .
Vérifier ce lien pour le code complet
http://www.emgu.com/wiki/index.php?title=Camera_Capture
Cette liste peuvent être placés dans une zone de liste modifiable et chaque appareil connecté peut être choisi de façon à récupérer la vidéo d'entrée de l'appareil.
Exemple peut être trouvé ici:
http://fewtutorials.bravesites.com/entries/emgu-cv-c/level-2---use-multiple-cameras-in-one-application.
Pour votre dernière question, la valeur par Défaut de la Caméra toujours a l'index 0.
Donc pour l'initialisation de la Capture de l'Objet avec la caméra par défaut, vous devrez utiliser le code suivant
OriginalL'auteur Shiva
L'examen de la EMGU CV source semble indiquer que c'est juste en passant l'index hors de la sous-jacentes de la bibliothèque OpenCV, dans le cadre de la cvCreateCameraCapture (int index) de la fonction. Cette fonction est... Un peu de désordre de #ifdefs, mais de ce que je peux voir (et à partir de ce que les commentaires l'indiquent), l'index est utilisé pour spécifier à la fois la caméra que vous souhaitez, et de l'API, il devrait être en utilisant.
Essayer successivement en essayant à plusieurs centaines de personnes; chacun doit utiliser un autre codec, la tentative d'utilisation de la première caméra. Peut-être que vous avez l'un de l'Api répertoriés compilé dans votre copie de OpenCV, mais ne fonctionne pas correctement sur votre système.
Edit: de Forage vers le bas plus loin, il semble que cela se termine cette appel de fonction, qui utilise le MFEnumDeviceSources fonction pour obtenir la liste. L'appareil que tu voulais est ensuite retourné de cette liste (voir la getDevice fonction quelques lignes plus haut). Donc, il me semble que le dialogue que vous avez mentionné dans votre commentaire, c'est la partie de Windows MediaFoundation de choses, dans ce cas, vous pourriez vouloir à google le libellé du message, voir si certaines personnes avec plus d'expérience avec MF peut vous diriger dans la bonne direction.
OriginalL'auteur Billy Mailman