Red/System et OpenCV
ldci17-Mar-2013/19:08:50+1:00
Bonjour à tous,
Je viens de passer un peu de temps pour rendre compatible Red 0.3 et OPenCV (enfait je viens de réécrire une centaine de macros avec les conseils éclairés de DocKimbel )

une petite démo à cette adresse


On avance, on avance
ldci17-Mar-2013/19:09:39+1:00
ce sera mieux

http://
ldci17-Mar-2013/19:11:36+1:00
ce sera mieux

ou
http://www.wuala.com/fjouen/Code/OpenCV/Red/pub
Jocko17-Mar-2013/22:02:04+1:00
Joli travail. Juste une question : est-ce que tu écris ces macros à la main, ou as-tu crée une moulinette ?
ldci20-Mar-2013/9:07:30+1:00
@jocko
Tout fait main ! les macros sont compliquées à gérer avec Red/System (effets de bords liés aux parenthèses). Je regarde macro par macro. toutes les macros sans paramètres restent au format macro en Red/S. Pour les autres j'adapte au cas par cas et certaines sont transformées en fonctions. Tiens, juste pour le fun regardez ce que propose OpenCV pour la gestion dynamique des séquences!
<code>
#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 */
</code>
Bon coding en R/S
ldci23-Mar-2013/11:57:03+1:00
Salut à tous
Voici l'avancement du portage OpenCV/Red/System
opencv.reds   intégration générale des libs    100%
cvver.reds      gestions N° de version         100%
cxerror.reds   gestion des erreurs            100%
cxtypes.reds   types et structures   de base      100%
cvtypes.reds   types et structures pour CV      100%
cxcore.reds   fonctions de base          25%
highgui.reds   interface graphique            100%
cv.reds      fonctions Computer Vision    0%
cvaux.reds   fonctions additionnelles        0%
cxmisc.reds   fonctions générales spécifiques    0%

