2012-08-09 2 views
5

RGB 이미지 변환 알고리즘에 대한 GPU Bayer을 구현하고 싶습니다. OpenCV cvtColor 함수가 어떤 알고리즘을 사용하는지 궁금합니다. 소스를 살펴보면 가변적 인 그라디언트 알고리즘 및 쌍 선형 보간이 될 수있는 기본 알고리즘이 나타나는 것을 볼 수 있습니까? 누구나 나와 함께 공유 할 수있는 경험이 있거나, Bayer 형식에서 BGR 형식으로 변환 할 GPU 코드를 알고 있습니까?OpenCV의 바이어 변환은 어떤 알고리즘을 사용합니까?

소스 코드는 imgproc/src/color.cpp입니다. 나는 그것에 대한 링크를 찾고 있어요. Bayer2RGB_Bayer2RGB_VNG_8u은 내가 바라 보는 기능입니다.

편집 : 여기 소스에 대한 링크가 있습니다.

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

는 이미 쌍 선형 보간 알고리즘을 구현했지만, 내 목적을 위해 아주 잘 작동하지 않습니다. 그림은 좋아 보이지만 HOG 기능을 계산하고 싶습니다. 그런 점에서 좋은 점이 아닌 것 같습니다.

+0

귀하의 이름은 +1입니다. 농담이야, 좋은 질문이야. :) –

답변

8

VNG 버전을 지정하면 기본값은 4way 선형 보간 또는 가변 수의 그라디언트입니다.

자세한 내용은 .. \ modules \ imgproc \ src \ color.cpp를 참조하십시오.

opencv에 간단한 선형 CUDA Bayer-> RGB (A)를 제출했으나 받아 들여지지 않았지만 버그 추적기에 있어야합니다. 코드는 Cuda Bayer/CFA demosaicing example입니다.

다음은 자신의 코드에서 cv :: GPU를 사용하는 howto의 샘플입니다.

/*-------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(); 
} 
+0

고마워요. 지금 그걸 살펴보고 있습니다. – Ian

1

현재, 내 지식, 거기 최고의 debayer는 this paper에 설명 된대로 DFPD (사후 결정에 방향 필터링)입니다. 이 논문은 매우 설명이 잘되어있어 Matlab에서이 접근법을 쉽게 프로토 타이핑 할 수 있습니다. DFPD의 결과를 선형 접근 방식을 기반으로 한 debayer와 비교하는 blog post이 있습니다. 아티팩트, 색상 및 선명도의 향상을 눈으로 확인할 수 있습니다.

1

지금까지 내가 알고있는 한 적응 동질 지향 디모 자이 킹을 사용하고 있습니다. 히라카와 (Hirakawa)와 웹상의 다른 많은 출처에 대한 글에서 설명합니다.

관련 문제