【问题标题】:OpenCV error using inverse使用逆向的 OpenCV 错误
【发布时间】:2017-01-05 06:14:53
【问题描述】:

我正在使用 Visual C++ 实现 SIFT。我的代码在取反时抛出错误:

/// Load the source image    
src = imread("C:/Users/Adithyaanirudhha/Documents/Visual Studio 2015/Projects/ConsoleApplication2/pa.jpg", 1);

if (display_caption("Original Image") != 0) { return 0; }

dst = src.clone();
width = src.size().width;
height = src.size().height;
Size size(height,width);
if (display_dst(DELAY_CAPTION) != 0) { return 0; }
cvtColor(src, src, CV_RGB2GRAY);
/// Applying Gaussian blur


//for(int j=0;j<4;j++)
//{
//resize(src, src, size / 2);
k = 2 ^ (1 / 2);
for(int i=0;i<3;i++)
{
//if (display_caption("Gaussian Blur") != 0) { return 0; }
GaussianBlur(src, dst, Size(), 1.6*k, 1.6*k);
if (display_dst(DELAY_BLUR*10) != 0) { return 0; }
k = k * k;
dst.copyTo(dest[m]);
//dest[m] = dst;
m++;
}
//}

width2 = dog[1].size().width;
height2 = dog[1].size().height;
Size sizes(width2,height2);
Mat dog_inv(sizes,0,CV_64F);
for (int n = 0; n < 2; n++)
{
    if(m1!=3 || m1 != 6 || m1 != 9)
    subtract(dest[m1 + 1], dest[m1], dog[n],noArray(),-1);
}
for (int i = 0; i < 2; i++)
{
    Sobel(dog[i], grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
    convertScaleAbs(grad_x, grad_x);
    transpose(grad_x, temp);
    Sobel(dog[i], grad_x_2, CV_16S, 2, 0, 3, 1, 0, BORDER_DEFAULT);
    convertScaleAbs(grad_x_2, grad_x_2);
    c = invert(dog[i],dog_inv, DECOMP_LU);

    Sobel(dog[i], grad_x_2_1, CV_16S, 2, 0, 3, 1, 0, BORDER_DEFAULT);
    convertScaleAbs(grad_x_2_1, grad_x_2_1);
    //imshow(window_name,src);
    //grad_x_2_1 = grad_x_2_1.inv(CV_32F);
    multiply(grad_x_2_1, grad_x, x_max, 1, 1);
    multiply(temp, x_max, p1, 1, 1);
    transpose(x_max,temp);
    //multiply(temp, grad_x_2, p2, 1, 1);
    multiply(p2, x_max, p2, 1, 1);
    imshow(window_name, dog[1]);
    /*for (int y = 0; y < dog[i].rows; y++)
    {
        for (int x = 0; x < dog[i].cols; x++)
        {
            dog[i].at<Vec3b>(y, x) = (-1 * (p1.at<Vec3b>(y, x)) + 0.5*(p2.at<Vec3b>(y, x)) + dog[i].at<Vec3b>(y, x));
        }
    }*/
    //imshow(window_name, dog[1]);
    //imshow(window_name, src);

错误是:

OpenCV 错误:在 cv::invert 中断言失败(类型 == CV_32F || 类型 == CV_64F), 文件 C:\buildslave64\win64_amdocl\master_PackSlave-win64-vc14-shared\opencv\mod ules\core\src\lapack.cpp,第 798 行 按任意键继续 。 . .

【问题讨论】:

    标签: c++ opencv visual-c++


    【解决方案1】:

    OpenCV 错误:在 cv::invert 中断言失败(类型 == CV_32F || 类型 == CV_64F)

    意味着您需要将CV_32F(浮点)或CV_64F(双精度)类型的矩阵传递给invert。但是您传递的是CV_16S(简称),因为您在调用时设置了这个:

    Sobel(dog[i], grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
                          ^^^^^^
    

    所以你可以

    1. Sobel返回的矩阵类型改为CV_32F

       Sobel(dog[i], grad_x, CV_32F, 1, 0, 3, 1, 0, BORDER_DEFAULT);
       c = invert(dog[i],dog_inv, DECOMP_LU);
      
    2. 或将您传递给invert 的矩阵转换为正确的类型

       Sobel(dog[i], grad_x, CV_16S, 1, 0, 3, 1, 0, BORDER_DEFAULT);
       Mat tmp;
       dog[i].convertTo(tmp, CV_32F);
       c = invert(tmp,dog_inv, DECOMP_LU);
      

    【讨论】:

    • 首先谢谢你,我尝试了第二种格式并以错误结束: ***** VIDEOINPUT LIBRARY - 0.1995 - TFW07 ***** OpenCV Error: Assertion failed (m == n) 在 cv::invert,文件 C:\buildslave64\win6 4_amdocl\master_PackSlave-win64-vc14-shared\opencv\modules\core\src\lapack.cpp,第 822 行 Press any key to continue 。 . .是不是表示它不是方阵。
    • 尝试使用DECOMP_SVD 而不是DECOMP_LU
    • 我猜它起作用了,但这次它再次引发了一个不同的错误: ***** VIDEOINPUT LIBRARY - 0.1995 - TFW07 ***** OpenCV 错误:输入参数的大小不匹配(该操作既不是 cv::arithm_op 文件 C:\builds 中的“阵列运算数组”(其中数组具有相同大小和相同数量的通道),也不是“数组运算标量”,也不是“标量运算数组”) lave64\win64_amdocl\master_PackSlave-win64-vc14-shared\opencv\modules\core\src\a rithm.cpp,第639行按任意键继续。 . .
    • 很抱歉,我无法调试您的所有代码。检查导致错误的行,可能您会发现图像的大小和通道数不同...
    • 很高兴它有帮助;D
    猜你喜欢
    • 1970-01-01
    • 2019-07-26
    • 1970-01-01
    • 2012-07-26
    • 1970-01-01
    • 1970-01-01
    • 2013-07-29
    • 2013-05-22
    • 2012-07-14
    相关资源
    最近更新 更多