Rebol et OpenCV | |
ldci | 25-May-2012/20:01:50+2:00 |
Salut à tous Bonnes nouvelles: je suis en train d'interfacer Rebol et OpenCV (une super lib de traitement d'image). Du coup on peut directement se servir des webcams sous Rebol. Des que j'ai fini, je porte également tout ça sur Red. @+ | |
DocKimbel | 26-May-2012/17:12:17+2:00 |
Très bonne nouvelle ! | |
Laurent | 27-May-2012/12:24:07+2:00 |
Cool. | |
GreG | 29-May-2012/10:49:55+2:00 |
ldci | 5-Jun-2012/1:17:50+2:00 |
Red sait activer les webcams exemple par opencv #include %opencv.reds #include %highgui.reds capture: cvCreateCameraCapture CV_CAP_ANY ret: cvGrabFrame capture cvNamedWindow "Test Window" CV_WINDOW_AUTOSIZE image: cvRetrieveFrame capture c: 100 while [c > 0] [ image: cvRetrieveFrame capture cvShowImage "Test Window" image cvWaitKey 1 c: c - 1 ] print "done" cvReleaseCapture capture cvWaitKey 0 | |
jocko | 5-Jun-2012/15:11:07+2:00 |
Bravo ! Est-ce que tu as l'intention de tout interfacer (OpenCV est vaste), ou une sélection des fonctions les plus fréquentes ? | |
ldci | 5-Jun-2012/15:32:47+2:00 |
@jocko J'ai déjà interfacé la gestion des fenêtres et le chargement des images ainsi qu'un certain nombre de structures utiles (cvPoint....) pour dessiner Je vais essayer d'interfacer le max de fonctions (+ 500). A ce propos qui aurait une idée pour transformer ce code c en red #define CV_SWAP(a,b,t) ((t) = (a), (a) = (b), (b) = (t)) le problème n'est pas de faire le swap mais de renvoyer les valeurs passées en paramètre dont on ignore le type (integer! float!...) Un essai non concluant car ne renvoyant pas les valeurs CV_SWAP: func [ [typed] count [integer!] list [typed-value!] /local cpt a b t ] [ cpt: count until [ if cpt = 3 [a: list/value] if cpt = 2 [b: list/value] if cpt = 1 [t: list/value] cpt: cpt - 1 list: list + 1 zero? cpt ] t: a a: b b: t ] @ + | |
ldci | 6-Jun-2012/17:26:53+2:00 |
@tous cxtypes.h est portée à 75% (définition des types de base ...) highgui.h est complètement portée sous Red On peut créer des fenêtres les déplacer, les agrandir .. On peut créer ou charger des images dans ces fenêtres ... On peut également ouvrir des flux vidéo (caméra ou fichier) dans ces fenêtres. BTW on peut activer plusieurs sources vidéo en même temps : ex 4 caméras ... On peut sauver des images ou des flux vidéo dans un fichier ... Pour les intéressés voici la liste des fonctions cvInitSystem cvNamedWindow cvDestroyWindow cvDestroyAllWindows cvResizeWindow cvMoveWindow cvGetWindowHandle cvGetWindowName cvCreateImage cvShowImage cvCreateTrackbar cvGetTrackbarPos cvSetTrackbarPos cvSetMouseCallback cvLoadImage cvLoadImageM cvSaveImage cvConvertImage cvWaitKey cvCreateCameraCapture cvCreateFileCapture cvGrabFrame cvRetrieveFrame cvQueryFrame cvReleaseCapture cvGetCaptureProperty cvSetCaptureProperty cvCreateVideoWriter cvWriteFrame cvReleaseVideoWriter A suivre ... | |
jocko | 8-Jun-2012/6:17:51+2:00 |
bravo ! Juste une question sur l'utilisation simultanée de plusieurs caméras : est-ce que ces caméras peuvent être identiques ? De mémoire, lorsque l'on essaie celà sous windows avec DirectShow, celà pose problème, car les drivers ne supportent pas plusieurs instances. | |
ldci | 8-Jun-2012/23:33:28+2:00 |
@jocko A première vue, les caméras sont différentes: ex: la webcam intégrée de mon mac en 1 et une webcam usb en 2 Je vais essayer différentes instances de la même camera A + | |
shadwolf | 10-Jun-2012/7:59:18+2:00 |
opencv c'est pas la lib utiliser par les robots humanoid moderne pour faire de la reconnaissance d'objet et du traitement d'information visuelle ? | |
jocko | 10-Jun-2012/21:41:26+2:00 |
oui, entre autres ... | |
ldci | 11-Jun-2012/1:09:44+2:00 |
Bon le port | |
ldci | 11-Jun-2012/1:11:21+2:00 |
Bon le portage d'openCV avance, mais c'est lent. Voici un code en c #define CV_TREE_NODE_FIELDS(node_type) \ int flags; /* micsellaneous flags */ \ int header_size; /* size of sequence header */ \ struct node_type* h_prev; /* previous sequence */ \ struct node_type* h_next; /* next sequence */ \ struct node_type* v_prev; /* 2nd previous sequence */ \ struct node_type* v_next /* 2nd next sequence */ /* Read/Write sequence. Elements can be dynamically inserted to or deleted from the sequence. */ #define CV_SEQUENCE_FIELDS() \ CV_TREE_NODE_FIELDS(CvSeq); \ int total; /* total number of elements */ \ int elem_size; /* size of sequence element in bytes */ \ char* block_max; /* maximal bound of the last block */ \ char* ptr; /* current write pointer */ \ int delta_elems; /* how many elements allocated when the seq grows */ \ CvMemStorage* storage; /* where the seq is stored */ \ CvSeqBlock* free_blocks; /* free blocks list */ \ CvSeqBlock* first; /* pointer to the first sequence block */ Comment porter ça en reds? | |
ldci | 11-Jun-2012/9:08:23+2:00 |
@jocko Bonne nouvelle pour les caméras: c'est l'index des caméras qui compte. A mon avis on doit pouvoir utiliser plusieurs caméras identiques! Le code qui suit marche parfaitement sous MAc OSX #include %opencv.reds cvStartWindowThread ;use index camera or use CV_CAP_ANY for autodetection capture1: cvCreateCameraCapture 1 ;or CV_CAP_ANY capture2: cvCreateCameraCapture 2 ;or CV_CAP_ANY ; create 2 video streams cvGrabFrame capture1 cvGrabFrame capture2 ; and 2 windows cvNamedWindow "Test Capture 1" CV_WINDOW_AUTOSIZE cvNamedWindow "Test Capture 2" CV_WINDOW_AUTOSIZE ; read 2 frames image1: cvRetrieveFrame capture1 image2: cvRetrieveFrame capture2 ;read streams c: 100 while [c > 0] [ image1: cvRetrieveFrame capture1 image2: cvRetrieveFrame capture2 cvShowImage "Test Capture 1" image1 cvShowImage "Test Capture 2" image2 cvWaitKey 1 c: c - 1 ] print ["done" lf] cvWaitKey 0 | |
ldci | 11-Jun-2012/10:54:18+2:00 |
@jocko Je confirme : on peut utiliser des caméras de même nature comme par exemple des cameras usb j'ai essayé avec ce que j'ai sous la main capture1: cvCreateCameraCapture 1 ;here external usb Microsoft camera capture2: cvCreateCameraCapture 2 ;here external usb Sony EyeToy PS2 camera capture3: cvCreateCameraCapture 3 ;here integrated isight Aucun problème sous OS X @tous pour les vidéos, j'ai testé avi, mov, mp4 : OpenCV accepte sans broncher. Cool! | |
jocko | 11-Jun-2012/12:14:28+2:00 |
Le problème que je rencontre sous windows XP est l'utilisation simultanée de deux webcams identiques. Elles utilisent le même driver, et l'OS ne le supporte pas (panne catastrophique: écran bleu !). Je ne sais pas si ça se produit aussi sous Linux ou OSX. | |
jocko | 11-Jun-2012/12:37:13+2:00 |
Le problème que je rencontre sous windows XP est l'utilisation simultanée de deux webcams identiques. Elles utilisent le même driver, et l'OS ne le supporte pas (panne catastrophique: écran bleu !). Je ne sais pas si ça se produit aussi sous Linux ou OSX. | |
ldci | 11-Jun-2012/13:45:04+2:00 |
@Jocko Bon: je dois trouver 2 caméras identiques pour tester et répondre à ta question Sinon, cela fonctionne également avec rebol view : ) | |
ldci | 12-Jun-2012/18:07:29+2:00 |
@Jocko Bonne nouvelle: j'ai testé avec 2 caméras identiques en + de l'isight du mac et ... CA MARCHE sans pb avec OpenCV/Rebol/Red Cela ouvre des possibilités | |
ldci | 13-Jun-2012/15:16:11+2:00 |
Bon pour les caméras identiques: c'est OK avec MAc OSX : je peux même contacter les caméras sur un hub usb . Plus compliqué sous windows XP: Jocko a raison: refus de lancer plus d'une instance de driver. Je vais devoir refaire une machine windows pour tester en détail. A + | |
ldci | 21-Jul-2012/16:15:32+2:00 |
Des nouvelles du front OPenCV Rebol Bon faut être marteau pour se lancer dans cette aventure avec Rebol! Plus simple d'écrire le code en c! Ceci étant j'avance et maintenant on peut utiliser les fonctiosn OpenCV pour dessiner des formes des lignes ... La gestion des caractères est parfaite. En travaillant la dessus, je me suis rendu compte que lorsque vous utilisez une structure dans une routine dll, la structure est utilisée non pas comme une structure, mais comme un pointeur. Ca m'arrange bien dans pas mal de cas. A ce propos, voici une petite fonction utile struct-address*: func [ {get the data of the struct at the given address. Can use rebol or C types } struct [struct!] address [integer!] /endian ] [ size: 0 x: first struct print [type? x length? x] data: second struct ; original data in the structure foreach v data [size: size + sizeof to-word type? v] ; get size of all types in the structure *data: get-mem?/part address size; pointer to data of the structure at the address ret: copy [] foreach v data [n: sizeof to-word type? v value: copy/part *data n if endian [reverse value] print [type? v n value] switch type?/word v [ char! | char [append ret to-char to-integer value] integer! | int [append ret to-integer value] short | long [append ret to-integer value] decimal! | float | double [append ret bin-to-decimal value] ; string! | char* [append ret address* (to-integer value)] ; string address on 4 bytes ] *data: skip *data n ] ; get pointed data according to type? return ret; ] Vous passez l'adresse de la structure et vous récupérez les données stockées à cette adresse. La où cela se complique, c'est quand votre structure contient une autre structure (souvent le cas avec OpenCV) car dans ce cas, on "pointe" sur l'adresse de la seconde structure. Comment pourrait on facilement récupérer l'adresse de la structure incluse? Exemple size: make struct! [ x [integer!] "x value" y [integer!] "y value" z [integer!] "zvalue" ] [0 0 0] cxy: make struct! compose/deep/only[ x [integer!] "x value" y [integer!] "y value" zz [decimal!] " cc" s [string!] "hello world" z [char!] "z value" ss [struct! (first size)] "test structure" ] [10 60 105.0 "hello double structure" #"R" 200 200 500 ] 10 60 105.0 hello double structure R 200 200 500 ; ok valeurs renvoyée par second cxy 15563208; ok adresse cxy integer 4 #{0000000A} : OK 10 integer 4 #{0000003C} ; OK 60 decimal 8 #{405A400000000000} ; OK 105.0 string 4 #{00ED7268} ; OK string correcte char 1 #{52} ; OK caractère R integer 4 #{78000000} ; not ok adresse? integer 4 #{0000EB92}; not ok adresse? integer 4 #{03000000} ; not ok adresse? 10 60 105.0 hello double structure R 2013265920 60306 50331648 Si vous avez des idées je suis preneur | |
shadwolf | 15-Aug-2012/5:35:09+2:00 |
openCV c'est pas le truc pour faire de la reconnaissance de mouvements ? Il me semble que des robots de recherche l'utilisent pour leur algorithme d'apprentissage visuel (projet europeens d'androide autonome) | |
shadwolf | 15-Aug-2012/5:41:48+2:00 |
C'est quand meme super moche le C ecrit en rebolish ... ca fait penser a du python... ou pas. Ldci heu ca je l'ai toujours dit que le support librairie externe de rebol2 etait plus que merdique. C'est bien pour de toute petite librairie mais des que tu veux utiliser un truc balaise la ca se passe tres tres mal et c'est tres tres moche. mon regret? r3 semblait partir dans le bon sens dans ce domaine mais on a jamais pu avoir d'example concret d'interaction d'une librairie avec rebol. la aussi r3 a pris a un moment l'option de devenir integrable a un soft ecrit en C (comme lua) ce qui au final te fais faire du C et plus du tout du rebol... Au moins la technique d'integration dll de rebol2 avait ceci de bien d'etre dans un script rebol et ecrit en rebol mais bon les interface comme les types etc etaient nuls. A mon avis et c'est ce qu'on avait demander il fallait que rebol s'adapte au types dynamique et fixe du C et que coexiste a coté les types fexibles de rebol. | |
ldci | 5-Sep-2012/21:55:40+2:00 |
Bonjour à tous Voici une version "basique" qui permet de jouer avec OpenCV à partir de Rebol Récupérez et décompressez les deux archives suivantes http://perso.numericable.fr/code/OpenCV/rebol/lib.zip http://perso.numericable.fr/code/OpenCV/rebol/samples.zip ATTENTION: vous devez avoir une version d'OpenCV installée sur votre machine ATTENTION: adaptez libopencv: load/library %/Library/Frameworks/OpenCV.framework/Versions/A/OpenCV en fonction de votre OS ATTENTION: des bugs sont potentiels Les démos sont dans le répertoire "examples" et sont simples à comprendre ... Amicalement | |
ldci | 5-Sep-2012/21:57:40+2:00 |
Oups! Erreur de lien http://perso.numericable.fr/frajouen/code/OpenCV/rebol/lib.zip http://perso.numericable.fr/frajouen/code/OpenCV/rebol/samples.zip Désolé... | |
ldci | 7-Sep-2012/15:24:30+2:00 |
Re @ tous Après la naissance de Red, je vais centrer le portage de OpenCv sur Red. Pour Rebol, on verra plus tard en fonction des évolutions ... @+ | |
bob le bricoleur | 17-Sep-2012/13:57:01+2:00 |
Bonjour, Faut il un numéro de version particulier, j'ai une erreur à l'initialisation de la LIB : ** Access Error: Cannot open cvInitSystem ** Near: cvInitSystem: make routine! [ argc [integer!] char** [string!] return: [integer!] ] libopencv j'utilise opencv_core242.dll en version x86 Cordialement avec la version | |
ldci | 17-Sep-2012/21:59:44+2:00 |
Oups Désolé, j'ai oublié de préciser que ce portage fonctionne avec openCV 1.0 et pas avec les version 2.0 et suivantes. En fait les versions 2 abandonnent le c pour du c++ et les structures de la lib sont modifiées. Mais avec un peu d'effort on doit pouvoir réussir à faire une version 2, mais j'ai très peu de temps en ce moment pour cette activité. | |
paullys | 18-Sep-2012/14:56:49+2:00 |
Sisi ça marche très partiellement avec la opencv_core242, en fait la demo drawing.r fonctionne, les autres demos fonctionnent très partiellement à savoir que la Gui rebol se lance, la Huigui opencv aussi, il semblerait donc que juste subsistent quelques defauts au niveau "adressage des contenus".J'ai juste eu le temps de survoler le code openCV 1 et suivant, à priori les changements importants concernent le code nouveau, le code ancien ne serait que réorganisé, externalisation hihgui par exemple. | |
ldci | 18-Sep-2012/21:42:28+2:00 |
@tous Le code est dispo pour tous ceux qui veulent amėliorer cette premiere version.Je suis preneur de toutes les améliorations | |
Login required to Post. |