[英]How to use cv::mat in opencl
我有opencl代碼,必須將cv::mat
作為輸入並返回cv::mat
作為輸出。
現在,我將輸入轉換為chars的常規數組,並將其傳遞給opencl並將輸出(即char數組)轉換為cv::mat
。
我嘗試使用cv::mat
原始數據,但是數據中存在一些空白。 因此,我將cv::mat
復制到連續數組,但是我確定可以強制opencl使用具有gaps的數據。
有人可以解釋我如何避免在數組之間cv::mat
復制數據,而直接使用cv::mat
作為輸入和輸出嗎?
也許此答案可以幫助您解決以下問題: 如何在OpenCV(3.0.0)OCL中啟動自定義OpenCL內核?
您也許可以使用OpenCV提供的UMat
類。
cv::Mat mat = ...;
// Upload input mat
cv::UMat input_gpu = mat.getUMat(cv::ACCESS_READ, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
// Create output mat on the GPU
cv::UMat output_gpu(mat_src.size(), CV_32F, cv::ACCESS_WRITE, cv::USAGE_ALLOCATE_DEVICE_MEMORY);
// Download output mat
cv::Mat output = output_gpu.getMat(cv::ACCESS_READ);
據我了解,您應該可以使用cv::ocl::KernelArg::ReadWrite(output_gpu)
將UMat
直接傳遞給內核。 該墊子的內核參數將是__global uchar*
。 不過我不確定,到目前為止,我僅將OpenCV與CUDA結合使用。
數組到Mat :您可以使用“ 指向用戶分配的數據的矩陣頭的構造函數 ”(請參見此答案 ):
Mat(int rows, int cols, int type, void* data, size_t step=AUTO_STEP);
Mat to Ptr :您可以使用data屬性 (來自此答案 )
unsigned char *input = (unsigned char*)(img.data);
for(int j = 0;j < img.rows;j++){
for(int i = 0;i < img.cols;i++){
unsigned char b = input[img.step * j + img.channels() * i ] ;
unsigned char g = input[img.step * j + img.channels() * i + 1];
unsigned char r = input[img.step * j + img.channels() * i + 2];
}
}
當然,您需要使它適應您的數據類型。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.