IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

OpenCV Discussion :

[CUDA] Détection de cercles par un détecteur de Hough


Sujet :

OpenCV

  1. #1
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut [CUDA] Détection de cercles par un détecteur de Hough
    Bonjour,

    Je développe depuis quelques temps avec OpenCV en C++, et je m’attelle maintenant à optimiser un programme pour le faire fonctionner sur GPU nVidia avec CUDA.

    J'ai donc actuellement un programme qui recherche des cercles dans une image, avec la fonction cv::HoughCircles(), à laquelle j'envoie mon image (type cv::Mat en RAM locale), et qui me renvoie un vecteur de cercles (type vector<cv::Vect3f> en RAM locale).
    Je souhaite transformer cette fonction avec cv::cuda::HoughCirclesDetector() et sa fonction detect(), qui va se servir de mon image précédemment envoyée au GPU par la fonction upload() (et stockée en cv::cuda::GpuMat), et qui va me stocker le résultat dans un cv::cuda::GpuMat (sur GPU). Jusque là, tout se passe bien.

    Mon problème est là: comment récupérer ce résultat, pour le remettre en vector<Vect3f>?

    Voici mon ancien code (version CPU):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    cv::VideoCapture capture;
    cv::Mat image_src;
    vector<cv::Vect3f> circles;
    ...
    capture >> image_src;
    cv::HoughCircles(image_src, circles, CV_HOUGH_GRADIENT, ....);
    Voici mon nouveau code (version GPU):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    cv::VideoCapture capture;
    cv::Mat image_src;
    vector<cv::Vect3f> circles;
    cv::cuda::GpuMat image_src_gpu;
    ...
    capture >> image_src;
    // mise au bon format de l'image et envoi au GPU
    cv::Mat image_tmp_8uc4;
    cv::cvtColor(image_src, image_tmp_8uc4, CV_BGR2BGRA);
    image_src_gpu.upload(image_tmp_8uc4);
    // traitement Hough
    cv::cuda::GpuMat gpuCircles;
    cv::Ptr<cv::cuda::HoughCirclesDetector> hough_detector = cv::cuda::createHoughCirclesDetector(....);
    hough_detector->detect(image_src_gpu, gpuCircles);
    // recuperation du resultat
    gpuCircles.download(circles);
    La dernière fonction (download) cause une erreur à l'exécution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    OpenCV Error: Assertion failed (mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0)) in create, file /home/benz/Programmation/opencv/modules/core/src/matrix.cpp, line 2313
    terminate called after throwing an instance of 'cv::Exception'
    what():  /home/benz/Programmation/opencv/modules/core/src/matrix.cpp:2313: error: (-215) mtype == type0 || (CV_MAT_CN(mtype) == CV_MAT_CN(type0) && ((1 << type0) & fixedDepthMask) != 0) in function create
    Je pense que c'est la conversion de GpuMat (qui contient en fait un vecteur de cercles) en vector<cv::Vect3f>, qui n'est pas acceptée.
    Le type de gpuCircles doit être faux...
    J'ai vu la possibilité de créer des vecteurs dans le GPU par l'intermédiaire de thrust/device_vector, mais la compilation ne m'autorise pas à l'utiliser (type attendu: cv::OutputArray).

    Je ne trouve aucun exemple de l'utilisation de HoughCirclesDetector sur le net...

    Quelqu'un peut-il me venir en aide SVP? Merci!

    Voici ma config:

    OS:
    - Ubuntu 14.04 LTS
    - Kernel 3.19.0-26-generic
    Environnement:
    - CUDA 7.0.27
    - OpenCV 3.0.0
    Matériel:
    - Intel i7-3610QM @2.3GHzx8
    - GeForce GT650M/PCIe/SSE2
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

  2. #2
    Membre régulier
    Profil pro
    Inscrit en
    Décembre 2007
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2007
    Messages : 560
    Points : 71
    Points
    71
    Par défaut
    Peut-etre la réponse dans ce lien:

    http://stackoverflow.com/questions/2...rking-properly

  3. #3
    Membre habitué
    Avatar de dj_benz
    Homme Profil pro
    Inscrit en
    Octobre 2002
    Messages
    178
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Octobre 2002
    Messages : 178
    Points : 135
    Points
    135
    Par défaut
    Merci pour ce lien. Il s'agit de HoughLines, mais effectivement, le mode de récupération du résultat est applicable à HoughCircles.

    Cette solution fonctionne correctement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    cv::VideoCapture capture;
    cv::Mat image_src;
    vector<cv::Vect3f> circles;
    cv::cuda::GpuMat image_src_gpu;
    ...
    capture >> image_src;
    // mise au bon format de l'image et envoi au GPU
    cv::Mat image_tmp_8uc4;
    cv::cvtColor(image_src, image_tmp_8uc4, CV_BGR2BGRA);
    image_src_gpu.upload(image_tmp_8uc4);
    // traitement Hough
    cv::cuda::GpuMat gpuCircles;
    cv::Ptr<cv::cuda::HoughCirclesDetector> hough_detector = cv::cuda::createHoughCirclesDetector(....);
    hough_detector->detect(image_src_gpu, gpuCircles);
    // preparation du vecteur retour et d'une matrice temporaire
    circles.resize(gpuCircles.cols);
    cv::Mat tmpMat(1, gpuCircles.cols, CV_32FC3, &circles[0]);
    // recuperation du resultat
    gpuCircles.download(tmpMat);
    Merci pour le lien. Mon problème est résolu.
    Benz
    ______________________________________________________________
    Software is like sex, it's better when it's free - Linus Torvalds

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Détection de droite par la méthode de Hough
    Par suzawa dans le forum Images
    Réponses: 2
    Dernier message: 14/10/2011, 17h48
  2. Détection de cercle par la transformée de hough
    Par roulian46 dans le forum Interfaces Graphiques en Java
    Réponses: 0
    Dernier message: 23/12/2010, 11h20
  3. Détection de contour par la transformée de Hough
    Par Antho78 dans le forum Images
    Réponses: 1
    Dernier message: 18/11/2008, 11h36
  4. [Cercles] Remplir un cercle par d'autre cercles
    Par Yogui dans le forum Algorithmes et structures de données
    Réponses: 10
    Dernier message: 08/06/2008, 00h41
  5. [Disque Dur]Problème de détection de DD par le bios
    Par bnadem35 dans le forum Composants
    Réponses: 6
    Dernier message: 24/09/2006, 21h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo