我正在研究一种在GPU上完成许多计算的算法。我主要使用oclMat结构,并试图避免从CPU复制到GPU,反之亦然,但我找不到一个简单的方法:
例如:
cv::ocl::oclMat M1 =...
// DO STUFF WITH M1
cv::ocl::oclMat logicalM1 = M1>1.55; // compare directly to a single value
cv::ocl::oclMat logicalM2 = ... ; // i.e. I want a 100x100 CV_32FC1 matrix with all elements set to be equal to 1.234567
通过阅读文档,似乎使用cv :: ocl :: compare仅适用于具有相同维度和类型的两个矩阵,因此可能我的第一个请求是不可行的。另一方面,我不知道如何直接在ocl中初始化特定矩阵(使用cv :: Mat我知道它是如何完成的)。
我假设存在一个简单的解决方法,但尚未找到一个......谢谢!
答案 0 :(得分:1)
你是对的。看起来cv::ocl::compare
只支持输入两个cv::oclMat
。
但您可以创建填充特定值的oclMat
,如下所示:
cv::ocl::oclMat logicalM2(M1.size(), M1.type);
logicalM2.setTo(cv::Scalar(1.234567));
cv::ocl::oclMat logicalM1;
cv::ocl::compare(M1, logicalM2, logicalM1, cv::CMP_GT);
P.S。另外,我建议您尝试使用Transparent-API的新OpenCV 3.0,这样可以更轻松地使用OpenCL在GPU上进行处理。