2017-06-29 2 views
1

J'ai créé un objet de mémoire sur la mémoire partagée avec appel suivant OpenCL-Fonction:Sauvegardez les données de Mat (OpenCV) sur memoryarea situé par un pointeur

cl_mem buffer_img_GAUSS_TEST = clCreateBuffer(context, CL_MEM_ALLOC_HOST_PTR, sizeof(uchar) * size_cols * size_rows,NULL,&status); 

Un appel de cette fonction me donne le pointeur :

uchar *src_ptr; 
src_ptr = (uchar *)clEnqueueMapBuffer(cmdQueue, buffer_img_GAUSS_TEST, CL_TRUE, CL_MAP_READ, 0, sizeof(uchar) * size_cols* size_rows, 0, NULL, NULL, &status); 

maintenant, je veux lire une image suivant appel de la fonction OpenCV:

Mat img= imread("scene.jpg", IMREAD_GRAYSCALE); 

Est-il possible de "dire" que les données de l'image doivent être placées dans la zone de données pointée par src_ptr? La zone située par le buffer_img_GAUSS_TEST a exactement la taille nécessaire pour les données de modèle

En d'autres termes: Je veux remplacer cette partie du code, qui copys les données de l'image à l'adresse pointée par src_pointer.

memcpy (src_ptr, img.data, sizeof(uchar) * img.cols * img.rows); 

Répondre

1

n ° Selon cv::Mat conception, il est impossible de charger des données d'image à l'emplacement de mémoire spécifié.

La bonne façon est d'utiliser memcpy (comme vous le faites). Déplacer la sémantique pour cv :: Mat est indéfini (au moins, je n'ai rien vu de tel et il n'y a pas d'information dans docs). L'autre solution consiste à fournir un pointeur vers les données img (en appelant cv :: Mat :: data()) sans créer de copie d'image, s'il y a une telle capacité dans une autre lib utilisée. Dans ce cas, vous devez implémenter une sorte de propriété partagée et ne pas désallouer cv :: Mat tant que le pointeur sur ses données est utilisé.