Page 1 sur 1

Open CV est il possible sur purebasic?

Publié : ven. 04/nov./2011 16:48
par totorcalais
Bonjour,

Je m'intéresse à OpenCv et j'ai trouvé peu de fil de discussion en ce sens.

Je sais que je m'attaque à gros et j'ai donc cherché une base de départ.

J'ai trouvé ce code mais (comme l'auteur sur le forum anglais le déplorait), un problème d'accès mémoire s'impose.

Quelqu'un a-t-il une solution?

Je précise que je suis débutant et que c'est en forgeant qu'on devient forgeron ;)

Code : Tout sélectionner

;-
EnableExplicit
OnErrorGoto(?HandleError)
;-
;{ IPL Image Declarations
#IPL_DEPTH_SIGN = $80000000

#IPL_DEPTH_1U = 1
#IPL_DEPTH_8U = 8
#IPL_DEPTH_16U = 16
#IPL_DEPTH_32F = 32

#IPL_DEPTH_8S  = (#IPL_DEPTH_SIGN | 8)
#IPL_DEPTH_16S = (#IPL_DEPTH_SIGN | 16)
#IPL_DEPTH_32S = (#IPL_DEPTH_SIGN | 32)

#IPL_DATA_ORDER_PIXEL = 0
#IPL_DATA_ORDER_PLANE = 1

#IPL_ORIGIN_TL = 0
#IPL_ORIGIN_BL = 1

#IPL_ALIGN_4BYTES = 4
#IPL_ALIGN_8BYTES = 8
#IPL_ALIGN_16BYTES = 16
#IPL_ALIGN_32BYTES = 32

#IPL_ALIGN_DWORD = #IPL_ALIGN_4BYTES
#IPL_ALIGN_QWORD = #IPL_ALIGN_8BYTES

#IPL_BORDER_CONSTANT = 0
#IPL_BORDER_REPLICATE = 1
#IPL_BORDER_REFLECT = 2
#IPL_BORDER_WRAP = 3
;}
;
;{ Color Conversion Constants
#CV_BGR2BGRA = 0
#CV_RGB2RGBA = #CV_BGR2BGRA

#CV_BGRA2BGR = 1
#CV_RGBA2RGB = #CV_BGRA2BGR

#CV_BGR2RGBA = 2
#CV_RGB2BGRA = #CV_BGR2RGBA

#CV_RGBA2BGR = 3
#CV_BGRA2RGB = #CV_RGBA2BGR

#CV_BGR2RGB =  4
#CV_RGB2BGR =  #CV_BGR2RGB

#CV_BGRA2RGBA = 5
#CV_RGBA2BGRA = #CV_BGRA2RGBA

#CV_BGR2GRAY = 6
#CV_RGB2GRAY = 7
#CV_GRAY2BGR = 8
#CV_GRAY2RGB = #CV_GRAY2BGR
#CV_GRAY2BGRA = 9
#CV_GRAY2RGBA = #CV_GRAY2BGRA
#CV_BGRA2GRAY = 10
#CV_RGBA2GRAY = 11

#CV_BGR2BGR565 = 12
#CV_RGB2BGR565 = 13
#CV_BGR5652BGR = 14
#CV_BGR5652RGB = 15
#CV_BGRA2BGR565 = 16
#CV_RGBA2BGR565 = 17
#CV_BGR5652BGRA = 18
#CV_BGR5652RGBA = 19

#CV_GRAY2BGR565 = 20
#CV_BGR5652GRAY = 21

#CV_BGR2BGR555  = 22
#CV_RGB2BGR555  = 23
#CV_BGR5552BGR  = 24
#CV_BGR5552RGB  = 25
#CV_BGRA2BGR555 = 26
#CV_RGBA2BGR555 = 27
#CV_BGR5552BGRA = 28
#CV_BGR5552RGBA = 29

#CV_GRAY2BGR555 = 30
#CV_BGR5552GRAY = 31

#CV_BGR2XYZ =  32
#CV_RGB2XYZ =  33
#CV_XYZ2BGR =  34
#CV_XYZ2RGB =  35

#CV_BGR2YCrCb = 36
#CV_RGB2YCrCb = 37
#CV_YCrCb2BGR = 38
#CV_YCrCb2RGB = 39

#CV_BGR2HSV =  40
#CV_RGB2HSV =  41

#CV_BGR2Lab =  44
#CV_RGB2Lab =  45

#CV_BayerBG2BGR = 46
#CV_BayerGB2BGR = 47
#CV_BayerRG2BGR = 48
#CV_BayerGR2BGR = 49

#CV_BayerBG2RGB = #CV_BayerRG2BGR
#CV_BayerGB2RGB = #CV_BayerGR2BGR
#CV_BayerRG2RGB = #CV_BayerBG2BGR
#CV_BayerGR2RGB = #CV_BayerGB2BGR

#CV_BGR2Luv =  50
#CV_RGB2Luv =  51
#CV_BGR2HLS =  52
#CV_RGB2HLS =  53

#CV_HSV2BGR =  54
#CV_HSV2RGB =  55

#CV_Lab2BGR =  56
#CV_Lab2RGB =  57
#CV_Luv2BGR =  58
#CV_Luv2RGB =  59
#CV_HLS2BGR =  60
#CV_HLS2RGB =  61

#CV_COLORCVT_MAX  = 100
;}
;
#CV_LOAD_IMAGE_UNCHANGED = -1
; /* 8bit, color Or Not */
#CV_LOAD_IMAGE_GRAYSCALE = 0
; /* 8bit, gray */
#CV_LOAD_IMAGE_COLOR = 1
; /* ?, color */
#CV_LOAD_IMAGE_ANYDEPTH = 2
; /* any depth, ? */
#CV_LOAD_IMAGE_ANYCOLOR = 4
; /* ?, any color */
;/
#CV_WINDOW_AUTOSIZE = 1
;/
#CV_BLUR_NO_SCALE = 0
#CV_BLUR  = 1
#CV_GAUSSIAN = 2
#CV_MEDIAN = 3
#CV_BILATERAL = 4
;/
#CV_CANNY_L2_GRADIENT = (1 << 31)
;/
;-
Structure IplROI
  ;
  coi.l
  ; /* 0 - no COI (all channels are selected), 1 - 0th channel is selected ...*/
  xOffset.l
  yOffset.l
  Width.l
  Height.l
  ;
