[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:
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:
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:
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