Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/opencv/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
EmguCV/OpenCV图像融合和GPU(CUDA)_Opencv_Emgucv - Fatal编程技术网

EmguCV/OpenCV图像融合和GPU(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

我正在使用EmguCV+CUDA对图像进行一些操作(检测)

我的两个图像相互重叠。我用我自己的算法来做这件事。这个想法是:

  • 第一个图像在左边,第二个在右边。这些图像的一部分重叠。
  • 为了做重叠部分,我使用了每个像素的融合。在左边,第一个图像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中,我以前做过,它工作过。