EndStructure
Structure IplImage
  ;
  nSize.l
  ; sizeof(IplImage)
  id.l
  ; version (=0)
  nChannels.l
  ; Most of OpenCV functions support 1,2,3 or 4 channels
  alphaChannel.l
  ; ignored by OpenCV
  depth.l
  ; pixel depth in bits: IPL_DEPTH_8U, IPL_DEPTH_8S, IPL_DEPTH_16S, IPL_DEPTH_32S, IPL_DEPTH_32F And IPL_DEPTH_64F are supported
  colorModel.b[4]
  ; ignored by OpenCV
  channelSeq.b[4]
  ; ditto
  dataOrder.l
  ; 0 - interleaved color channels, 1 - separate color channels.  cvCreateImage can only create interleaved images
  origin.l
  ; 0 - top-left origin, 1 - bottom-left origin (Windows bitmaps style)
  align.l
  ; Alignment of image rows (4 or 8).   OpenCV ignores it And uses widthStep instead
  Width.l
  ; image width in pixels
  Height.l
  ; image height in pixels
  roi.l
  ; image ROI. if NULL, the whole image is selected
  maskROI.l
  ; must be NULL
  ImageID.l
  ; ditto
  tileInfo.l
  ; ditto
  imageSize.l
  ; image data size in bytes (==image->height*image->widthStep in Case of interleaved Data)
  imageData.l
  ; pointer to aligned image data
  widthStep.l
  ; size of aligned image row in bytes
  BorderMode.l[4]
  ; ignored by OpenCV
  BorderConst.l[4]
  ; ditto
  imageDataOrigin.l
  ; pointer to very origin of image data (Not necessarily aligned) - needed For correct deallocation
EndStructure
Structure CvSize
  Width.l
  Height.l
