簡體   English   中英

如何在opencl中使用cv :: mat

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM