OpenCV et Rebol V2
ldci14-Mar-2014/15:01:45+1:00
Salut à tous
Je viens de mettre sur GitHub la nouvelle version du portage opencv pour rebol:
https://github.com/ldci/OpenCV-rebol

J'ai beaucoup simplifié les appels aux routines de façon à ce que les structures soient toujours traitées comme des pointeurs (ce qu'elles sont au niveau du compilateur rebol) et sans que vous ayez besoin de passer leur adresse en paramètre.
Il y a beaucoup de nouveaux exemples (amusants) à tester ainsi que des exemples avec la lib RebGUI d'Ashley Truter pour montrer qu'on peut faire des choses superbes avec Rebol
Attention: tout n'est pas terminé au niveau des tests et les libs seront modifiées au fur et à mesure des tests de chacune des fonctions.
Le même traitement sera fait pour la version Red/System dès la fin des tests pour la version Rebol.
Bon code
jipé16-Mar-2014/0:09:08+1:00
Bonsoir François,
J'essaie de raccorcher les wagons reboliens depuis quelques semaines mais j'ai perdu la main...
Comme ta lib m'intéresse au plus au point, pourrais-tu m'indiquer en quelques lignes comment on l'installe et on fait mumuse avec ??
D'avance merci.
ldci17-Mar-2014/9:33:25+1:00
Salut Jipé
En premier lieu, il faut installer OpenCV (http://opencv.org/) en fonction de l'OS que tu utilises (Windows, Linux ou Mac OSX). Si tu es sous Linux ou Mac, il te faudra compiler et installer OpenCV. Pour cela tu peux utiliser Cmake (2.8) en faisant attention de compiler en 32 bits car Rebol et Red ne supportent pas le 64 bits actuellement.
Ensuite tu récupère sur GitHub le portage. Ensuite tu n'as plus qu'à modifier les chemins d'accès à tes libs dans le fichier opencv.r selon ton installation et c'est tout. Enfin, tu regardes les exemples dans le répertoire samples. Ce qui fonctionne actuellement : hihgui.r, cxcore.r et cv.r avec cependant quelques problèmes, notamment lorsque les routines renvoient une structure et non un pointeur. Je suis en train de tester les fonctions une par une, mais j'utilise déjà pas mal de choses pour mes besoins de recherche.
N'hésite pas à tester et bon code.
Amicalement
jipé17-Mar-2014/11:26:58+1:00
Merci beaucoup,
J'avais déjà un peu débroussaillé le truc, effectivement c'est pas trop sorcier. Seul bémol : l'install produit 3.4 GB (!) de fichiers décompressés, c'est bien ça ?
Amicalement,
JP
ldci17-Mar-2014/20:14:21+1:00
Re
Ca me semble beaucoup : tu es sous quel OS?
Par ailleurs, attends quelques jours pour tes tests: je suis en train de modifier légèrement les appels aux routines pour plus de simplicité et pour uniformiser le code entre Rebol et Red;
Amicalement
jipé17-Mar-2014/20:57:35+1:00
Re-re
Je suis sous win 7. J'ai relancé une install, et oui, c'est bien ça !
Sinon, j'attends tes modifs...
Au plaisir,
JP
ldci18-Mar-2014/15:13:59+1:00
Version mise à jour sur GitHub.
Tous les exemples fonctionnent parfaitement. Attention cependant, je suis en train de normer progressivement les libs pour maintenir une compatibilité REBOL/Red. Après pas mal d'essais et de réflexion, j'ai choisi de forcer le casting des structures Rebol en vrai pointeur (une addresse mémoire). J'ai introduit une nouvelle fonction as-pointer! qui renvoie l'adresse de la structure comme dans cet exemple, &igray: as-pointer! cvCreateImage src/width src/height IPL_DEPTH_8U 1 C'est cette valeur qui, à de très rares exceptions, est passée à la routine opencv. C'est le mode de fonctionnement par défaut de Red et sincèrement c'est plus souple, notamment pour les pointeurs nuls! En revanche sous pouvez garder tout l'intérêt des structures à l'intérieur de votre code Rebol ou Red. Ce choix est maintenant définitif et va être étendu aux différentes libs.
Amicalement
ldci9-Jul-2014/22:59:18+2:00
REBOL n'étonnera toujours !
Lors du portage d'opencv vers Rebol, j'ai toujours regretté d'avoir à charger toutes les fonctions de core, de highgui, etc.
En testant Xojo, j'avais trouvé que leur façon d'appeler des libs externes était astucieuse et permettait d'appeler uniquement les fonctions externes dont on a besoin comme dans cet exemple : Soft Declare Function cvNamedWindow lib opencv (name As CString, flag as Integer) as Integer.
On peut faire la même chose en REBOL: il suffit de déclarer une fonction mezzanine. Ce point a été documenté par Carl (http://www.rebol.com/docs/library.html#define).
Un exemple
; on charge la lib externe
lib: load/library %/Library/Frameworks/OpenCV2-0.framework/Versions/Current/OpenCV

;on définit une fonction mezzanine générique
cvFunc: func [specs identifier][make routine! specs lib identifier]

; puis les fonctions externes dont on a besoin en gérant le type de valeur renvoyée par la fonction
NamedWindow: cvFunc [name [string!] flag [integer!] return: [integer!] ] "cvNamedWindow"	
waitKey: cvFunc [delay [integer!] return: [integer!]] "cvWaitKey"

; maintenant on peut appeler ces fonctions dans son code

w: NamedWindow "Hello World" 0
print w
c: waitKey 0
print to-char c



et ça marche! Génial pour tester rapidement des fonctions externes dans son code REBOL
ldci20-Jul-2014/18:37:45+2:00
Suite des aventures ....
Ce qui est illustré dans l'exemple précédent permet de se simplifier la vie notamment lorsque les fonctions opencv renvoient un pointer que l'on peut utiliser tel quel:
windowsName: "Hello OpenCV World"						; opencv window name
w: cvNamedWindow windowsName CV_WINDOW_AUTOSIZE			; create a opencv Window
img: cvLoadImage picture 4								; get a pointer to loaded image



img est un pointeur sur une image et dans la plupart des cas cela est suffisant pour passer l'image pointée à une autre fonction. Ceci étant, dans certain cas on peut avoir envie de récupérer le contenu de la zone mémoire pointée, par exemple pour connaitre les caractéristiques de l'image.
Ici encore REBOL montre ses énormes qualités : il suffit d'associer une structure à la zone pointée pour récupérer le contenu.

imgStruct: make struct! IplImage! none					; make a rebol structure for IPLimage
content: get-memory img length? third imgStruct			; content of pointer
change third imgStruct content							; update rebol structure
print second imgStruct									; print structure elements


Bien évidemment il faut utiliser la superbe fonction get-memory de Ladislav Mecir pour récupérer les données et connaître la structure openCV. L'opération magique est "change third imgStruct content" pour que la structure soit initialisée par le contenu de l'adresse pointée que nous renvoie la fonction opencv.
Pas mal REBOL, non ?
DideC25-Jul-2014/10:09:06+2:00
Bravo François,

Avec Jocko et Dockimbel, vous devez être les 3 francophones (que je connaisse) les plus calés en interfaçage Rebol et DLL.

Un de ces 4, il serait génial de compulser dans un document les différents trucs/astuces/bouts de code permettant de simplifier l'usage de DLL avec Rebol.
Ce serait une doc précieuse pour ceux qui (comme moi) n'ose pas trop s'y coller !
ldci26-Jul-2014/0:03:42+2:00
Salut Didier
C'est une bonne idée: j'ai des notes éparses que je devrais mettre en forme quand j'aurais un peu de temps.Mais j'ai l'impression que notre groupe devient de plus en plus petit.
A +
jjv8-Aug-2014/14:47:04+2:00
"Mais j'ai l'impression que notre groupe devient de plus en plus petit." ldci
Tu as surement raison, mais perso, même si je ne participe pas trop au forum que je consulte très régulièrement, j'aime REBOL et l'utilise quotidiennement.

JJV
ldci16-Sep-2014/20:01:27+2:00
OpenCV est en préparation d'une version 3.0.0 avec plein de nouveautés.
Pour le fun, j'ai compilé sous Mac OSX avec CMake 2.8 la version alpha en 32 bits pour qu'elle soit compatible avec Rebol et ça marche
Malheureusement pour nous, OpenCV est écrit maintenant en C++ ce qui limite l'accès aux nouvelles fonctions. La bonne nouvelle c'est que les fonctions C qui sont maintenues restent accessibles à Rebol et Red.

Login required to Post.


Powered by RebelBB and REBOL 2.7.8.4.2