GPSPhotoTag
Bonsoir !
La première version de ma nouvelle application GPSPhotoTag est disponible. Elle sert à géotagger manuellement vos photos. Contrairement à ce que le nom de l'application fait croire, elle ne permet pas (pour le moment) de lire un fichier de trace issu d'un GPS.
C'est par ici que ça se passe : http://www.olofweb.com/olosoft/GPSPhotoTag.html
La première version de ma nouvelle application GPSPhotoTag est disponible. Elle sert à géotagger manuellement vos photos. Contrairement à ce que le nom de l'application fait croire, elle ne permet pas (pour le moment) de lire un fichier de trace issu d'un GPS.
C'est par ici que ça se passe : http://www.olofweb.com/olosoft/GPSPhotoTag.html
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Mets tu à jour les données Exif de la photo ?
Si oui utilises tu les API de Cocoa ou utilises tu autre chose ?
Existe t'il une application qui permette de récupérer les coord GPS de l'iPhone et de les mettres dans iPhoto?
Sinon j'imagine bien que ça doit-être possible de faire vite fait une petite appli qui affiche les coords sur l'écran de l'iPhone mais j'aurais voulu un truc tout intégrer.
Oui, je mets à jour les données EXIF. Mais pour ça j'utilise ExifTool (http://www.sno.phy.queensu.ca/~phil/exiftool/).
Si tu as un fichier d'une trace GPS, tu peux géotagger tes photos automatiquement avec HoudahGeo, par exemple (payant). Un article à ce sujet : http://www.cuk.ch/articles/4169.
J'en ai vu sur l'AppStore mais elles indiquent seulement les coords à l'écran ou te positionne sur Maps.
Moi je voudrais donc un couple d'Appli, iPhone/Mac avec celle du Mac qui récupère une liste de coord enregistré avec l'iPhone.
Le but Final étant de géotagguer après coup mes photos iPhotos car je n'ai pas de GPS dans mon Réflex.
L'appli enregistre une trace (ensemble de points GPS) sur l'iPhone et ensuite, un autre logiciel (dans le cas de cet article, HoudahGeo) géotagge les photos en faisant concorder l'heure de chaque cliché avec la trace GPS. Ce qui veut dire que les deux appareils (iPhone et appareil photo) doivent être réglés à la même heure.
Ou alors j'ai mal compris ton problème...
Ca devrais faire ce que je veux, merci!
merci pour ta réponse
je ne connaissais pas cet outil, merci pour le lien
Je ressors cette conversation puisque deux sujets traités ici m'intéressent particulièrement: (1) le geotagging sur les images faites avec l'iPhone et (2) les données GPS.
Pour vous donner le contexte, le but est de prendre une photo et d'avoir un maximum d'informations (localisation, directions, accélération,...), puis d'envoyer l'image et les données à un serveur.
(1) Le geotagging "natif" dans les données EXIF permet de récupérer la localisation simplement (si tant est qu'elle soit fiable). L'utilisation de CLLocationManager et de UIAccelerometer permet de récupérer d'autres données (heading, accélération... en les comparant avec le timestamp de l'image).
La question que je me pose est de savoir quel est le meilleur moyen d'envoyer ces données ? Plusieurs pistes, à mon sens: une requête POST avec plein d'attributs (dont l'image), tout encapsuler dans les données EXIF (avec des custom tags et l'utilisation d'un framework comme iphone-exit (google code)) ou tout encapsuler au format XMP (qui paraà®t intéressant, en utilisant le xmp toolkit d'adobe, mais peut-être un peu lourd).
(2)
Je ne connaissais pas cette appli (MotionX), et je vois qu'elle renseigne sur la manière dont sont récupérées les données (satellites, hot-spots Wi-Fi, gsm); Apple ne faisant pas du tout part de ces infos, savez-vous comment il est possible de les obtenir ? Une simple zone de précision, c'est bien, mais avoir plus d'infos serait utile dans mon cas.
Le problème est tout bête mais pose question : quand peut-on récupérer ce heading ?
Si on récupère l'info avant la photo, ou au moment de l'envoi, c'est déjà risqué, puisque rien n'empêche l'utilisateur de marcher sur le trottoir, voir un truc sympa sur sa gauche donc se tourner, prendre la photo, puis se re-tourner pour continuer son chemin sur le trottoir pendant qu'il termine son message et l'envoie... Du coup l'orientation (heading) ne correpondra pas à la photo.
Récupérer le heading en continu, entre le moment juste avant qu'on n'affiche le UIImagePickerController et celui juste après que la photo a été prise... et trouver parmi les headings récupérés celui qui est le plus proche du timestamp EXIF de la photo... pourquoi pas... mais est-ce faisable simplement ?
J'espère... :P En tout cas, de mon côté j'ai besoin de valeurs les plus précises possibles, donc je vais aller dans cette direction.
Pour lire les données EXIF facilement, j'ai trouvé ceci, à tester, et pour les données du capteur, je pense faire un "manager" au-dessus de UIAccelerometer qui récupère les données dans un buffer et fait ensuite un matching là -dessus. Après, il faut voir si c'est assez efficace (et précis).
Si tu en sors qqch et que ça t'embête pas de partager, je suis preneur
Pas de problème, d'autant que les conseils sont généralement dans l'autre sens
Plus d'infos d'ici peu je l'espère...
Pour ma part seule l'orientation (heading) m'importe, je veux juste savoir dans quelle direction (vers quel point cardinal) on a pris la photo. A la limite l'orientation (vecteur gravité), mais ça n'est pas ce qui prime.
[/mode intéressé OFF]
La "difficulté" réside surtout d'une dans la récupération des données EXIF de l'image, qui n'est qu'une UIImage quand elle est récupérée du UIImagePickerController (donc quid des données EXIF dans ce cas ? Accessibles quand même ? J'avoue que je n'ai même pas regardé), et la synchronisation entre le "tableau des dernières orientations" que l'on garde en continu et la date de prise de vue...
Sachant qu'il faut penser au cas où le gars reste pendant 3h en mode UIImagePickerController, parce qu'il a lancé, l'appli, s'est préparé à prendre une photo, mais est parti pisser et a rencontré sa belle-mère au retour qui lui tiens toujours la jambe avec une conversation à n'en plus finir...
Ce petit scénario pour dire que la mémorisation en continu des données à tout instant tant qu'on n'a pas pris de photo, pour à terme ne retenir que celle qui correspond au même timestamp que la photo... Bah c'est dangereux si le nombre de données à mémoriser, qui va aller en grandissant, devient trop important... et que la mémoire explose (on est sur device mobile, ne pas l'oublier ! Un petit coup de profiling via "Instruments" pourra donner une idée de ce que ça donne quand on simulant le cas de la belle-mère
La 1e, c'est d'avoir sa propre overlay view qui permet de récupérer l'événement du touch (ce qui est déjà mon cas en fait, pour une toute autre raison), et donc de rester à un buffer de valeur constante.
La 2e, c'est d'avoir un buffer assez grand pour englober les valeurs entre le touch et le callback vers le delegate; quand celui-ci est plein, il est remis à zéro. Sauf qu'il se peut tout à fait qu'il soit mis à zéro juste avant le callback et que les données que l'on veut nous disent au revoir... D'où la nécessité d'améliorer cette façon de faire, si on compte l'utiliser.
En effet, quand l'utilisateur appuie sur le bouton pour prendre la photo, il garde son iPhone immobile le temps de la prise de vue (le temps d'exposition de la photo et le temps que la photo soit effectivement prise et sauvée), de peur que la photo soit floue sinon (comme avec un vrai appareil photo, il ne faut pas bouger pendant l'exposition, évidemment).
Et du coup en se basant sur cette hypothèse que l'utilisateur garde l'iPhone stable pendant la prise de vue, et que s'il bouge l'iPhone ensuite, c'est après que la photo a été prise... Bah le scénario devient plus simple : lancer le CLLocationManger avant d'afficher le picker, le laisser se mettre à jour et affiner la position en continu, et ne récupérer que la dernière position (pas besoin de bufferiser les N dernières CLLocations) au moment de la méthode de delegate.
[EDIT] Ajout de Belle-maman dans le diagramme de séquence
Je suis d'accord avec toi sur le principe. Par contre, si c'est sans doute très vrai pour la localisation ou la direction, ça l'est moins pour l'accélération (oui je sais, tu n'en as pas besoin
Donc pour la localisation, qu'importe si le timestamp des données récupérées ne correspond pas exactement à celui de la capture de l'image, les données seront les mêmes.
Pour l'accélération, il suffit d'un rien... Et j'ai bien peur que les données récupérées dans la méthode callback soient différentes de celles du moment de la capture.
C'est donc à tester, du moins de mon côté...
Par contre là je galère un peu pour récupérer le timestamp exact de l'image (afin de faire le matching sur celui des données). Le framework que je mentionne plus haut permet bien d'accéder et modifier les données EXIF, mais apparemment (d'après le développeur et mes tests) une UIImage récupérée d'un UIImagePickerController ne contient plus que 2-3 données EXIF !!
Pourtant ces données sont bien contenues dans l'image, elles ne sont peut-êter tout simplement pas gardée lors de la transformation avec UIImageJPEGRepresentation.
Ce que j'aimerais donc essayer, c'est d'enregistrer l'image sur l'iPhone, puis la récupérer, comme si on la passait dans iPhoto par exemple; en espérant alors que ces données EXIF soient lisibles.
Si quelqu'un a une méthode pour récupérer le timestamp "exact" d'une capture d'image, je suis preneur... ::)
Sinon pour les données EXIF, c'est un peu ce que je craignais, puisqu'on récupère une UIImage et non un fichier...
A mon avis l'UIImage ne contient que les pixels, le colorspace, et quelques infos comme l'orientation EXIF (0°, 90°, 180°, 270°). Et quand tu demandes UIImageJPEGRepresentation ça crée à la volée cette représentation JPEG, en incluant les données EXIF.
Alors que toi tu pensais peut-être directement récupérer le JPEG avec toutes les données EXIF comme quand l'appareil photo de l'iPhone enregistre l'image dans la bibliothèque "péllicule" de l'application "Photos" de l'iPhone et que, quand tu récupères ces images via iPhoto, tu as toutes les infos.
Exactement. Mais vu que toutes les données EXIF (pas seulement les 2-3 accessibles) sont tout de même disponibles dans iPhoto, cela veut bien dire qu'il y a une moyen d'enregistrer l'image en les conservant.
Est-ce que d'après toi ça marcherait en utilisant simplement UIImageJPEGRepresentation, ou alors Apple utilise une technique plus obscure
[EDIT]
J'ai essayé de sauvegarder l'image récupérée dans l'album photo avec UIImageWriteToSavedPhotosAlbum et dans un dossier avec UIImageJPEGRepresentation, dans les deux cas je n'ai pas les données EXIF que je veux; seules les dimensions (et la date d'enregistrement, différente de celle de la capture) sont disponibles.
Je vais donc essayer de voir quel laps de temps s'écoule entre la capture et le callback...
Une idée j'ai eu, meilleure à mon avis qu'essayer à tout prix de récupérer ce timestamp.
Entre l'appel à takePicture et le callback imagePickerController: didFinishPickingMediaWithInfo: s'écoulent environ 700ms. Faire un matching entre le timestamp de l'image et les données, c'est bien joli, mais tout d'abord l'image n'est pas capturée instantanément, et ensuite la valeur la plus proche au niveau des données (GPS, accélération,...) n'est pas forcément la plus précise non plus.
Ce que je vais donc faire, c'est récupérer toutes les valeurs entre ces deux appels. Ensuite, appliquer un filtre pour obtenir la meilleure valeur possible. Reste à déterminer le genre de filtre (je ne suis pas non plus spécialiste du traitement du signal...), mais pour commencer, je pense pondérer les valeurs en fonction de la précision (accuracy) ou carrément les filtrer, puis effectuer directement la médiane, ou une moyenne sur qques valeurs centrées autour de la médiane, en utilisant la pondération.
En d'autres termes, je procède comme toi pour le début, mais en allant un peu plus loin avec les données que je récupère.
Qu'en penses-tu ?
Pour le reste, il faudra encore voir comment je ré-intègre ces données à l'image pour les envoyer sur le server (EXIF, XMP, XML annexe, attributs POST,...).
Je suppose qu'ils trichent et se servent de la précision retournée par l'API CoreLocation pour essayer de deviner le mode de réception.
Parce qu'effectivement il n'y a rien dans l'API qui permet de savoir exactement quel mode de localisation est utilisé.
Moi, comme c'est l'utilisateur qui clique sur le bouton, je ne peux que récupérer le didFinishPickingMediaWithInfo, sans savoir quand l'utilisateur a tapé sur le bouton avant. Mais comme je le disais ce n'est pas bien grave puisque j'émets l'hypothèse " à mon avis raisonnable " que, entre le moment où l'on appuie sur le bouton nous-même et le moment où l'on reçoit le didFinishPickingMediaInfo (ces ~700ms d'écart donc), on ne bouge pas l'iPhone (comme quand on prend une photo avec un APN, on ne bouge pas tant que la photo n'a pas finie d'être prise, pour éviter qu'elle soit floue)
Pour ton cas c'est vrai que c'est plus délicat vu que tu as besoin de l'accélération... Mais d'un autre côté tu maà®trises les 2 événements, le takePicture ET le didFinish ! Donc reste l'idée de filtrage (moyenne pondérée sur la précision c'est pas idiot du tout)... mais auras-tu vraiment beaucoup de données pendant ces 700ms ? de UIAccelerometer je n'en doute pas, mais de CLLocationManager...?
C'est ce que j'aimerais tester... Mais si je n'ai aucun événement à ce moment-là , je pense que je prendrai la dernière localisation, au risque d'une précision moindre. Difficile de tout avoir :P
Je vais donc tester tout ça en tirant si possible qques graphes, histoires de voir le nombre de valeurs, leur précision, etc...
Et j'en profite pour poser une question annexe qui n'a rien à voir mais qui me serait très utile: pour tous mes tests, j'aimerais pouvoir enregistrer mes données dans un fichier puis... récupérer ce fichier. Sur le simulateur, aucun problème, mais comment faire pour récupérer un fichier enregistré dans la sandbox de l'appli (ou ailleurs sur l'iPhone) ?? Le moyen que j'ai utilisé en attendant est de m'envoyer un mail avec les données brutes, mais c'est pas terrible...
[EDIT]
Je me réponds à moi-même: si le but est simplement de vouloir récupérer les données d'une application en tant que développeur, à des fins de tests par exemple, la méthode est la suivante: connecter l'iPhone, ouvrir la fenêtre Organizer dans Xcode, sélectionner l'iPhone et, dans l'onglet Summary, cliquer sur le triangle de l'application voulue; un dossier Application Data apparaà®t et il suffit de le télécharger sur sa machine pour récupérer toutes les données de l'application.
Je suis en train de l'utiliser maintenant, merci a toi pour cette trouvaille ! :kicking:
Tu n'aurais pas la meme choses pour des Diagrammes de classes par hasard dans tes liens ?
Merci
Flatté je suis, mais c'est AliGator qui a utilisé ce site (que je ne connaissais pas non plus), c'est donc lui qu'il faut remercier.
S'il peut me repondre au passage
J'en avais dédié un sujet ici