- iOS/Objective-C 元类和类别
- objective-c - -1001 错误,当 NSURLSession 通过 httpproxy 和/etc/hosts
- java - 使用网络类获取 url 地址
- ios - 推送通知中不播放声音
我想实现一个 GPU Bayer 到 RGB 图像转换算法,我想知道 OpenCV cvtColor
函数使用什么算法。查看源代码,我看到什么似乎是可变数量的梯度算法和可能是双线性插值的基本算法?有没有人有这方面的经验可以与我分享,或者可能知道从 Bayer 格式转换为 BGR 格式的 GPU 代码?
源代码在imgproc/src/color.cpp
。我正在寻找它的链接。 Bayer2RGB_
和 Bayer2RGB_VNG_8u
是我正在查看的函数。
编辑:这是来源的链接。
我已经实现了双线性插值算法,但它似乎不太适合我的目的。图片看起来不错,但我想从中计算 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/
我想使用拜耳插值技术,我想对我的算法进行基准测试。为此,我在哪里可以获得原始拜耳测试图像?如果需要,将我移动到正确的论坛。如果您有任何文件/网站链接,请分享! 最佳答案 你可以找到一组现成的图片her
我写了一个 CUDA4 Bayer 去马赛克例程,但它比单线程 CPU 代码慢,在 a16core GTS250 上运行。 Blocksize 是 (16,16) 并且图像变暗是 16 的倍数 - 但
我正在使用 AVCaptureSession 和 AVCapturePhotoOutput 以 kCVPixelFormatType_14Bayer_RGGB 格式从设备相机捕获 RAW 照片数据。
有人知道某处有可用的功能(基于 OpenCV),可以将拜耳图像转换为 HSV 色彩空间吗?还是我必须通过 RGB 执行此步骤? 最佳答案 阅读有关 cvtColor 和 CV_BayerBG2BGR
我正在使用 LI-AR0820 GMSL2 相机,它使用 On-Semi AR0820 传感器以 12 位 RCCC Bayer 格式捕捉图像。我想从摄像头读取实时图像流并将其转换为灰度图像(使用 t
我正在玩 HTML5 中的网络摄像头过滤器。得到一个Atkinson dither非常适合那种老式 Mac 的感觉。 Live | Code 现在我正在尝试为 1989 Gameboy 的感觉制作拜耳
目前我正在尝试将 Bayer RGGB 数据转换为 iplimage。我认为 cvtColor 可能有效,但它需要“mat”而不是 iplimage。 cvtColor(img->imageData,
我目前正在尝试将 8 位 Raw 彩色图像转换为 8 位 RGB。我收到一个 channel 错误,它希望拜耳成为 1 个 channel 。 我正在使用以下代码。 if (convertBayerC
我正在尝试使用 OpenCV 2.3.1 将 12 位 Bayer 图像转换为 8 位 RGB 图像。这看起来应该使用 cvCvtColor 函数相当简单,但是当我使用以下代码调用它时该函数会抛出异常
我是一名优秀的程序员,十分优秀!