EndStructure
;-
Import "highgui.lib"
  ; function declarations
  cvLoadImage(Filename.s, iscolor.l = #CV_LOAD_IMAGE_COLOR)
  cvNamedWindow(name.s, Flags.l = #CV_WINDOW_AUTOSIZE)
  cvDestroyWindow(name.s)
  cvCreateTrackbar(trackbar_name.s, window_name.s, *Value.l, count.l, *cvTrackbarCallback.l)
  cvShowImage(name.s, image.l)
  ;
  cvWaitKey(delay.l = 0)
  ; Wait for key event infinitely (delay<=0) or for "delay" milliseconds
EndImport
Import "cxcore.lib"
  ;
  cvReleaseImage(*Image.l)
  cvCreateImage(Width.l, Height.l, depth.l, channels.l)
  ; Creates IPL image (header and data)
  cvNot(src.l, dst.l)
  cvSetZero(arr.l)
  cvCopy(src.l, dst.l, mask.l = #Null)
  ;
EndImport
Import "cv.lib"
  ;
  cvCvtColor(src.l, dst.l, code.l)
  cvSmooth(*src.l, *dst.l, smoothtype.l = #CV_GAUSSIAN, param1.l = 3, param2.l = 0, param3.d = 0, param4.d = 0)
  cvCanny(image.l, edges.l, threshold1.d, threshold2.d, aperture_size.l = 3)
  ;
EndImport
;-
Global *Image.IplImage, *cedge.IplImage, *gray.IplImage, *edge.IplImage
;
Global edge_thresh.l = 1
;
;-
Procedure.l on_trackbar(h.l)
  ;
   ;cvSmooth(*gray, *edge, #CV_BLUR, 3, 3, 0, 0)
  ; ;
  ; cvNot(*gray, *edge)
  ; ;
  ; cvCanny(*gray, *edge, edge_thresh, edge_thresh * 3, 3)
  ; ;
  ; cvSetZero(*cedge)
  ; ;
  ;cvCopy(*Image, *cedge, *edge)
  ; ;
  ;cvShowImage("Edge", *cedge)
  ;
EndProcedure
;-
Define.CvSize HoldCVSize
;
*Image = cvLoadImage("fruits.jpg", 1)
;
If *Image
  ;
  Debug "Loaded"
  With *Image
    Debug \nSize
    Debug \Width
    Debug \Height
    Debug \nChannels
    Debug \depth
    Debug \dataOrder
    Debug \origin
    Debug \imageSize
    Debug \widthStep
  EndWith
  ;
  HoldCVSize\Width = *Image\Width
  HoldCVSize\Height = *Image\Height
  ;
  *cedge = cvCreateImage(*Image\Width, *Image\Height, #IPL_DEPTH_8U, 3)
  ;
  If *cedge
    ;
    Debug "cedge Create : "+Str(*cedge)
    ;
    *gray = cvCreateImage(*Image\Width, *Image\Height, #IPL_DEPTH_8U, 1)
    *edge = cvCreateImage(*Image\Width, *Image\Height, #IPL_DEPTH_8U, 1)
    ;
    If *gray And *edge
      ;
      Debug "Edge and Gray create"
      ;
      cvCvtColor(*Image, *gray, #CV_BGR2GRAY)
      ;cvCvtColor(*Image, *gray, #CV_BGR2BGRA)
      ;
      cvNamedWindow("Edge", 1)
      ;
      cvCreateTrackbar("Threshold", "Edge", @edge_thresh, 100, @on_trackbar())
      ;
      on_trackbar(0)
      ;
      cvWaitKey(0)
      ;
      cvReleaseImage(@*edge)
      cvReleaseImage(@*gray)
      ;
    EndIf
    ;
    cvReleaseImage(@*cedge)
    ;
  EndIf
  ;
  cvReleaseImage(@*Image)
  ;
  cvDestroyWindow("Edge")
  ;
EndIf
;
;-
Debug "Ended"
;-
End
;-
HandleError:
;
MessageRequester("Error!", GetErrorDescription())
;
End
;-
Voici les fichiers servant à ce test :
http://www.cetout.net/captechno/opencvtest.zip

Re: Open CV est il possible sur purebasic?

Publié : ven. 04/nov./2011 17:42
par Ar-S
Salut,

Ce code ne fonctionne ni avec la 4.51 ni avec la 4.60rc2 chez moi.
Mais pour te répondre, je ne connais pas openCV mais je pense que c'est un créateur de CV (...)
Ce qui est logiquement possible de faire avec PB même si ça risque de ne pas être de la tarte.
Le second truc peut-être délicat est l'exportation du CV dans un format précis (.docx, .pdf..)
Peut-être que d'autres pourront être plus précis.

Re: Open CV est il possible sur purebasic?

Publié : ven. 04/nov./2011 19:38
par case
Ar-S a écrit :Salut,

Ce code ne fonctionne ni avec la 4.51 ni avec la 4.60rc2 chez moi.
Mais pour te répondre, je ne connais pas openCV mais je pense que c'est un créateur de CV (...)
:lol:

http://fr.wikipedia.org/wiki/OpenCV

Re: Open CV est il possible sur purebasic?

Publié : ven. 04/nov./2011 20:40
par totorcalais
En effet, il s'agit d'une série de libs intéressantes car j'ai en tête de l'appliquer à de la réalité augmentée.

Je pensais (innocemment, il est vrai) qu'il était possible de faire des applis avec purebasic (au lieu de se remettre au C voire C++) comme il est possible de le faire avec le projet Goblin XNA.

Le code proposé (que j'ai récupéré sur un fil anglo-saxon sur ce thème) est défaillant et personne n'avait proposé de solutions (hormis espérer retrouver ces libs intégrées à purebasic, ce qui aurait été très arrangeant, soit dit en passant).

J'espère toujours qu'un pro des problèmes d'accès mémoire puisse deviner l'endroit où se situe la faille (lorsqu'on touche au trackbar).

PS: je lance le programme sous 4.51 sans souci jusqu'à ce que je touche à la trackbar. Il est vrai que dans l'exemple l'image apparaît également aussitôt alors qu'ici, on n'obtient qu'un fond d'image gris. Pourtant, lors du chargement, il semble détecter les bons attributs de cette image.

Re: Open CV est il possible sur purebasic?

Publié : sam. 05/nov./2011 14:27
par totorcalais
un petit y'up

Re: Open CV est il possible sur purebasic?

Publié : mer. 28/déc./2011 9:36
par djes
C'est bizarre, il n'y a que quand on utilise une procédure que ça déconne, si tu mets les appels dans le prog principal, pas de souci. Il doit y avoir un problème avec les fonctions d'opencv : soit elles ne remettent pas les registres en état, soit elles bousillent la pile.
Edit : Ou elles ont besoin de certains registres ou de la pile dans un certain état ; car quand on met toutes les fonctions CV dans la proc ça fonctionne sans souci :/

Re: Open CV est il possible sur purebasic?

Publié : mer. 28/déc./2011 11:28
par djes
J'ai trouvé ! Utilise ImportC au lieu d'Import... Tout bête :)

Re: Open CV est il possible sur purebasic?

Publié : mer. 28/déc./2011 21:43
par Kwai chang caine
DJES a écrit :....Tout bête
J'en profite que tu parles de moi !!!! :mrgreen:
On la trouve ou cette maudite DLL highgui100.dll que le code reclame :oops:
J'ai téléchargé les deux packs OpenCV-2.3.1-win-superpack.exe et OpenCV-2.3.2-GPU-demo-pack-win32.exe et elle est pas dedans :(

Re: Open CV est il possible sur purebasic?

Publié : mer. 28/déc./2011 22:02
par djes

Re: Open CV est il possible sur purebasic?

Publié : mer. 28/déc./2011 22:16
par Kwai chang caine
Merci beaucoup 8)
C'est vraiment la période de noël...par miracle ...j'ai trouvé dans le lien que tu m'as indiqué :mrgreen:

Re: Open CV est il possible sur purebasic?

Publié : ven. 30/déc./2011 12:36
par Mesa
J'ai des erreurs en utilisant le trackbar sous xp alors que le même exemple fourni avec OpenCV_1.0.exe fonctionne.

Une idée ?

Mesa.

Re: Open CV est il possible sur purebasic?

Publié : ven. 30/déc./2011 14:33
par djes
Oui, si je me souviens bien (et si je ne me trompe pas), c'est parce que le C utilise les registres quand il n'y a pas beaucoup de paramètres. PB lui, par défaut, utilise seulement et toujours la pile. Si tu lui spécifies un paramètre, il va "dépiler" ce paramètre, ce qui va causer un problème.

Pour y remédier, PB dispose d'un autre mot-clé qui n'est pas dans la doc : ProcedureC

Tu remplaces donc ta proc par

Code : Tout sélectionner

ProcedureC on_trackbar(h.l)
Tout bête, non ? C'est vrai que ce n'est pas très connu, car peu d'utilisateurs finalement utilisent des bibliothèques externes, en général celles de PB suffisent.

Re: Open CV est il possible sur purebasic?

Publié : ven. 30/déc./2011 18:00
par Mesa
Excellent, ça marche, merci.

J'ai vu qu'il y avait aussi procedureCDLL, je suppose que ça s'utilise dans les même circonstances mais avec les DLL, c'est ça ?

Mesa.

Re: Open CV est il possible sur purebasic?

Publié : ven. 30/déc./2011 19:10
par djes
Mesa a écrit :Excellent, ça marche, merci.

J'ai vu qu'il y avait aussi procedureCDLL, je suppose que ça s'utilise dans les même circonstances mais avec les DLL, c'est ça ?

Mesa.
Oui, voilà ! Tiens-nous au courant de ton avancement :)