EmguCV/OpenCV图像融合和GPU(CUDA)
我正在使用EmguCV+CUDA对图像进行一些操作(检测) 我的两个图像相互重叠。我用我自己的算法来做这件事。这个想法是:EmguCV/OpenCV图像融合和GPU(CUDA),opencv,emgucv,Opencv,Emgucv,我正在使用EmguCV+CUDA对图像进行一些操作(检测) 我的两个图像相互重叠。我用我自己的算法来做这件事。这个想法是: 第一个图像在左边,第二个在右边。这些图像的一部分重叠。 为了做重叠部分,我使用了每个像素的融合。在左边,第一个图像1更重要(alpha1=1,alpha2=0),在最右边,我们有相反的图像(alpha1=0,alpha2=1),在中间的alpha1=0.5,alpha2=0.5。结果是: 我的源代码: int start = (int)Math.Min(Math.M
- 第一个图像在左边,第二个在右边。这些图像的一部分重叠。
- 为了做重叠部分,我使用了每个像素的融合。在左边,第一个图像1更重要(alpha1=1,alpha2=0),在最右边,我们有相反的图像(alpha1=0,alpha2=1),在中间的alpha1=0.5,alpha2=0.5。结果是:
int start = (int)Math.Min(Math.Min(corners[0].X, corners[1].X), Math.Min(corners[2].X, corners[3].X));
Double processWidth = image1.Width - start; // The overlap size
for (int i = 0; i < image1.Width; i++)
{
for (int j = 0; j < image1.Height; j++)
{
double alphaImg = 1;
double alphaDest = 0;
if (i >= start)
{
alphaImg = (processWidth - (i - start)) / processWidth;
alphaDest = 1 - alphaImg;
}
Gray colorImg = image1[j, i];
byte colorDest = imageFinal.GetValue(j, i);
double b = (1 - alphaDest) * alphaImg + alphaDest;
int colorNew = (int)(((1 - alphaDest) * alphaImg * colorImg.Intensity + alphaDest * colorDest) / b);
if (colorDest == 0)
colorNew = (int)colorImg.Intensity;
imageFinal.SetValue(j, i, (byte)colorNew);
}
}
int start=(int)Math.Min(Math.Min(角点[0].X,角点[1].X),Math.Min(角点[2].X,角点[3].X));
Double processWidth=image1.Width-start;//重叠大小
对于(int i=0;i=开始)
{
alphaImg=(processWidth-(i-start))/processWidth;
alphaDest=1-alphaImg;
}
灰色img=图像1[j,i];
byte colorDest=imageFinal.GetValue(j,i);
双b=(1-字母dest)*字母img+字母dest;
int colorNew=(int)((1-字母dest)*字母img*颜色img.强度+字母dest*颜色dest)/b);
如果(colorDest==0)
colorNew=(int)colorImg.Intensity;
设置值(j,i,(字节)colorNew);
}
}
代码正在运行,但速度很慢。你知道有没有更好的方法来使用OpenCV/CUDA函数
该算法的源文章:该算法可以翻译成Cuda的比例接近1:1。初始化CUDA。Alloc内存。将内存复制到设备。调用cuda内核(“内核”是cuda函数)。复制回结果。清理它可以很好地与两个for循环并行。具体的问题是什么?你知道CUDA C++吗?你能使用它吗?调用cudaFunction(params);内部cudaFunction用法:int tid=blockIdx.x*blockDim.x+threadIdx.x;int i=tid%宽度;int j=三次仪表板/宽度;用索引[3*(宽度*j+i)+0]直接访问设备内存(例如,每像素3字节的无符号字符)替换GetValue和SetValue;你的+1和+2也是一样。目前,我还有很多问题要解决,但我把这些优化记在脑子里。我不知道如何从C#直接使用Cuda。我将要做一些培训。JoaNaTeNeReliNKONE不容易,你可以使用我不推荐的FixZER,或者用C++编写一个DLL,使用CUDA,然后把它用在C语言中,我以前做过,并且它工作过。初始化CUDA。Alloc内存。将内存复制到设备。调用cuda内核(“内核”是cuda函数)。复制回结果。清理它可以很好地与两个for循环并行。具体的问题是什么?你知道CUDA C++吗?你能使用它吗?调用cudaFunction(params);内部cudaFunction用法:int tid=blockIdx.x*blockDim.x+threadIdx.x;int i=tid%宽度;int j=三次仪表板/宽度;用索引[3*(宽度*j+i)+0]直接访问设备内存(例如,每像素3字节的无符号字符)替换GetValue和SetValue;你的+1和+2也是一样。目前,我还有很多问题要解决,但我把这些优化记在脑子里。我不知道如何从C#直接使用Cuda。我将要做一些培训。JoaNaTeNeReliNKONE不容易,你可以使用我不推荐的杂交器,或者在C++中使用DUL使用CUDA,然后把它用在C中,我以前做过,它工作过。