gpt4 book ai didi

c++ - OpenCV的Bayer转换使用什么算法?

转载 作者:塔克拉玛干 更新时间:2023-11-03 00:00:08 26 4
gpt4 key购买 nike

我想实现一个 GPU Bayer 到 RGB 图像转换算法,我想知道 OpenCV cvtColor 函数使用什么算法。查看源代码,我看到什么似乎是可变数量的梯度算法和可能是双线性插值的基本算法?有没有人有这方面的经验可以与我分享,或者可能知道从 Bayer 格式转换为 BGR 格式的 GPU 代码?

源代码在imgproc/src/color.cpp。我正在寻找它的链接。 Bayer2RGB_Bayer2RGB_VNG_8u 是我正在查看的函数。

编辑:这是来源的链接。

http://code.opencv.org/projects/opencv/repository/revisions/master/entry/modules/imgproc/src/color.cpp

我已经实现了双线性插值算法,但它似乎不太适合我的目的。图片看起来不错,但我想从中计算 HOG 特征,在这方面它似乎不太合适。

最佳答案

如果指定 VNG 版本,则默认为 4way 线性插值或可变数量的渐变。

有关详细信息,请参阅 ..\modules\imgproc\src\color.cpp。

我向 opencv 提交了一个简单的线性 CUDA Bayer->RGB(A),如果它被接受还没有跟进,但它应该在错误跟踪器中。它基于 Cuda Bayer/CFA demosaicing example 中的代码.

这是如何在您自己的代码中使用 cv::GPU 的示例。

/*-------RG ccd  BGRA output ----------------------------*/
__global__ void bayerRG(const cv::gpu::DevMem2Db in, cv::gpu::PtrStepb out)
{
// Note called for every pair, so x/y are for start of cell so need x+1,Y+1 for right/bottom pair
// R G
// G B

// src
int x = 2 * ((blockIdx.x*blockDim.x) + threadIdx.x);
int y = 2 * ((blockIdx.y*blockDim.y) + threadIdx.y);

uchar r,g,b;

// 'R'
r = (in.ptr(y)[x]);
g = (in.ptr(y)[x-1]+in.ptr(y)[x+1]+(in.ptr(y-1)[x]+in.ptr(y+1)[x]))/4;
b = (in.ptr(y-1)[x-1]+in.ptr(y-1)[x+1]+(in.ptr(y+1)[x-1]+in.ptr(y+1)[x+1]))/4;
((uchar4*)out.ptr(y))[x] = make_uchar4( b,g,r,0xff);

// 'G' in R
r = (in.ptr(y)[x]+in.ptr(y)[x+2])/2;
g = (in.ptr(y)[x+1]);
b = (in.ptr(y-1)[x+1]+in.ptr(y+1)[x+1])/2;
((uchar4*)out.ptr(y))[x+1] = make_uchar4( b,g,r,0xff);

// 'G' in B
r = (in.ptr(y)[x]+in.ptr(y+2)[x])/2;
g = (in.ptr(y+1)[x]);
b = (in.ptr(y+1)[x-1]+in.ptr(y+1)[x+2])/2;
((uchar4*)out.ptr(y+1))[x] = make_uchar4( b,g,r,0xff);

// 'B'
r = (in.ptr(y)[x]+in.ptr(y)[x+2]+in.ptr(y+2)[x]+in.ptr(y+2)[x+2])/4;;
g = (in.ptr(y+1)[x]+in.ptr(y+1)[x+2]+in.ptr(y)[x+1]+in.ptr(y+2)[x+1])/4;
b = (in.ptr(y+1)[x+1]);
((uchar4*)out.ptr(y+1))[x+1] = make_uchar4( b,g,r,0xff);
}


/* called from */
extern "C" void cuda_bayer(const cv::gpu::DevMem2Db& img, cv::gpu::PtrStepb out)
{
dim3 threads(16,16);
dim3 grid((img.cols/2)/(threads.x), (img.rows/2)/(threads.y));

bayerGR2<<<grid,threads>>>(img,out);
cudaThreadSynchronize();
}

关于c++ - OpenCV的Bayer转换使用什么算法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11890955/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com