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):
Voici mon nouveau code (version GPU):
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, ....);
La dernière fonction (download) cause une erreur à l'exécution:
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);
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.
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
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
Partager