2017-06-29 75 views
1

我已經創建了一個存儲器對象上的共享存儲器具有以下的OpenCL函數的調用memoryarea:保存墊(OpenCV的)的數據上位於由指針

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

此功能的呼叫給我的指針:

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); 

現在我想閱讀下列OpenCV的函數調用的圖像:

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

是它有可能「說」圖片的數據應該放在src_ptr指向的數據區域?位於由buffer_img_GAUSS_TEST區域有確切需要的模板

的數據換句話說大小: 我想更換代碼,從圖像copys數據的地址指向src_pointer的這一部分。

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

回答

1

號 根據cv::Mat設計是不可能在指定存儲器位置加載的圖像數據。

正確的方法是使用memcpy(和你一樣)。 cv :: Mat的移動語義是未定義的(至少我沒有見過類似的東西,文檔中沒有任何信息)。 另一種解決方案是在沒有創建圖像副本的情況下,通過調用cv :: Mat :: data()來提供指向img數據的指針,如果在你使用的其他庫中有這樣的能力的話。在這種情況下,您應該實現某種共享所有權,並且不會釋放cv :: Mat,同時指向其數據的指針正在使用中。