- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在研究光线追踪器。我想通过使用 GPU 将每个像素的数据保存在 OpenCV Mat
中来优化我的代码。
现在,我将像素值保存在缓冲区 fb
中,它是一个包含三个值 (RGB) 的 vector :
__global__ void render(vec3 *fb, int max_x, int max_y, Camera **cam, Triangle *data, size_t n, )
{
int i = threadIdx.x + blockIdx.x * blockDim.x;
int j = threadIdx.y + blockIdx.y * blockDim.y;
if ((i >= max_x) || (j >= max_y)) return;
int pixel_index = j * max_x + i;
float u = float(i) / float(max_x);
float v = float(j) / float(max_y);
Ray r = (*cam)->get_ray(u,v);
fb[pixel_index] = color(r, data,n);
}
然后我将数据保存在 CPU 上的 Mat 中:
for (int j = ny - 1; j >= 0; j--)
{
for (int i = 0; i < nx; i++)
{
size_t pixel_index = j * nx + i;
int ir = int(255.99*fb[pixel_index].r());
int ig = int(255.99*fb[pixel_index].g());
int ib = int(255.99*fb[pixel_index].b());
output.at<Vec3b>(j, i)[0] = (uchar)ib;
output.at<Vec3b>(j, i)[1] = (uchar)ig;
output.at<Vec3b>(j, i)[2] = (uchar)ir;
//std::cout << ir << " " << ig << " " << ib << "\n";
}
}
但是当我有一个大像素阵列时,这是一个非常缓慢的过程。这就是为什么我想使用 OpenCV GpuMat
并将数据直接保存在 GPU 上的原因。
问题是我真的找不到一个例子来说明如何在 GPU Mat 的每个 channel 中保存数据。这是一种简单的方法吗,类似于在 CPU 上保存数据?
最佳答案
参见 documentation .上面写着
no functions that return references to their data (because references on GPU are not valid for CPU)
访问数据的唯一方法是通过data
函数。但是指针只能在 (cuda) 内核代码中取消引用。而且没有据我所知,at
功能。因此,您必须计算数据的偏移量。
关于c++ - 访问 OpenCV GpuMat channel ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56732885/
我的 CUDA 设备内存不足。我已经检测到原因 - 在我的一些成员函数中,我返回了一个 GpuMat 构建在我自己分配的数据上。这里的问题是 - 我如何释放这个内存? class Test { G
我想将图像上传到以下变量 gpu::GpuMat test;。首先将输入图像 (src) 转换为灰度图像 cvtColor( src, src_gray, COLOR_BGR2GRAY ); 然后上传
我正在尝试使用 OpenCV GpuMat,但出现断言错误,我的代码如下 #include "opencv2/opencv.hpp" #include "opencv2/imgproc/imgproc
下面是一个简单的程序,当我尝试将图像上传到 GPU 时,我的线程似乎停止了,其中 upload() 不返回。设备信息调用一切正常,并返回适当的值。 是否可以在线程中上传到 GPU? 如果是这样,我在下
我目前正在 Nvidia Jetson TX1/2 上进行开发。 我的代码中最慢的部分是(为便于阅读更改了变量名): .... cv::Mat A, B; GpuMat_A.download(A, C
我需要将视频流数据转换为 cv::gpumat。最初我尝试复制到 cv::Mat,然后使用上传将其加载到 gpumat。这个过程非常慢(640*480 帧需要 20 毫秒)。 我需要一种直接从 ope
这个问题在这里已经有了答案: program fails for array 30 x 30 (2 个答案) 关闭 5 年前。 我正在尝试使用以下代码迭代 cv::cuda::GpuMat: __g
opencv document about gpu::orb 我想用 gpu::orb 获取图像的关键点,关键点的类型是 gpuMat。然后我尝试访问 gpuMat 的数据作为文档。 我尝试了下面的代
我正在将opencv-python操作转换为c++ opencv::cuda,以获得更好的性能,但是我对CV_8UC1到CV_32FC1的转换存在问题。 我要转换的Python代码: img_gray
reduce(const GpuMat& mtx, GpuMat& vec, int dim, int reduceOp, int dtype=-1, Stream& stream=Stream::N
我正在使用 opencv::cuda 进行一些图像处理,所以我最终得到的是一个 cv::cuda::GpuMat。我现在想使用 ffmpeg 对其进行编码(这样我就可以选择编码器是否进行硬件加速)。现
我正在研究光线追踪器。我想通过使用 GPU 将每个像素的数据保存在 OpenCV Mat 中来优化我的代码。 现在,我将像素值保存在缓冲区 fb 中,它是一个包含三个值 (RGB) 的 vector
当我编译这个例子时: #include #include "opencv2/opencv.hpp" #include "opencv2/gpu/gpu.hpp" int main (int argc
我正在尝试使用 GpuMat 数据编写自定义内核来查找图像像素的反余弦。当 GPU 有 CV_8UC1 数据但字符不能用于计算反余弦时,我可以在上传数据时上传、下载和更改值。但是,当我尝试将我的 GP
我在尝试从 cv::Mat 转换为 gpu::Mat 时遇到问题。我正在使用 VS2012 Win7 x64。 这是代码: #include "opencv2/imgproc/imgproc.hpp"
我正在尝试在 C++ 中运行模型推理。 我使用 torch.jit.trace 在 Python 中成功追踪了模型。 我可以使用 torch::jit::load() 在 C++ 中加载模型。 我能够
我的系统上有多个 GPU,我想找到一种简单的方法来确定 cv::cuda::GpuMat 分配在哪个 GPU 上。例如,忽略错误: int numDevices = cv::cuda::getCuda
如何通过尽可能少的复制操作将 cv::gpu::GpuMat 行传输到 std::vector? 我能想到的最快的方法是: GpuMat fooGpu(numRows, numCols, CV_32F
我在 Win 8.1 64 位机器上使用 OpenCV 3.0 和 VS2012 C++/CLI。 我想知道创建指向 Gpumat 的 C++ 指针的正确方法是什么。 目前,我定义了一些指针,例如:
我是 CUDA 和 C 的新手,我可以在以下方面使用一些帮助:我想将 GpuMats 的 C 数组传递给 CUDA 内核: 这是我的内核代码: __global__ void disparit
我是一名优秀的程序员,十分优秀!