使用查找表执行Sobel会导致错误

时间:2017-05-17 03:21:36

标签: c++ opencv

我正在尝试使用cv::LUT()将sobel内核应用于Mat。也就是说,我正在尝试为学习目的而做自己的索贝尔。

但是当我使用cv::LUT()时,我收到错误:

  

OpenCV错误:断言失败((lutcn == cn || lutcn == 1)&& _lut.total()== 2   56&& _lut.isContinuous()&& (深度== CV_8U ||深度== CV_8S))在cv :: LUT,fil   e C:\ builds \ master_PackSlave-win32-vc12-shared \ opencv \ modules \ core \ src \ convert.c   pp,第5917行

出了什么问题?

void sobel(const Mat& src, Mat& horizGradient, Mat& vertGradient)
{
    float kernelX[3][3] = {
        { -1, 0, 1 },
        { -2, 0, 2 },
        { -1, 0, 1 }
    };

    float kernelY[3][3] = {
        { -1, -2, -1 },
        {  0,  0,  0 },
        {  1,  2,  1 }
    };

    Mat kernelXMat(3, 3, CV_32FC1, &kernelX);
    Mat kernelYMat(3, 3, CV_32FC1, &kernelY);

    LUT(src, kernelXMat, horizGradient); // error occurs on this line
    /*LUT(src, kernelYMat, vertGradient);*/
}
PS:在OpenCV中构建简单内核(Guassian,Laplacian,Sobel,Harrise)的最有效方法是什么?

也许我不能使用cv::LUT()来执行索贝尔?我应该使用2 for循环?

1 个答案:

答案 0 :(得分:0)

cv::LUT不用于应用过滤器。例如,它用于执行 color mapping

要实现您的目标,您可以使用cv::filter2D功能。

以下是一个展示如何应用过滤器的示例:

int main(int argc, char* argv[])
{
    Mat image = imread("lena.bmp");
    Mat grey;
    cvtColor(image, grey, CV_BGR2GRAY);

    float kernelX[3][3] = {
        { -1, 0, 1 },
        { -2, 0, 2 },
        { -1, 0, 1 }
    };

    float kernelY[3][3] = {
        { -1, -2, -1 },
        { 0,  0,  0 },
        { 1,  2,  1 }
    };

    Mat kernelXMat(3, 3, CV_32FC1, &kernelX);
    Mat kernelYMat(3, 3, CV_32FC1, &kernelY);
    Mat horizGradient, vertGradient, gradient;

    filter2D(grey, horizGradient, -1, kernelXMat, Point(-1, -1));
    filter2D(grey, vertGradient, -1, kernelYMat, Point(-1, -1));

    gradient = max(horizGradient, vertGradient); // combining the two gradients

    imshow("horizGradient", horizGradient);
    imshow("vertGradient", vertGradient);
    imshow("gradient", gradient);

    waitKey(0);
    return 0;
}

结果如下: sobel filter on lena

希望它有所帮助!