C++ 彩色图像的边缘检测算法

C++ 彩色图像的边缘检测算法,c++,visual-studio,opencv,image-processing,opencv-contour,C++,Visual Studio,Opencv,Image Processing,Opencv Contour,这就是我如何在灰度图像上使用Sobel内核的方法。但是,我实际上不知道如何为彩色图像修改Sobel内核 void Soble() { Mat img; int w = 3; int k = w / 2; char fname[MAX_PATH]; openFileDlg(fname); img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE); gaussianFiltering(img); Mat destinationImg = img.clone();

这就是我如何在灰度图像上使用Sobel内核的方法。但是,我实际上不知道如何为彩色图像修改Sobel内核

void Soble()
 {
Mat img;
int w = 3;
int k = w / 2;

char fname[MAX_PATH];
openFileDlg(fname);
img = imread(fname, CV_LOAD_IMAGE_GRAYSCALE);
gaussianFiltering(img);
Mat destinationImg = img.clone();
float sobelY[3][3] = { 1, 2, 1, 0, 0, 0, -1, -2, -1 };
float sobelX[3][3] = { -1, 0, 1, -2, 0, 2, -1, 0, 1 };  
for (int i = k; i < img.rows - k; i++)
{
    for (int j = k; j < img.cols - k; j++)
    {
        float Gx = 0, Gy = 0;

        for (int l = 0; l < w; l++)
        {
            for (int p = 0; p < w; p++)
            {
                Gx += img.at<uchar>(i + l - k, j + p - k)*sobelX[l][p];
                Gy += img.at<uchar>(i + l - k, j + p - k)*sobelY[l][p];
            }
        }
        destinationImg.at<uchar>(i, j) = sqrt(Gx*Gx + Gy * Gy) / (4 * sqrt(2));

    }
}
imshow("Intermediar",destinationImg);
imshow("Initial", img);
waitKey(0);

  }
void Soble()
{
Mat-img;
int w=3;
int k=w/2;
char fname[最大路径];
openFileDlg(fname);
img=imread(fname、CV\u LOAD\u IMAGE\u GRAYSCALE);
高斯滤波;
Mat destinationImg=img.clone();
float sobelY[3][3]={1,2,1,0,0,0,-1,-2,-1};
float-sobelX[3][3]={-1,0,1,-2,0,2,-1,0,1};
for(int i=k;i
我曾想过使用每个RGB香奈儿,但它不起作用,甚至会出现一些错误

        float GxR = 0, GyR = 0;
        float GxG = 0, GyG = 0;
        float GxB = 0, GyB = 0;

        for (int l = 0; l < w; l++)
        {
            for (int p = 0; p < w; p++)
            {
                GxR += img.at<Vec3b>[0](i + l - k, j + p - k)*sobelX[l][p];
                GxG += img.at<Vec3b>[1](i + l - k, j + p - k)*sobelX[l][p];
                GxB += img.at<Vec3b>[2](i + l - k, j + p - k)*sobelX[l][p];
                GyR += img.at<Vec3b>[0](i + l - k, j + p - k)*sobelY[l][p];
                GyG += img.at<Vec3b>[1](i + l - k, j + p - k)*sobelY[l][p];
                GyB += img.at<Vec3b>[2](i + l - k, j + p - k)*sobelY[l][p];
            }
        }
        destinationImg.at<Vec3b>[0](i, j) = sqrt(GxR*GxR + GyR * GyR) / (4 * sqrt(2));
        destinationImg.at<Vec3b>[1](i, j) = sqrt(GxG*GxG + GyB * GyB) / (4 * sqrt(2));
        destinationImg.at<Vec3b>[2](i, j) = sqrt(GxG*GxG + GyG * GyG) / (4 * sqrt(2));
float GxR=0,GyR=0;
浮点数GxG=0,GyG=0;
浮点数GxB=0,GyB=0;
对于(int l=0;l

您能解释一下如何重写此代码吗?

您访问图像数据的方式不对

destinationImg.at<Vec3b>[0](i, j)
destinationImg.at[0](i,j)
destinationImg是Vec3b型垫。这意味着它是一个三维向量的二维数组

您的[]接线员在错误的位置

下标错误消息告诉您正在对既不是指针也不是数组的对象使用该运算符,这是不可能的。 您会得到另一条错误消息,因为在(i,j)的预期位置有一个操作符

首先你必须得到这些向量中的一个,然后你可以得到它的元素

destinationImg.at(i,j)
将给出i,j处的向量

destinationImg.at(i,j)[0]
将给出该向量的第一个元素

OpenCV文档中的示例:

Vec3b intensity = img.at<Vec3b>(y, x);
uchar blue = intensity.val[0];
uchar green = intensity.val[1];
uchar red = intensity.val[2];
Vec3b强度=img.at(y,x);
乌查尔蓝=强度.val[0];
uchar绿色=强度.val[1];
乌查尔红=强度.val[2];

什么是“一些错误”?这就像去看医生,只是说你感觉不舒服;使用“&”创建指向memberErrorC2109 subscript requires array或指针类型的指针这里有一个关于OpenGL的教程,重点介绍帧缓冲区:在这个教程中有一个
内核
效果,它是在
着色器中完成的
看看这个,因为它可能会帮助您。本教程即将结束。其中一个
内核
是关于
边缘检测的。通读一遍。为了将来查看您的代码的人(可能包括您),请不要在名为
Soble
的函数中实现Sobel运算符。