Rebol et OpenCV
ldci25-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.
@+
DocKimbel26-May-2012/17:12:17+2:00
Très bonne nouvelle !
Laurent27-May-2012/12:24:07+2:00
Cool.
GreG29-May-2012/10:49:55+2:00
ldci5-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
jocko5-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 ?
ldci5-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   
]
@ +
ldci6-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 ...
jocko8-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.
ldci8-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 +
shadwolf10-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 ?
jocko10-Jun-2012/21:41:26+2:00
oui, entre autres ...
ldci11-Jun-2012/1:09:44+2:00
Bon le port
ldci11-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?
ldci11-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
ldci11-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!
jocko11-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.
jocko11-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.
ldci11-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 : )
ldci12-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
ldci13-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 +
ldci21-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
shadwolf15-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)
shadwolf15-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.
ldci5-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
ldci5-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é...
ldci7-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 bricoleur17-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
ldci17-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é.
paullys18-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.
ldci18-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.


Powered by RebelBB and REBOL 2.7.8.4.2