C++ OpenCV';拜耳的转换用途是什么?

C++ OpenCV';拜耳的转换用途是什么?,c++,c,opencv,cuda,gpu,C++,C,Opencv,Cuda,Gpu,我想实现一个GPU拜耳到RGB图像转换算法,我想知道OpenCVcvtColor函数使用什么算法。看看源代码,我看到了一个可变数量的梯度算法和一个可能是双线性插值的基本算法?有没有人有这方面的经验可以和我分享,或者可能知道从拜耳格式转换为BGR格式的GPU代码 源代码位于imgproc/src/color.cpp中。我正在寻找它的链接Bayer2RGB_和Bayer2RGB_VNG_8u是我正在研究的函数 编辑:这里有一个到源代码的链接 我已经实现了一个双线性插值算法,但对于我来说,它似乎不是

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

源代码位于
imgproc/src/color.cpp
中。我正在寻找它的链接
Bayer2RGB_
Bayer2RGB_VNG_8u
是我正在研究的函数

编辑:这里有一个到源代码的链接


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

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

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

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

下面是如何在自己的代码中使用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();
}
/*----RG ccd BGRA输出----------------------------*/
__全局函数(常量cv::gpu::DevMem2Db in,cv::gpu::PtrStepb out)
{ 
//注意:每对都需要调用,所以x/y代表单元格的开始,所以右/下对需要x+1,y+1
//R G
//G B
//src
int x=2*((blockIdx.x*blockDim.x)+threadIdx.x);
int y=2*((blockIdx.y*blockDim.y)+threadIdx.y);
乌查尔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);
//R中的“G”
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);
//B中的G
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);
} 
/*从*/
外部“C”无效cuda_bayer(常量cv::gpu::DevMem2Db和img,cv::gpu::PtrStepb out)
{
dim3螺纹(16,16);
dim3网格((img.cols/2)/(threads.x),(img.rows/2)/(threads.y));
拜耳GR2(img,out);
cudaThreadSynchronize();
}

据我所知,目前最好的除障器是DFPD(带后验判决的定向滤波),如中所述。这篇文章很有说明性,你可以很容易地在Matlab上建立这种方法的原型。这里是一个比较DFPD和基于线性方法的debayer结果的例子。您可以明显地看到在人工制品、颜色和清晰度方面的改进

据我所知,目前正在使用自适应同质性定向去马赛克化。平川和许多其他网络资源在一篇论文中解释了这一点。

谢谢,我现在正在看一看。请注意计算“B”时的一个拼写错误:在第
B=(in.ptr(y+1)[x-1]+in.ptr(y+1)[x+2]行中,蓝色单元格位于绿色单元格的左侧和右侧,因此索引应该是
x-1
x+1
(而不是
x+2
)。下面是正确的方法
b=(in.ptr(y+1)[x-1]+in.ptr(y+1)[x+1])/2+1表示您的姓名。开玩笑,问得好。:)