cxcore et cv seront disponibles en début de semaine prochaine, ce qui permettra de tester les exemples classiques d'OpenCV.
Les exemples qui utilisent highgui sont opérationnels (accès caméra, chargement d'image, de vidéo), mais restent limités.Ceci étant on peut déjà gérer les callbacks.
Je cherche des volontaires pour adapter opencv.reds pour windows. J'ai développé sous MAcOSX avec un framework unique qui regroupe toutes les libs.
Sous windows, il y a une dll par lib: core.dll, highgui.dll...
Qui serait intéressé?
Amitiés à tous.
jocko23-Mar-2013/12:04:24+1:00
je peux faire des tests sous windows, mais je n'ai pas de temps pour des développements
PierreCh24-Mar-2013/22:09:43+1:00
J'avais pas du tout pigé ce qu'était opencv: je pensais que c'était un genre de format de curriculum vitae ouvert...

Oups. Je viens de gougler: ça a l'air vachement intéressant, ce truc!

En combinant ça avec un petit avion télécommandé (j'ai oublié qui faisait de ça, dans l'assistance... coccinelle?), ça pourrait être géant pour faire de la photogrammétrie et sortir un modèle numérique de terrain hyperdétaillé. Il faudrait des points de calage précis.
ldci24-Mar-2013/22:25:29+1:00
Bonsoir à tous
@Jocko: merci pour les tests qui seront nécessaires pour windows
@PierreCh: effectivement c'est la lib Intel pour Computer Vision: je m'en sers actuellement pour faire un eye-tracker avec une webcam. Ton idée est super : ce serait un bel exemple pour Red.
Avancement du code: la lib cxcore.reds fonctions de base est passée de 25 à 50 % ! (je teste toutes les fonctions)
Amicalement
ldci25-Mar-2013/1:42:01+1:00
Bien
cxcore est à 80%. On peut déjà commencer à s'amuser !
Red/System [
	Title:		"OpenCV Tests"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:        "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]

#include %../opencv.reds

; function pointer that can be called by TrackBar callback 
trackEvent: func [[cdecl] pos [integer!]][cvGetTrackbarPos "Track" windowsName print ["Trackbar position is : " pos lf]]  


; this is pointer  to the function  called by mouse callback
mouseEvent: func [
	[cdecl]
            event 	[integer!]
            x	        [integer!]
            y	        [integer!]
            flags	[integer!]
            param	[pointer! [byte!]]
	] [
	print ["Mouse Position xy : " x " " y lf]
]

cvStartWindowThread  ; own's window thread 

*p: declare pointer! [integer!]  ; for trackbar position 
windowsName: "Lena: What a Wonderful World!"
print ["Loading a tiff image" lf]
lena: "/Users/fjouen/Desktop/newOpenCV/red/examples/lena.tiff"
lenaWin: cvNamedWindow windowsName CV_WINDOW_AUTOSIZE ; create window 

; for trackbar events 
cvCreateTrackbar "Track" windowsName *p 100 :trackEvent ; function as parameter
cvSetTrackBarPos "Track" windowsName 0
; for mouse events
cvSetMouseCallBack windowsName :mouseEvent none

;load image 
img: cvLoadImage lena CV_LOAD_IMAGE_COLOR
&img: as byte-ptr! img ; pointer address
print [windowsName " is " img/width  "x" img/height lf]


cvShowImage windowsName &img ; show image
cvWaitKey 500 ;wait 500 ms
cvResizeWindow windowsName 256 256 ; resize window
print [windowsName " is now 256x256 "lf]
cvWaitKey 500
print [windowsName " is now 512x512"lf]
cvResizeWindow windowsName 512 512
cvWaitKey 500
print [windowsName " is moved to 300x50 "lf]
cvMoveWindow windowsName 300 50  ;move window
cvWaitKey 0
print ["Saving the image in jpg" lf]
cvSaveImage "/Users/fjouen/Desktop/newOpenCV/red/examples/lena.jpg" &img ; save tiff as jpg
print ["done! Bye "]

cvReleaseImage &img ; relase image pointer  (may be  a pb with MacOSX due to the 32 bit framework)
cvDestroyWindow windowsName 


A +
DocKimbel25-Mar-2013/8:31:20+1:00
Bravo François pour ton énorme travail sur le support d'OpenCV ! Est-ce que ton exemple fonctionne sous Windows ? (je suis en train de télécharger la version Windows pour tester).
ldci25-Mar-2013/9:36:39+1:00
@Doc
Pas encore sous windows qui utilise différentes dll (cxcore.dll, highgui.dll ...) au lieu d'une seule lib comme sous mac ou linux
Je me penche sur le pb dès que j'ai fini le portage
A +
ldci25-Mar-2013/12:29:09+1:00
La suite des tests.
Comment lire une vidéo avec Red/System et OpenCV.

Pour l'image (movie.jpg)
http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/

Maintenant le code

Red/System [
	Title:		"OpenCV Tests"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012 François Jouen. All rights reserved."
	License:        "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]


#include %../opencv.reds


movie: "/Users/fjouen/Desktop/newOpenCV/red/examples/test.mov" ; use your own movie
cvStartWindowThread

capture: cvCreateFileCapture movie
&capture: as byte-ptr! capture ; get the pointer address 
assert &capture <> 0 ; Red assert 
; some infomation about our movie
print ["Width:  " cvGetCaptureProperty capture CV_CAP_PROP_FRAME_WIDTH lf]
print ["Height:  " cvGetCaptureProperty capture CV_CAP_PROP_FRAME_HEIGHT lf]
print ["N of Frames:  " cvGetCaptureProperty capture CV_CAP_PROP_FRAME_COUNT lf]
print ["FPS:  " cvGetCaptureProperty capture CV_CAP_PROP_FPS lf]
;print ["FOURCC:  " cvGetCaptureProperty capture CV_CAP_PROP_FOURCC lf] ; we have a pb with FOURCC with OSX


cvNamedWindow movie CV_WINDOW_AUTOSIZE ; create window to show the movie

image: cvQueryFrame capture ; for movie frames
&image: as byte-ptr! image

;cvWaitKey 0

foo: 0


while [foo <> 113] [
  	image: cvQueryFrame capture ; get frame
 	cvShowImage movie &image ; show frame
	foo: cvWaitKey 42 ; wait for 42 ms  (1/FPS * 1000)
]

print ["Done. Any key to quit" lf]
cvWaitKey 0
;release windows and pointers
cvDestroyAllWindows
cvReleaseCapture &capture 
cvReleaseImage &image 



Ce code fonctionne avec toutes les vidéos supportées par l'OS.
Attention cependant: OPenCV ne gère que les images (pas le son).
ldci25-Mar-2013/12:52:36+1:00
Maintenant: Comment utiliser sa webcam avec Red/System et OpenCV


Red/System [
	Title:		"OpenCV Camera Test"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:        "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]

#include %../opencv.reds
; use  default camera 
cvStartWindowThread ; separate window thread

capture: cvCreateCameraCapture CV_CAP_ANY ; create a cature using default webcam (iSight) ; change to n for other cam
&capture: as byte-ptr! capture ; get the pointer address
if &capture = null [print "error!" lf]

;set our movie properties
fps: 24.00
camW: 1280
camH: 1024
rec: false ; no automatic movie recording 

; creates a writer to record video
movie: "/Users/fjouen/Desktop/newOpenCV/red/examples/camera.mov"
writer: cvCreateVideoWriter movie CV_FOURCC(#"D" #"I" #"V" #"X") fps camW camH 1 ; 1: CV_DEFAULT (1)
&writer: as byte-ptr! writer ; get the pointer address
if &writer = null [print "error"]


cvNamedWindow "Test Window" CV_WINDOW_AUTOSIZE ; create window to show movie
handle: cvGetWindowHandle "Test Window" ; not used  when using mac OSX without X 
image: cvRetrieveFrame capture ; get the first image 
&image: as byte-ptr! image ; pointer address
assert &image <> 0 ; test image status

key:  #"q"; 113 as integer!
foo: 0

; repeat until q keypress
while [foo <> 113] [
        image: cvRetrieveFrame capture      ; get the frame
       	cvShowImage "Test Window" &image    ; show frame
        if rec [cvWriteFrame writer image]  ; write frame on disk if we want to record movie (set rec to true for testing)
        foo: cvWaitKey 1
]


print ["Done. Any key to quit" lf]
cvWaitKey 0

; releases structures and windows
cvDestroyAllWindows
cvReleaseCapture &capture ; a pb with MacOSX due to the 32 bit framework
cvReleaseVideoWriter &writer
cvReleaseImage &image 



Bien, ce n'est que le début. Maintenant qu'on peut utiliser sa webcam, on va pouvoir faire un traiteùent temps réel sur les images. Dans quelques jours
A +
shadwolf26-Mar-2013/0:43:45+1:00
openCV n etait ce pas une librairie pour analyser du contenu graphique ? Reconnaissance de forme pour le domaine de la robotique?

Si c est bien le cas comment le faire avec ton framework actuel francois?
PierreCh26-Mar-2013/9:50:49+1:00
@ldci "Ton idée est super : ce serait un bel exemple pour Red."

=> j'y vois des applications concrètes immédiates pour mon boulot! Autrement dit, je serais prêt à phynancer des choses dans ce domaine.


[mode fantasme ON]
Un aéronef radiocommandé, genre minizep, dirigé par un géologue au-dessus de l'affleurement tant convoité.
Non, dirigé par un pilote, plutôt. Cela vaudra mieux.

Sur les genoux du géologue, un ordi avec un programme en Red, avec la vidéo de la caméra embarquée, des points de calage qu'on désigne en entrant leurs coordonnées réelles (latitude, longitude, élévation selon l'ellipsoïde WGS84, ou de l'UTM, ou, finalement, le système de coordonnées qu'on veut, pourvu que l'on sache ce qu'on fait).

L'on choisit la maille (un point tous les cm, tous les 10cm, tous les m, tous les 10m, etc. en fonction de l'échelle de l'objet qu'on traite et de la taille de la zone).

On récupère le semis xyz, qui s'affiche, au fur et à mesure, dans son QuantumGIS préféré, ou son GRASS, ou même un ArcGIS, allez.

L'on prend, en plus de la vidéo, des photos de temps en temps. Et on les annote au fur et à mesure, toujours dans l'application Red, bien sûr.

[mode fantasme OFF]


[mode retour sur terre ON]

Bon, faut que je retourne au boulot: j'ai une base de données bragée à remettre d'aplomb...
ldci27-Mar-2013/18:53:44+1:00
Bonjour à tous
cvCore.reds en est à 95%
Mais on peut déjà dessiner avec Red/System

http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/lines.jpg/

A +
shadwolf27-Mar-2013/19:06:52+1:00
ooooh tout plein de lignes roooooooooses !!! on dirait le debut de l episode 4 de la guerre des etoiles !!!

Prometeur ldci bravo!
ldci27-Mar-2013/22:11:56+1:00
Spécial pour Shadwolf: de toutes les couleurs



A +
ldci27-Mar-2013/22:12:23+1:00
Spécial pour Shadwolf: de toutes les couleurs

http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/lines2.jpg/

A +
coccinelle28-Mar-2013/8:54:39+1:00
@Pierre :

Ton fantasme n'est pas tant un fantasme à mon avis, cela existe déjà me semble-t-il avec ArduPilot qui permet des vols autonomes pré-programmés.

Un programme que j'aime beaucoup, c'est SurVoyeur qui avec des avions autonomes, effectue des surveillances aériennes de la faune. Le décollage, le vols et l'atterrissage sont entièrement automatiques ce qui permet des vols de nuit supervisés par une personne.

Quand j'avais vu que Red visait aussi la plateforme Amtel, je m'étais dit que ... mais bon, je n'ai pas poursuivi.
ldci28-Mar-2013/22:10:22+1:00
Toujours dans les bonnes nouvelles
Red/System sait écrire maintenant en mode graphique

http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/write.jpg/

A +
ldci30-Mar-2013/10:01:12+1:00
Bonjour à tous
Une animation graphique au format mov pour ceux qui veulent regarder l'avancement d'OpenCV et Red/S

http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/drawing.mov/

Just for fun!
shadwolf3-Apr-2013/23:26:12+2:00
j adore les demo que tu poste ldci...

Pour ceux qui soutenait que AGG etait extrement rapide j esepere qu apres avoir vu la video en MOV (format quicktime 20Mo ... avi c est ton ami non ?) je pense q
shadwolf3-Apr-2013/23:28:36+2:00
ue la ils ont plus rien a dire AGG c est lent!...

Alors oui on peut critiquer openCV et dire que c est pas anti aliasé.

Certes mais openCV lui est capable d anti aliasé avec acceleration GPU si besoin est et pas AGG...

bref moi ca me plait bien ... ldci tu es sûr qu on peu pas faire de reconnaissance de formes en temps reel depuis un flux video avec openCV ?
ldci4-Apr-2013/9:08:49+2:00
Merci Shadwolf,

Si si on peut faire de la reconnaissance de forme en temps réel avec OpenCV.C'est une super lib pour le vision computing.
Je mets en démo, un exemple de suivi des yeux qui te montrera ce qu'on peut faire avec OPenCV

http://www.wuala.com/fjouen/Code/OpenCV/Red/examples/images/night.m4v/


A +

`
PierreCh4-Apr-2013/10:48:28+2:00
Impressionnant!

Il y a un petit côté zombie, parfois... Mais ça me suggère plein d'applications possibles, dans mon domaine de la géologie. Mes neurones frétillent.

La fluidité et la capacité à retrouver les pupilles, malgré les clignements et/ou fermetures de paupières, ça me laisse pantois.


Une question bête: comparer AGG et OpenCV, ça ne serait pas un peu comme comparer une bicyclette et un coléoptère? Genre, ça n'a pas grand rapport, hormis de faire des graphiques, à un certain moment.


Je me résume pour moi-même, et dites si j'ai (b/r)ien compris: si j'ai bien suivi (pas sûr...), AGG a été choisi comme bibliothèque de base pour une nième implémentation en Rebol3 d'un équivalent de /view destiné à remplacer celui de presque feu Rebol2/view.
De ce que je peux voir, Red peut maintenant adresser OpenCV pour tracer plein de primitives; est-ce donc une direction qui serait prise pour implémenter un Red/View, en utilisant les primitives d'OpenCV?
Mais il me semble bien avoir vu passer un binding (de Kaj?) entre Red et GTK: ça ne ferait pas double emploi?
Ou alors j'ai rien pigé...
ldci4-Apr-2013/12:16:03+2:00
@PierreCh
OpenCV n'est pas utilisable pour faire un View. Ce n'est pas sa fonction. C'est une lib de calcul et de traitement de l'image qui a ce titre possède quelques primitives basiques de dessin, mais rien à voir avec un GTK pour créer des interfaces. L'intérêt pour moi est de pouvoir utiliser OpenCV avec Red, Rebol2 et Rebol 3 sans avoir à coder en C ou en C++ . L'autre intérêt, pour moi, a été de tester en profondeur le travail de Nenad sur Red/System qui est vraiment d'une très très grande qualité. Ca montre qu'on va pouvoir concevoir des applis pros à partir de Red. Enfin, c'est pour le fun!
ldci4-Apr-2013/22:29:16+2:00
Bonnes nouvelles pour ce binding qui fonctionne également avec la version 2.0 d'OpenCV. Je testerai la version 2.4 plus tard car je devrai modifier l'organisation des libs.
les structures et fonctions de bases sont complètes à 98% ! Quelques aménagements de détail à régler pour certaines fonctions inline.
J'attaque donc le coeur du métier: les fonctions de traitement des images ... pour faire quelques démos pour Shadwolf
Affaire à suivre
PierreCh4-Apr-2013/22:31:14+2:00
Au quai.

J'avais donc à peu près pigé, merci d'avoir dissipé mes doutes...


Bon, je suis de plus en plus tenté de regarder du côté de Red. Mais, comme disait Shadwolf, j'ai un peu de mal à "rentrer dedans".

Là, je pars en mission, mais une fois de retour, j'essaierai de m'atteler à faire et rédiger un tutoriel au fur et à mesure de mon apprentissage de Red. Car, comme le disait si justement DocKimbel, on participe souvent de manière égoïste à un projet libre: on le fait parce qu'on en a besoin, et le bon réflexe est de le mettre immédiatement dans la communauté.
ldci5-Apr-2013/0:18:35+2:00
Et voila. Ca commence à bien fonctionner!
Exemple d'un filtre gaussian
Red/System [
	Title:		"OpenCV Tests: Filtering"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:    "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
 

    #include %../opencv.reds
    filename: "/Users/fjouen/Desktop/newOpenCV/red/examples/images/baboon.jpg"
    srcWnd: "Using cvTrackbar: ESC to close"
    dstWnd: "Filtering"
    tBar: "Filtre"
    ; for the trackbar  we need a pointer to get back value
    pos: 0
    &pos: declare pointer! [integer!]
    &pos: :pos
    
    ; apply a gaussian blur according to the position of the trackbar (gaussain kernel= param1 * 3.0)
    trackEvent: func [[cdecl] pos [integer!] /local v param1] [ 
        v: (pos // 2) ; param1 must be odd !!!
        if v = 1  [param1: pos cvSmooth &src &dst CV_GAUSSIAN param1 3 0.0 0.0 ]
	cvShowImage dstWnd &dst
    ]
    
    ; load an image and make a copy 
    src: cvLoadImage filename CV_LOAD_IMAGE_COLOR; CV_LOAD_IMAGE_UNCHANGED 
    dst: cvCloneImage src
    &src: as byte-ptr! src ; pointer address
    &dst: as byte-ptr! dst ; pointer address
    &&src: declare double-byte-ptr! ;double pointeur for release
    &&src/ptr: &src
    &&dst: declare double-byte-ptr!; double pointeur for release
    &&dst/ptr: &dst

    ;create windows for output images
    cvNamedWindow srcWnd CV_WINDOW_AUTOSIZE
    cvNamedWindow dstWnd CV_WINDOW_AUTOSIZE
    cvMoveWindow dstWnd 630 150
    
    ; trackbars for the source window 
    cvCreateTrackbar tBar srcWnd &pos 100 :trackEvent &pos
    
    ; repeat show images 
    cvShowImage srcWnd &src
    cvShowImage dstWnd &dst
    cvWaitKey 0 ; until a key is pressed
    
    ; release window and images
    
    cvDestroyAllWindows
    cvReleaseImage &&src
    cvReleaseImage &&dst
    


On peut trouver la démo graphique ici
http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/filtering.m4v/
ldci5-Apr-2013/16:27:15+2:00
Voici une image : les transformations morphologiques des images (érosion et dilatation) fonctionnent parfaitement.

http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/morphology.jpg/
DocKimbel5-Apr-2013/22:54:13+2:00
Bravo ! Avec la reconnaissance de forme, on devrait pouvoir faire quelques applis sympas sur Android, une fois que Red sera porté dessus !
shadwolf8-Apr-2013/20:35:44+2:00
OOOOOOOOOOH MON DIEU LE MONSIEUR IL A LES YEUX Red !!!!

Blagues mise a part c est tout a fait de ce genre d application d openCV dont je parlais.

Enfin, CArl lance un debat sur r3 graphics qui a mon avis ne va deboucher sur rien comme d'hab et comme le precedent article "Making R3 a 3.0"

Et j adore toujours autant la facon que cyphre a de toujours tout rammener a sa petite personne.

While working on the R3/Saphir (R3 fork by Saphirion) graphics code overhaul(a necessary step to make porting R3 with graphics to other platforms more flexible) I'd like to share the current high-level design and source code structure with you.

Evidement c est durant son travail a lui que lui est venu cette idee de geni le fait que je dise qu il faut un fond de panier commun pour VID depuis plus de 10 ans ca compte pas!

CEci dit notre cher Guru a aucune idée de comment le faire ce fond de panier ce qu il veut c est que tu viennes lui proposer tes idées pour qu'il le reprenne a son compte.

Donc petite note pour Cyphre... Quitte a pomper une idée a quelqu un et vu qu on a deja largement evoqué le sujet ici pourquoi ne vient tu pas prendre une des 10 000 suggestions sur le sujet ici et en faire ton implementation commune idéale.
ldci8-Apr-2013/21:52:45+2:00
Des nouvelles du front
la lib cv.reds (pour le traitement d'image) en est à 75 % .
Pour le fun, un exemple de détection de contour avec un opérateur laplacien


Red/System [
	Title:		"OpenCV Tests: Laplacian"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:    "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
 

    #include %../opencv.reds
    filename: "/Users/fjouen/Desktop/newOpenCV/red/examples/images/fruits.jpg"
    srcWnd: "Source"
    dstWnd: "Laplacian"
   
    
    ; load an image and make a copy 
    src: cvLoadImage filename CV_LOAD_IMAGE_UNCHANGED
    &src: as byte-ptr! src ; pointer address
   
    &&src: declare double-byte-ptr! ;double pointeur for release
    &&src/ptr: &src
    size: declare CvSize!
    size: CvGetSize &src
    print [size lf]
    dst: cvCreateImage src/width src/height IPL_DEPTH_32F 3
    &dst: as byte-ptr! dst ; pointer address
    &&dst: declare double-byte-ptr!; double pointeur for release
    &&dst/ptr: &dst
    
    ;create windows for output images
    cvNamedWindow srcWnd CV_WINDOW_AUTOSIZE
    cvNamedWindow dstWnd CV_WINDOW_AUTOSIZE
    cvMoveWindow dstWnd 630 100
    
    ; repeat show images
    
    cvLaplace &src &dst 3  ; 1 to 7 and odd !
    cvShowImage srcWnd &src
    cvShowImage dstWnd &dst
   
    cvWaitKey 0 ; until a key is pressed
    
    ; release window and images
    
    cvDestroyAllWindows
    cvReleaseImage &&src
    cvReleaseImage &&dst
 



http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/laplacien.jpg/

Je suis ravi de la vitesse d'exécution de Red/S. On n'est pas loin des versions originales en C (à tester en détail)
A +
shadwolf9-Apr-2013/18:47:36+2:00
c est le genre de chose qui pourrait me faire passer a red ...

petite note pour le fun la finition mais aussi l aspect keep it simple.

En fin de project quand la lib sera 100% adaptée que penses tu de faire un joli dialect rebolien pour openCV pour rendre le code joli tout plein, tout plein ?
ldci10-Apr-2013/11:05+2:00
@ tous

La lib cv.reds (le traitement de l'image) est terminée 100%. On peut donc s'amuser avec plein de choses comme la géométrie épipolaire et autres joyeusetés matricielles.

Pour répondre à Shadwolf, la version rebol 2 (puis 3) est prévue et déjà en cours toujours avec l'idée keep it simple

@+
ldci10-Apr-2013/19:35:59+2:00
Bonsoir à tous
Je ne peux pas résister au plaisir de vous montrer une détection de contours avec un filtre de Canny réalisée en Red/s

http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/Canny.m4v/

et voici le code KIS pour ceux qui veulent jouer
Red/System [
	Title:		"OpenCV Tests: Laplacian"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:    "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
 

#include %../opencv.reds
filename: "/Users/fjouen/Desktop/newOpenCV/red/examples/images/fruits.jpg"

wndname: "Edge"
tbarname: "Threshold"
edge_thresh: 1
&edge_thresh: declare pointer![integer!]
&edge_thresh/value: edge_thresh

;define a trackbar callback

on_trackbar: func [[cdecl] h [integer!] ] [
    cvSmooth &gray &edge CV_BLUR 3 3 0.0 0.0
    cvNot &gray &edge
    ; specific to Red/S get back pointer value 
    edge_thresh: &edge_thresh/value
    
    ;Run the edge detector on grayscale
    cvZero &cedge
    
    if h > 0 [ cvCanny &gray  &edge int-to-float edge_thresh int-to-float edge_thresh * 3 3]
    
    ;copy edge points and show results
    cvCopy &image &cedge &edge
    cvShowImage wndname &cedge
    
    
]


image: cvLoadImage filename 1 
&image: as byte-ptr! image
&&image: declare double-byte-ptr!
&&image/ptr: &image


;Create the output image
cedge: cvCreateImage image/width image/height IPL_DEPTH_8U 3
&cedge: as byte-ptr! cedge
&&cedge: declare double-byte-ptr!
&&cedge/ptr: &cedge

;Convert to grayscale

gray: cvCreateImage image/width image/height IPL_DEPTH_8U 1
&gray: as byte-ptr! gray
&&gray: declare double-byte-ptr!
&&gray/ptr: &gray

edge: cvCreateImage image/width image/height IPL_DEPTH_8U 1
&edge: as byte-ptr! edge
&&edge: declare double-byte-ptr!
&&edge/ptr: &edge

cvCvtColor &image &gray CV_BGR2GRAY
;Create a window
cvNamedWindow wndname 1

;  create trackbar
cvCreateTrackbar tbarname wndname &edge_thresh 100 :on_trackbar

;Show the image

on_trackbar 0

;Wait for a key stroke; the same function arranges events processing
cvWaitKey 0

cvReleaseImage &&image
cvReleaseImage &&gray
cvReleaseImage &&edge
cvDestroyWindow wndname



Red is really cool!
ldci12-Apr-2013/9:27:05+2:00
salut @ tous les rebolers er reders. J'ai besoin de votre aide pour OPenCV ! C'aurait été trop beau si tout avait marché au premier essai.
Il me reste quelques problèmes à résoudre. La grande majorité des fonctions OpenCV prend en paramètre un pointeur sur une structure comme classiquement en C . Grâce à Nenad, sous Red/S les structures sont des pointeurs, donc pas de problème. Maintenant cela se complique lorsqu'on a besoin de passer en paramètre la structure et non le pointeur (une des 3 façons de passer une structure à une fonction en c).
exemple:
size: declare CvSize! ; une structure
size/width: 1000
size/height: 700

image: cvCreateImage size IPL_DEPTH_32F 3


Ce type d'appel ne fonctionne pas et nous devons utiliser la dernière façon du C : passer à la fonction chacun des membres comme ceci: image: cvCreateImage size/width size/height IPL_DEPTH_32F 3.
Dans ce cas, cela fonctionne parfaitement avec Red/S. Cool

Alors, où est le problème, me direz-vous? Dans le retour des paramètres renvoyés par la fonction externe. Ici encore quand la fonction OpenCV renvoie un pointeur sur une structure, pas de problème. Mais quand la fonction renvoie une simple structure cela ne fonctionne pas

cvGetSize: "cvGetSize" [
        "Returns width and height of array in elements"
            arr		[CvArr!]
            return:         [CvSize!]
]
 


Cette fonction prend en paramètre une image (CvArr!) et renvoie la taille de l'image sous la forme de deux entiers. Dans ce cas, REBOL marque un point car il suffit d'un simple return: reduce [CvSIze!/width CvSize!/height] pour qu'on puisse récupérer les deux entiers dans le programme appelant. Manifestement Red/S ne peut renvoyer qu'une seule valeur: une adresse (pour une struct! ou un pointer!) ou une valeur (pour les first class citizen (integer!, float!, byte!, c-string!)).
Naïvement, je pensais qu'en récupérant l'adresse de la structure renvoyée par la fonction, je pourrais récupérer les valeurs grâce à l'arithmétique des pointeurs : on récupère d'abord l'adresse de la structure size: CvGetSize image puis les deux entiers : width: Size/1 et height: size/2. Que nenni : j'obtiens une belle violation d'adresse en faisant cela.

Bon, je suis preneur de toutes les suggestions sur ce point (qu'on peut contourner, mais c'est pour la beauté du geste! )

Le second problème est plus compliqué: la gestion de macros dynamiques qui permet d'insérer ou de supprimer des élements dans une séquence


#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 */

typedef struct CvSeq
{
    CV_SEQUENCE_FIELDS()
}
CvSeq;



Bon, je suis en train de relire ma bible Kernighan & Ritchie, mais je patauge encore. Ce point est crucial à résoudre car les CvSeq sont très utilisées dans les fonctions numériques de traitement de l'image.
Je vais creuser, mais si vous avez des idées géniales j'adopte sans problème.
Merci à tous
ldci12-Apr-2013/12:58:55+2:00
Bon on avance ...
CvGetSize ne renvoie pas une adresse mais bien 2 entiers: ceci explique l'erreur de violation puisqu'on cherche à lire une adresse mémoire qui n'a pas de sens ou qui est protégée.
Si on fait un "as integer! CvGetSize &image", on récupère le premier entier correctement, mais pas le second : normal car on récupère 32 bits et non les 64 necessaires pour stocker 2 entiers.
Affaire à suivre !!!
ldci14-Apr-2013/18:26:26+2:00
Salut à tous, le forum n'est pas très actif ce week end. C'est vrai que c'est mieux de profiter du soleil.
Quelques stats sur Red et openCV: à ce jour j'ai porté
CXCORE: 321 fonctions et macros (100%)
CV: 158 fonctions et macros (100%)
HIGHGUI: 28 fonctions et macros (100%)
soit un total de 507 fonctions opérationnelles.
Comme je vous le disaisvendredi, il reste quelques points de détails à fignoler.
Bonne semaine à tous
ldci14-Apr-2013/18:53:15+2:00
Pour les heureux possesseurs de Mac, voici 2 démos exécutables pour jouer avec la caméra intégrée

http://www.wuala.com/fjouen/Code/OpenCV/Red/Demos/camera/
http://www.wuala.com/fjouen/Code/OpenCV/Red/Demos/camera_edge/
shadwolf16-Apr-2013/21:10:12+2:00
ldci je crois que le forum est pas actif soleil ou pas ...

Pour les merdes avec les pointeurs et les structures. On avait longuement evoqué ca il y a des années de ca et pas vraiement de solution avaient ete trouvee c etait au cas par cas au petit bonheure la chance et c est bien ce constat qui nous avait fait conclure que rebol load/dll tenait plus du gadget baclé que de la vrai fonctionalité.
shadwolf16-Apr-2013/21:16:14+2:00
si tu regardes les sources de r3 host-kit tu t appercoit que le but du paquet de fonctions C qui sont sous jacentes au dialecte r3gui c est justement de s abstraire des manipulations de pointeurs /structure pour facilité la tache. On delegue a des fonction C le soin de remplir les structure necessaires pour l emploi des fonction de la lib win32 et de recuperer les resultats mis forme pour l usage par rebol et ses dialectes par des fonctions adaptées.

Enfin rebol n est pas capable de faire des cast compliqués comme en C (int, float) * unefonction ( float, float); ce genre de choses....
ldci16-Apr-2013/21:29:57+2:00
Oui Shad, Rebol n'est pas au top pour ce genre de sport. J'espère que Red va améliorer les choses: pour l'instant tout ce qui est statique fonctionne parfaitement: on caste en sortie l'adresse fournie par un byte-ptr!. Mon grand problème est avec les structures dynamiques qui elles imposent des castings extrêmement compliqués comme celui-ci: CvPoint* line = (CvPoint*)cvGetSeqElem(lines,i);
En d'autres termes, un char* renvoyé par la fonction est casté en structure contenant 2 entiers.
J'avance, mais à petit pas d'autant plus que Red/S est très contraignant sur les types et ne pardonne rien : exemple les opérateurs mathématiques (+ - * /) demandent que les deux membres soient de même type : impossible de * un entier par un float sans risque d'erreur. Cela ne n'aide pas pour tester ces f... fonctions.
A +
shadwolf16-Apr-2013/21:33:15+2:00
les macros dynamiques sont employées au moment de la compilation pour adapter tes structures et le type de leur champs en fonction de ta machine ou de ton OS.

Pour cette example ca ressemble plus a une coqueterie pour sparer le code et le rendre tout joli tout plein a lire...

en gros ta struture c est une liste chainée...

Met tout dans une seule structure que tu nomme CvSeq
typedef struct CvSeq
{
int       flags;
int       header_size;
struct    CvSeq* h_prev;
struct    CvSeq* h_next;
struct    CvSeq* v_prev;
struct    CvSeq* v_next;
 int       total;
int       elem_size;
 char*     block_max;
char*     ptr;
int       delta_elems;
CvMemStorage* storage;
CvSeqBlock* free_blocks;
CvSeqBlock* first;

}CvSeq;

Au moment de la compilation le precompilo va te fabriquer cette structure de toute facon avec pointeur sur les strutures d elements h et v suivants et precedents c est une liste chainée avec deux elemente internes et deux liste interne a la structure.

Maintenant pourquoi avoir exploser en deux partie ce code?

ben une raison esthetique mais aussi une raison pratique. si pour une raison X ou Y le dev doit changer le mom de cette structure CvSeq il n aura a le faire que 3 fois et pas 18 ...
shadwolf16-Apr-2013/21:46:16+2:00
J espere avoir pu un peu contribué a ton effort LDCI.

C est bien d avoir quelqu un de motiver pour faire un pont de librairie et voir quelles sont les reels problemes rencontrer dans cette entreprise.

Jusqu ici on a surtout des gens qui commencait le boulot se heurtait a certains problemes sans chercher a les documentés ni a avoir des propositions de solutions pour continuer a avance... C est sur que si la solution c est fait un pre pont en C pour preparrer le terrain et le dialogue ca va pas simplifier les choses. Mais c est en gros ce que Carl fait dans hostkit. Il a un jeu de fonctions qui prepare le terrain pour que rebol sinterface au mieux avec la librairie qu il souhaite employer.

Mais bon c est un sacré travail tu dois ecrire un dialecte rebol pour que ton code ai la tronche et les avantages d un code rebol bien ecrit et pas un genre de pseudo C/pythonesque. tu dois faire une prepont pour que tes données venant et allant vers rebol conviennent au mieux a rebol et au C. Une fois tout ca fait tu peux enfin dire au monde que ca y est tu as reussit a adapter a rebol telle librairie.

Evidement comme tu es pas a l origine des evolution de la premiere librairie et que les auteurs de cette librairie ne connaissent pas la problematique rebol tu vas devoir adapter ta librairie a l envi.

Ceci dit c est fondemental comme travail afin de pouvoir faire d autre pont complet vers d autres librairies.

Maintenant que les sources de jedi knight2 outcast et academy sont dans le domaine publique je me prend a rever d une version qui serrait reecrite en rebol juste pour le fun .
ldci16-Apr-2013/21:46:54+2:00
Re Merci
Oui c'est une bonne idée que je vais creuser ASAP.
ldci18-Apr-2013/15:49:16+2:00
Salut à tous
Une nouvelle démo de la transformée de Hough en Red/System
http://www.wuala.com/fjouen/Code/OpenCV/Red/pub/hough.jpg/
Le point très important, c'est que le code utilise une structure dynamique CvSeq! Merci à Shadwolf pour sa suggestion de structure qui fonctionne également très bien. Ce qui est encourageant pour la suite c'est que le cast pointer et struct est opérationnel avec Red/S.
A +
Philippe19-Apr-2013/9:19:19+2:00
Hello

Super boulot..
Est-ce que ce genre de code permettrait de repérer par exemple de repérer et de compter des motifs comme des visages dans une foule ?

===Philippe
ldci19-Apr-2013/9:57:19+2:00
@Philippe
Oui tout à fait: je pense qu'il y a déjà des applications de cette nature.
A +
ldci26-Apr-2013/23:09:59+2:00
Salut à tous

http://www.wuala.com/fjouen/Code/OpenCV/Red/

J'ai modifié les appels aux libs openCV: vous pouvez maintenant utiliser cette lib avec Mac OSX ou Windows. Pour linux, il suffit de renseigner les chemins d'accès pour les bibliothèques.
Tout n'est pas parfait, mais ce qui fonctionne marche bien avec OpenCV 1 et 2. La version 64 bits ne fonctionne pas dans la mesure où Red utilise une version 32 bits de Rebol.
Tous les exemples du répertoire examples sont opérationnels: il suffit de changer les chemins d'accès pour les fichiers graphiques.
Merci à ceux qui peuvent tester sous Windows ou Linux de me remonter les problèmes.
A +
shadwolf28-Apr-2013/3:59:41+2:00
bravo ! tu as fait un enorme travail!

je testerai sur linux et windows.
J ai quelques idees d applications.
Se seront probablement mes premier programmes fait avec red!
shadwolf28-Apr-2013/4:05:06+2:00
compte sur moi pour remonter mes commentaires et pour te donner mes idees sur une possible dialectisation.

Ce que le publique rebolien oubli trop en ce moment c est que la notion de dialecte est une evolution du concept de langage
le langage comme le dialect evoluent du fait des echanges des gens qui s en servent. Un langage ou un dialecte a pour but principal de faciliter les echanges entre la machine et les humains. La machine ne pense pas comme nous et probablement ne pensera jamais comme un humain. Aussi evoluee que peut etre une simulation il y aura toujours une difference notable entre la simulation et la reelité. Un peu comme dans the matrix ou le hero a cette sensation que quelque chose n est pas a sa place dans la realité qu il vit.
ldci28-Apr-2013/11:12:07+2:00
Merci Shad
Je suis preneur pour le dialecte de toutes tes bonnes idées.
A +
jocko29-Apr-2013/7:54:59+2:00
Salut, François,

Bravo pour le travail!

Je fais quelques tests sous windows.
La compilation se passe bien, sauf pour testFilm (compilation error: unknown type, at line 33, near: [declare double-ptr!
&&image/ptr: &image

En revanche, les exe ne fonctionnent pas (windows xp):
message d'erreur: le point d'entrée de procédure isNaN est introuvable dans la bibliothèque de liaisons dynamique MSVCRT.DLL

Une idée ?
ldci29-Apr-2013/9:33:36+2:00
Salut jocko
Pour la premiėre erreur, je ne vois pas. Pour les exe, il faut désactiver dans la C-librairy les appels ā ces deux fonctions: elles sont spėcifiques aux OS de type BSD.Kaj de Vos a modifiė ce point,mais je n'ai pas encore eu le temps de l'inclure.
à plus
jocko29-Apr-2013/10:02:20+2:00
tu peux préciser de quelles fonctions il s'agit ?
ldci29-Apr-2013/10:13:17+2:00
Désolé Jocko
Tu mets en commentaire les 2 fonctions isNaN et isInf dans la lib C-library
Avec cette modif cela devrait marcher
A +
jocko29-Apr-2013/10:32:44+2:00
merci.
Il faut aussi mettre en commentaires cvIsNaN et cvIsInf dans cxtypes.
Mais je bute encore sur la définition de l'OS : apparemment, il ne sait pas que je suis sous windows. Comment lui préciser ? OS: "Windows" ne fonctionne pas
ldci29-Apr-2013/10:41:27+2:00
Exact pour les appels dans les types
Normalement le Switch OS que tu trouve dans chaque lib devrait fonctionner
Dans la mesure où tu peux compiler c'est certainement OK. A mon avis, modifie l'option default du switch OS pour pointer sur tes libs open CV.
Attention, les chemins que je donne sont pour OPenCV 1.0. Si tu utilises un version supérieure, il faut certainement modifier les noms des dll.
Je n'ai pas de machine windows sous la main cette semaine pour tester tout ça, mais on devrait arriver à compiler les exe sans trop de pb.
Merci pour les tests
jocko29-Apr-2013/10:57:04+2:00
Je l'ai fait, mais il semble persister à croire qu'il est sous MacOSX
ldci29-Apr-2013/12:46:48+2:00
Bon
Je ne vois pas:je vais tester la semaine prochaine sur une machine windows
A +
jocko29-Apr-2013/12:56:26+2:00
Où est défini OS ?
ldci29-Apr-2013/21:35:26+2:00
je pense dans red/runtime/platform. Le mieux est de demander à Nenad, non?
A +
DocKimbel30-Apr-2013/3:04:17+2:00
Bravo pour le colossal travail François ! Je suis pris par de nombreuses tâches sur Red en ce moment, mais je _vais_ répondre à tes mails, promis ! Pour info, Red/System peut maintenant générer des bibliothèques partagées (.dylib) sur Mac OSX en plus de Windows. Le support pour Linux sous x86 et ARM est en cours.

Pour l'OS, il est défini automatiquement par le compilateur suivant la cible de compilation (fichier: %red-system/config.r) et l'OS sur lequel on compile. On peut forcer une cible différente (pour cross-compiler par exemple), via l'option -t <cible> en ligne de commande passée à %rsc.r. Cf. la section "Cross-compilation support" sur https://github.com/dockimbel/Red

Si quelqu'un veut écrire un tuto en Fr pour les premiers pas en Red et/ou Red/System, ça serait sympa et utile.
jocko30-Apr-2013/4:47:17+2:00
@lcdi: la sélection des chemins de librairie selon le système se fait bien grâce à la variable OS dans la plupart de tes fichiers, sauf dans cxtypes.reds et dans cvtypes.reds, où il reste cette ligne

 ; for testing  
#define libopencv "/Library/Frameworks/OpenCV1-0.framework/Versions/A/OpenCV" 


il doit suffire de la remplacer par le même switch que dans les autres fichiers, mais il faut aussi sans doute redéfinir libopencv, et trouver la bonne dll sous windows.

@doc: bonne idée. Je n'ai malheureusement pas beaucoup de temps en ce moment. Mais il suffit peut-être de reprendre un exemple simple et de le commenter.
ldci30-Apr-2013/11:00:09+2:00
@Jocko
Vraiment désolé, j'ai oublié de désactiver ces lignes qui me servent quand je teste une librairie en stand alone. Il suffit de les mettre en commentaire. Dis moi si ça marche, mais en tout cas bravo pour ce point!
@Doc: que de bonnes nouvelles pour Red!
@+
jocko30-Apr-2013/11:18:52+2:00
si je mets en commentaires, la compilation ne se fait plus, et je ne peux pas lire le message d'erreur, car la console est saturée, apparemment avec du code source ...
PierreCh30-Apr-2013/12:16:02+2:00
@ldci: bravo pour le boulot! Je n'ai pas réussi à compiler tout le bazar, mais j'ai pu regarder les films
Ça me fait naître pas mal d'idées d'applications.

@Doc: Si quelqu'un veut écrire un tuto en Fr pour les premiers pas en Red et/ou Red/System, ça serait sympa et utile.
Effectivement, un tuto pour débutants Redeux me semble assez indispensable! J'avoue l'avoir longtemps cherché!

Je propose qu'on le rédige sur ce tuto, dans un fil dédié, et en compilant les choses, au fur et à mesure de la rédaction/maturation, sur le wiki de http://www.rebolfrance.info, par exemple.

Je sors à peine d'une grosse maladie, nerfs touchés; donc je suis dans le bon état psychologique pour écrire un truc à portée du débutant, fût-il couillonnet.
J'ai cependant horreur des appellations du genre "Red pour les Nuls", car en pédagogie, prendre son lectorat pour un c. est la dernière des choses à faire.
jocko30-Apr-2013/12:20:12+2:00
Nouvelles du front:

- il faut remplacer libopencv par les bonnes libs dans cv.reds (ligne 32) et dans cxcore.reds (lignes 76 et 2376)

- alors la compilation se fait
- mais erreur à l'exécution: il ne trouve pas cvFree

- je dévalide les deux lignes qui appellent cette fonction dans cxcore.reds (lignes 2433 et 2441 environ). Oui, je sais, c'est un peu sauvage !

Les programmes se lancent, mais donnent tous la même erreur ... moi, ça ne m'évoque rien ...

E:\Red\Red-master\red-system\builds>camera
OMP abort: Initializing libiomp5md.dll, but found libguide40.lib already initial
ized.
This may cause performance degradation and correctness issues.
Set environment variable KMP_DUPLICATE_LIB_OK=TRUE to ignore
this problem and force the program to continue anyway.
Please note that the use of KMP_DUPLICATE_LIB_OK is unsupported
and using it may cause undefined behavior.
For more information, please contact Intel(R) Premier Support.


E:\Red\Red-master\red-system\builds>
jocko30-Apr-2013/12:27:31+2:00
et là, je fais ce que dit la machine :
Set environment variable KMP_DUPLICATE_LIB_OK=TRUE,

... et ça commence à marcher.
Pas tout : drawing ok
camera se lance, la webcam s'allume mais pas d'image
d'autres sortent en erreur ...

Je regarderai de plus près quand j'aurai du temps.
jocko30-Apr-2013/14:46:01+2:00
pour faire fonctionner les exemples avec caméra sous windows, je dois remplacer cvRetrieveFrame par cvQueryFrame
jocko30-Apr-2013/18:22:13+2:00
j'ai fait tourner les programmes de traitement d'image, le problème venait de fichiers avec des chemins "en dur" ... qui n'existent pas sur ma machine.

le problème avec testFilm était double-ptr! au lieu de double-byte-ptr! (ligne 33)

J'ai testé avec opencv 2.1.0 ok

J'ai toujours le problème avec cvFree. Je soupconne une histoire de pointeur et de double pointeur ...

Enfin, il me semble que les programmes ne se terminent pas tous "proprement" (peut-être pas étonnant, vu que j'ai dévalidé cvFree)
ldci30-Apr-2013/20:16:33+2:00
Bravo et merci Jocko pour la lecture attentive du code et les tests.
J'ai mis à jour sur Wuala testFilm et surtout cxcore.reds avec une modifications pour cvFree qui demande en effet un pointeur double.
A première vue on n'a pas vraiment besoin de cvFree, mais je pense que plusieurs fonctions comme cvReleaseImage l'utilisent pour nettoyer la mémoire. Dans ce portage, je suis resté au plus près du code C, mais je pense qu'il faudra adapter la gestion de la mémoire spécifiquement pour Red et pour Rebol. De la même façon, en fonction des avancements de Red/S on pourra s'affranchir des appels à C-Library.
Pour les images utilisées dans le code, il faut télécharger le répertoire images sur Wuala et adapter à ses propres répertoires.
La bonne nouvelle maintenant c'est que tout ce code, porté à partir des exemples originaux en C, fonctionne vec OpenCV 2 sous OSX et Windows. Ceci étant dit, j'ai encore quelques points de détail à régler, notamment avec les structures qui miment les listes chaînées. De la même façon, le gestionnaire d'événements d'OpenCV qui fonctionne parfaitement en C a quelques problèmes en Red/S. Dernier point, je n'ai pas encore porté cvaux et autres car ces libs font appel au C++. Je ne sais pas encore quel sera la meilleure solution pour ça.
ldci30-Apr-2013/23:55:58+2:00
@PierreCH
En tant qu' utilisateur linux, peux tu tester les exemples comme Jocko l'a fait pour Windows. On aurait la totale: OSX, Linux, Windows.
Merci d'avance de ton aide.
A +
ldci1-May-2013/18:44:50+2:00
Salut à tous
J'ai profité du 1er mai pour commencer le portage définitif d'OpenCV avec REBOL. Je garde la même logique que le binding pour Red/S
Juste pour le plaisir voici un code en Red/s
Red/System [
	Title:		"OpenCV Tests"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:     "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]

#include %../opencv.reds

; function pointer that can be called by TrackBar callback 
trackEvent: func [[cdecl] pos [integer!]][cvGetTrackbarPos "Track" windowsName print ["Trackbar position is : " pos lf]]  


; this is pointer  to the function  called by mouse callback
mouseEvent: func [
	[cdecl]
            event 	[integer!]
            x	        [integer!]
            y	        [integer!]
            flags	[integer!]
            param	[pointer! [byte!]]
	] [
	print ["Mouse Position xy : " x " " y lf]
]

cvStartWindowThread  ; own's window thread 

*p: declare pointer! [integer!]  ; for trackbar position 
windowsName: "Lena: What a Wonderful World!"
print ["Loading a tiff image" lf]
lena: "/Users/fjouen/Desktop/newOpenCV/red/examples/images/lena.tiff"
lenaWin: cvNamedWindow windowsName CV_WINDOW_AUTOSIZE ; create window 

; for trackbar events 
cvCreateTrackbar "Track" windowsName *p 100 :trackEvent ; function as parameter
cvSetTrackBarPos "Track" windowsName 0
; for mouse events
cvSetMouseCallBack windowsName :mouseEvent none

;load image 
img: cvLoadImage lena CV_LOAD_IMAGE_COLOR
&img: as byte-ptr! img ; pointer address
&&img: declare double-byte-ptr!
&&img/ptr: &img
print [img " " &img lf]
print [windowsName " is " img/width  "x" img/height lf]


cvShowImage windowsName &img ; show image
cvWaitKey 500 ;wait 500 ms
cvResizeWindow windowsName 256 256 ; resize window
print [windowsName " is now 256x256 " lf]
cvWaitKey 500
print [windowsName " is now 512x512" lf]
cvResizeWindow windowsName 512 512
cvWaitKey 500
print [windowsName " is moved to 300x50 "lf]
cvMoveWindow windowsName 300 50  ;move window
cvWaitKey 0
print ["Saving the image in jpg" lf]
cvSaveImage "/Users/fjouen/Desktop/newOpenCV/red/examples/images/lena.jpg" &img ; save tiff as jpg
print ["done! Bye "]


cvDestroyWindow windowsName
cvReleaseImage &&img ; release image pointer



et le code en REBOL

#! /usr/bin/rebol
REBOL [
	Title:		"OpenCV Tests"
	Author:		"François Jouen"
	Rights:		"Copyright (c) 2012-2013 François Jouen. All rights reserved."
	License:     "BSD-3 - https://github.com/dockimbel/Red/blob/master/BSD-3-License.txt"
]
do %../opencv.r

; function pointer that can be called by TrackBar callback 
trackEvent: func [ pos [integer!] ][cvGetTrackbarPos "Track" windowsName print ["Trackbar position is : " pos]] 

; this is pointer  to the function  called by mouse callback
mouseEvent: func [
            event 	[integer!]
            x	    [integer!]
            y	    [integer!]
            flags	[integer!]
            param	[(int-ptr!)]
	] [
	print ["Mouse Position xy : " x " " y]
]
 
cvStartWindowThread  ; own's window thread 
*p: int-ptr! none  ; for trackbar position 
windowsName: "Lena: What a Wonderful World!"
print ["Loading a tiff image" lf]
lena: "/Users/fjouen/Desktop/newOpenCV/red/examples/images/lena.tiff"
lenaWin: cvNamedWindow windowsName CV_WINDOW_AUTOSIZE ; create window 
; for trackbar events 
cvCreateTrackbar "Track" windowsName *p 100 :trackEvent ; function as parameter
cvSetTrackBarPos "Track" windowsName 0

; for mouse events
cvSetMouseCallBack windowsName :mouseEvent none

;load image 
&img: cvLoadImage lena CV_LOAD_IMAGE_COLOR
&&img: int-ptr! none ; make a pointer to &img structure; a double pointer
&&img/int: struct-address? &img
print [windowsName " is " &img/width  "x" &img/height]

cvShowImage windowsName &img ; show image

cvWaitKey 500 ;wait 500 ms
cvResizeWindow windowsName 256 256 ; resize window
print [windowsName " is now 256x256 "]
cvWaitKey 500
print [windowsName " is now 512x512"]
cvResizeWindow windowsName 512 512
cvWaitKey 500
print [windowsName " is moved to 300x50 "]
cvMoveWindow windowsName 300 50  ;move window

cvWaitKey 0
print ["Saving the image in jpg"]
cvSaveImage "/Users/fjouen/Desktop/newOpenCV/red/examples/images/lena.jpg" &img ; save tiff as jpg
print ["done! Bye "]

cvDestroyWindow windowsName
cvReleaseImage &&img ; release image pointer



Cherchez les différences
PierreCh1-May-2013/22:46:30+2:00
@ldci: pas de lézard, je vais tester cela. Pour le moment, je m'immerge dans Red.

On aurait la totale: OSX, Linux, Windows.
Hm. patoutafé. Pour compléter dignement le tableau, il nous faudrait aussi FreeBSD (j'en ai un qui tourne pas loin, mais sans affichage graphique, OpenBSD, Haiku, Syllable, Android, OS/2... j'en omet.

Mais bon, commençons déjà par le début. J'ose espérer que ça ira tout seul pour les plate-formes respectant la norme POSIX...
ldci1-May-2013/22:54:55+2:00
@PierreCh

OpenCV supporte uniquement Windows, Linux, Mac OS, iOS and Android. C'est déjà pas mal.
Merci pour les tests sous Linux
A +
PierreCh2-May-2013/10:14:13+2:00
Au quai; donc les chantiers suivants pourront être de porter openCV sur plein d'autres plate-formes. Si jamais on a peur de s'ennuyer...
PierreCh2-May-2013/16:17:33+2:00
Bon, je viens d'essayer de compiler fjouen/Code/OpenCV/Red/examples/camera.reds

J'ai un peu bataillé, j'ai fait les modifs suivantes:
  # pierre@autan: ~$        < 2013_05_02__16_01_51 >
dog -l 14 ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/libs/cxcore.reds
        Linux           [#define cxcore "/usr/lib/libcxcore.so.2.1"]

  # pierre@autan: ~$        < 2013_05_02__16_01_51 >
dog -l 14 ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/libs/cv.reds
        Linux           [#define cvision "/usr/lib/libcv.so"]

  # pierre@autan: ~$        < 2013_05_02__16_01_51 >
dog -l 15 ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/libs/highgui.reds
        Linux           [#define highgui "/usr/lib/libhighgui.so.2.1"]



En fait, j'ai juste informé les lignes "Linux" qui étaient vides, en regardant ce qu'avaient installé les paquets suivants:
  # pierre@autan: ~$        < 2013_05_02__16_04_22 >
apt-cache search opencv
libcv-dev - development files for libcv
libcv2.1 - computer vision library
libcvaux-dev - development files for libcvaux
libcvaux2.1 - computer vision extension library
libhighgui-dev - development files for libhighgui
libhighgui2.1 - computer vision GUI library
opencv-doc - OpenCV documentation and examples
python-opencv - Python bindings for the computer vision library


Moyennant cela, ça arrive à compiler:

  # pierre@autan: ~$        < 2013_05_02__16_04_22 >
cd dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples/

  # pierre@autan: ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples$        < 2013_05_02__16_04_22 >
rebol
>> do/args %~/Red/red-system/rsc.r "%camera.reds"

-= Red/System Compiler =- 
Compiling /home/pierre/heaume_pierre/developpt/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples/camera.reds ...

...compilation time:     7897 ms
...linking time:         151 ms
...output file size:     21256 bytes
>> q

  # pierre@autan: ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples$        < 2013_05_02__16_04_22 >



Tout cela m'a bien produit un exécutable:
  # pierre@autan: ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples$        < 2013_05_02__16_04_22 >
ls -trlh ~/Red/red-system/builds/ | tail -1
-rwxr--r-- 1 pierre pierre  21K  2 mai   16:16 camera


Mais mille fois hélas! il ne daigne s'exécuter, et m'inflige quelque désagréable réflexion:
  # pierre@autan: ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples$        < 2013_05_02__16_04_22 >
~/Red/red-system/builds/camera 
/home/pierre/Red/red-system/builds/camera: symbol lookup error: /home/pierre/Red/red-system/builds/camera: undefined symbol: isNaN


Voilà où j'en suis.

Peut-être n'ai-je pas essayé par le programme le plus simple, me dis-je? François, un avis éclairé?
jocko2-May-2013/16:41:18+2:00
Courage, tu es sur la bonne voie !

regarde les messages du 29 avr de 9 à 10h: isNaN et isInf sont à mettre en commentaires.
PierreCh2-May-2013/17:17:43+2:00
Auquai, je vois ça.
PierreCh2-May-2013/17:39:08+2:00
Je reprends ça:
vi ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/libs/C-library.reds 
vi ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/libs/cxtypes.reds 
=> je commente isNaN et isinf

vi ~/dev/rebol/red_opencv/fjouen/Code/OpenCV/Red/libs/cxcore.reds

Je commente:
            ;if v = 2 [cvFree ptr]
            ;if v = 2 [cvFree ptr]
aux lignes 2434 et 2439


Je recompile, je lance, et voilà:
  # pierre@autan: ~$        < 2013_05_02__17_29_00 >
~/Red/red-system/builds/camera 
088DE190
Output #0, mov, to '/Users/fjouen/Desktop/newOpenCV/red/examples/camera.mov':
    Stream #0.0: Video: mpeg4, yuv420p, 1280x1024, q=2-31, 83886 kb/s, 90k tbn, 24 tbc
OpenCV Error: Bad argument (Couldn't open output file for writing) in open, file /build/buildd-opencv_2.1.0-3+squeeze1-i386-s1FZIh/opencv-2.1.0/src/highgui/cvcap_ffmpeg.cpp, line 1341
terminate called after throwing an instance of 'cv::Exception'
  what():  /build/buildd-opencv_2.1.0-3+squeeze1-i386-s1FZIh/opencv-2.1.0/src/highgui/cvcap_ffmpeg.cpp:1341: error: (-5) Couldn't open output file for writing in function open

Abandon


Non, j'abandonne pas!
Je vois qu'il y a une référence "en dur" quelque part à un chemin macqueux. Faut que je déniche ça.
PierreCh2-May-2013/17:51:16+2:00
Voilà:
vi ~/rebol/red_opencv/fjouen/Code/OpenCV/Red/examples/camera.reds

Et la ligne où est définie movie, j'y mets un nom à la noix d'un fichier vide que j'ai touch-é:
movie: "camera.mov"

Et là, ça marche!

Enfin, bon... Disons que ça s'exécute, que j'ai une fenêtre vide qui est là, et voilà. Sans message d'insulte.

Voilà ce que ça me dit:
  # pierre@autan: ~$        < 2013_05_02__17_34_38 >
~/Red/red-system/builds/camera 
00000000
Output #0, mov, to 'camera.mov':
    Stream #0.0: Video: mpeg4, yuv420p, 1280x1024, q=2-31, 83886 kb/s, 90k tbn, 24 tbc


La première fois que j'ai réussi à la faire tourner, la fenêtre était bariolée de rose et de vert. Depuis, elle est grise unie. J'ai essayé d'allumer ma webcam avec un coup de cheese: que nenni. Ah, si, des images, figées, mais alors très curieuses, avec de vagues évocations de ce qui pourrait être mon bureau.

Ça avance...
jocko2-May-2013/18:00:09+2:00
tu pourrais supprimer l'enregistrement video en faisant
 rec: false 

ça éviterait de remplir ton disque, et de prendre de la puissance de calcul !
ldci2-May-2013/19:33:17+2:00
Salut
Merci pour les tests Linux qui sont très encourageants.
@PierreCh, tu peux modifier cette ligne
capture: cvCreateCameraCapture CV_CAP_ANY en remplaçant CV_CAP_ANY par le numéro de ta caméra.
Jocko a raison, mets rec à false, car je ne suis pas certain du FOURCC (du moins sur mac). Je ferai des tests la semaine prochaine.
Pour cvIsNaN et cvIsInf, voici une implémentation en REBOL qui peut être utile.
<Code>
cvIsNaN: func [value [decimal!] /local result] [
      value: 0
      if ( shift value 32) AND to-integer #7FFFFFFF = to-integer #7FF00000 [value: 1]
if value <> 0 [value: 1]
    either value = 2 [return true] [return false]
]


cvIsInf: func [value [decimal!] /local result] [
value: 0
      if ( shift value 32) AND to-integer #7FFFFFFF = to-integer #7FF00000 [value: 1]
if value = 0 [value: 1]
    either value = 2 [return true] [return false]
]

</code>

A plus
ldci3-May-2013/11:51:26+2:00
@ tous
Ne tenez ps compte de CvIsNaN et de CvIsInf: je devais être vraiment fatigué! Bien évidemment , c'est la variable locale qui doit être incrémentée et non la valeur passée en paramètre. De plus on peut faire plus simple.
A +

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2