我想知道如何修改 gpu::GpuMat
。事实上,我想知道是否可以像 cv::Mat
一样使用 gpu::GpuMat
。
我想做这样的事情:
cv::namedWindow("Result");
cv::Mat src_host = cv::imread("lena.jpg", CV_LOAD_IMAGE_GRAYSCALE);
cv::gpu::GpuMat dst, src;
src.upload(src_host);
for (unsigned int y = 0; y < src.rows; y++){
for (unsigned int x = 0; x < src.cols; x++){
src.at<uchar>(y,x) = 0;
}
}
cv::Mat result_host;
dst.download(result_host);
cv::imshow("Result", result_host);
cv::waitKey();
}
catch(const cv::Exception& ex)
{
std::cout << "Error: " << ex.what() << std::endl;
}
return 0;
这似乎是不可能的。有人知道替代方案吗?
每次我想制作一些东西时,我是否必须将我的 gpu::GpuMat
下载到 cv::Mat
?
提前致谢
编辑:我可能会使用 gpu::PtrStepSz
(必须测试...)
最佳答案
GpuMat
在 GPU 内存中分配。您不能从 CPU 代码修改它。你可以
- 将所有矩阵像素设置为相同的值(
setTo
方法)。 - 使用
cv::Mat
在CPU上填充数据,然后上传到GpuMat
。 - 实现您自己的 CUDA 内核并在其中填充
GpuMat
。
关于c++ - 在 OpenCV C++ 中使用 gpu::GpuMat,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17679470/