Opencv 是否有函数计算两幅图像中所有像素的大小?

Opencv 是否有函数计算两幅图像中所有像素的大小?,opencv,emgucv,Opencv,Emgucv,我有关于索贝尔手术的密码 Image<Gray, double> test_x= new Image<Gray, double>(img_gray.Size); Image<Gray, double> test_y = new Image<Gray, double>(img_gray.Size); Image<Gray, byte> final = new Image<Gray, b

我有关于索贝尔手术的密码

        Image<Gray, double> test_x= new Image<Gray, double>(img_gray.Size);
        Image<Gray, double> test_y = new Image<Gray, double>(img_gray.Size);
        Image<Gray, byte> final = new Image<Gray, byte>(img_gray.Size);
        CvInvoke.Sobel(img_gray, test_x, DepthType.Cv64F,1,0);
        CvInvoke.Sobel(img_gray, test_y, DepthType.Cv64F, 0, 1);
        for (int x = 0; x < img_gray.Cols; x++)
        {
            for (int y = 0; y < img_gray.Rows; y++)
            {
                double mag = Math.Pow(test_x[y, x].Intensity, 2) + Math.Pow(test_y[y, x].Intensity, 2);
                mag = Math.Sqrt(mag);
                if (mag > 125)
                {
                    final[y, x] = new Gray(255);
                }
                else
                {
                    final[y, x] = new Gray(0);
                }
            }
        }
        imageBox2.Image = final;
Image test\u x=新图像(img\u gray.Size);
图像测试y=新图像(图像灰度大小);
最终图像=新图像(图像灰度大小);
索贝尔(img_gray,test_x,DepthType.Cv64F,1,0);
CvInvoke.Sobel(img_gray,test_y,DepthType.Cv64F,0,1);
对于(int x=0;x125)
{
最终[y,x]=新灰色(255);
}
其他的
{
最终[y,x]=新灰色(0);
}
}
}
imageBox2.图像=最终;
这段代码需要很长时间才能显示结果

opencv中是否有任何函数可以计算所有像素的大小而不访问所有像素 按for循环

谢谢:)

是的,“cv::magnitude”:

计算二维向量的大小。 C++:无效大小(输入阵列x、输入阵列y、输出阵列大小) Python:cv2.震级(x,y[,震级])→ 量级 参数: x–向量的x坐标的浮点数组。 y–向量的y坐标的浮点数组;它的大小必须与x相同。 幅值–与x大小和类型相同的输出数组。 函数幅值计算由x和y阵列的相应元素形成的2D向量的幅值:

检查此链接:

是,“cv::magnitude”:

计算二维向量的大小。 C++:无效大小(输入阵列x、输入阵列y、输出阵列大小) Python:cv2.震级(x,y[,震级])→ 量级 参数: x–向量的x坐标的浮点数组。 y–向量的y坐标的浮点数组;它的大小必须与x相同。 幅值–与x大小和类型相同的输出数组。 函数幅值计算由x和y阵列的相应元素形成的2D向量的幅值:


检查此链接:

EmguCv具有此功能。多快我会让你决定

Image<Gray, double> test_x= new Image<Gray, double>(img_gray.Size);
Image<Gray, double> test_y = new Image<Gray, double>(img_gray.Size);
CudaImage<Gray, double> final = new CudaImage<Gray, double>(img_gray.Size);
CvInvoke.Sobel(img_gray, test_x, DepthType.Cv64F,1,0);
CvInvoke.Sobel(img_gray, test_y, DepthType.Cv64F, 0, 1);
CudaImage<Gray, double> xCuda = new CudaImage<Gray, double>(test_x);
CudaImage<Gray, double> yCuda = new CudaImage<Gray, double>(test_y);
CudaInvoke.Magnitude(xCuda, yCuda, final);
Image test\u x=新图像(img\u gray.Size);
图像测试y=新图像(图像灰度大小);
CudaImage final=新CudaImage(图像灰度大小);
索贝尔(img_gray,test_x,DepthType.Cv64F,1,0);
CvInvoke.Sobel(img_gray,test_y,DepthType.Cv64F,0,1);
CudaImage xCuda=新CudaImage(测试x);
CudaImage yCuda=新CudaImage(测试y);
CudaInvoke.震级(xCuda,yCuda,最终);

EmguCv有一个功能。多快我会让你决定

Image<Gray, double> test_x= new Image<Gray, double>(img_gray.Size);
Image<Gray, double> test_y = new Image<Gray, double>(img_gray.Size);
CudaImage<Gray, double> final = new CudaImage<Gray, double>(img_gray.Size);
CvInvoke.Sobel(img_gray, test_x, DepthType.Cv64F,1,0);
CvInvoke.Sobel(img_gray, test_y, DepthType.Cv64F, 0, 1);
CudaImage<Gray, double> xCuda = new CudaImage<Gray, double>(test_x);
CudaImage<Gray, double> yCuda = new CudaImage<Gray, double>(test_y);
CudaInvoke.Magnitude(xCuda, yCuda, final);
Image test\u x=新图像(img\u gray.Size);
图像测试y=新图像(图像灰度大小);
CudaImage final=新CudaImage(图像灰度大小);
索贝尔(img_gray,test_x,DepthType.Cv64F,1,0);
CvInvoke.Sobel(img_gray,test_y,DepthType.Cv64F,0,1);
CudaImage xCuda=新CudaImage(测试x);
CudaImage yCuda=新CudaImage(测试y);
CudaInvoke.震级(xCuda,yCuda,最终);

它告诉我cvinvokeIt中没有大小的定义,它似乎只是在
CV.Cuda
名称空间中。因此使用
CudaInvoke
调用是的,我知道了,但当我运行它时,会出现错误emgu cv无法在dll cvextreme中找到入口点名称这是什么?问题可能是您安装了多个EmguCv版本。默认情况下,EmguCv是使用CUDA支持构建的,因此,如果您有支持CUDA的nVidia图形,那么运行CUDA功能应该不会出现问题。我还意识到,必须是一个
CudaImage
,现在它被传递给cuda函数(答案更新),如果您使用nuget安装了EmguCv,那么应该没有问题。您的图形卡可以(并且根据您的需要)支持cuda。这意味着它可以在其上执行cuda“功能”。无论您是否有支持CUDA的图形卡都可以检查,它告诉我cvinvokeIt中没有大小的定义,它似乎只在
CV.CUDA
名称空间中。因此使用
CudaInvoke
调用是的,我知道了,但当我运行它时,会出现错误emgu cv无法在dll cvextreme中找到入口点名称这是什么?问题可能是您安装了多个EmguCv版本。默认情况下,EmguCv是使用CUDA支持构建的,因此,如果您有支持CUDA的nVidia图形,那么运行CUDA功能应该不会出现问题。我还意识到,必须是一个
CudaImage
,现在它被传递给cuda函数(答案更新),如果您使用nuget安装了EmguCv,那么应该没有问题。您的图形卡可以(并且根据您的需要)支持cuda。这意味着它可以在其上执行cuda“功能”。您是否拥有支持CUDA的图形卡可以检查