OpenCV计算图像的平方断言失败错误

时间:2013-01-10 18:10:51

标签: algorithm image-processing opencv face-recognition

我正在尝试使用Sum of squared Difference作为错误指标(Image registration)将脸部图像与参考脸部图像对齐。基本上,尝试实现cvMatchTemplate函数的类似功能(但是我没有模板图像,而是常见的面部表情)。当试图对差异图像进行平方时,我得到一个断言失败的错误:-215。我的问题应该是:我是否必须使用矩阵乘法运算符A * A或每元素乘法A.mul(A)来获得差异图像的平方? (目前我使用A * A)

//Start search
Mat result;
for(int i= 0; i<15; i++){
    for(int j= 0; j<15; j++){
        xTrans = i; //Translation on x-Axis
        yTrans = j; //Translation on y-Axis

        //Initialize translation matrix
        double m[2][3] = {{1,0,xTrans}, {0,1,yTrans}};
        Mat map = Mat(2,3,CV_64F, m);

        //Get the transformed image
        warpAffine(displaced, aligned, map, aligned.size());
        //Calculate the sum of squared differences
        absdiff(reference,aligned,result);
        try{
            squared = result*result; //Error line
        } catch (Exception const & e){
            cerr<<"OpenCV exception: "<<e.what()<<std::endl;
        }
        SSD = sum(squared)[0]; //Sum of squared difference
        cout <<xTrans << "," << yTrans << ","<<SSD<<endl;
    }
}

这是错误:

OpenCV Error: Assertion failed (type == B.type() && (type == CV_32FC1 || type ==
CV_64FC1 || type == CV_32FC2 || type == CV_64FC2)) in unknown function, file ..
\..\..\src\opencv\modules\core\src\matmul.cpp, line 711
OpenCV exception: ..\..\..\src\opencv\modules\core\src\matmul.cpp:711: error: (-
215) type == B.type() && (type == CV_32FC1 || type == CV_64FC1 || type == CV_32F
C2 || type == CV_64FC2)

两张图片的大小和类型都与warpAffine工作正常相同。关于为什么会出现这种错误或者我的实施的正确性的任何建议都将非常感谢!

2 个答案:

答案 0 :(得分:2)

你想使用逐元素乘法。

squared = result.mul(result);

由于看起来您正在使用浮点图像,因此无需担心饱和度。

元素乘法将两个矩阵的各个元素相乘(因此得名),并要求矩阵具有相同的大小。 result矩阵中的每个元素代表像素值的差异。每个像素值独立于图像中的任何其他像素值,因此逐元素乘法将产生适当的结果。

Matrix multiplication与逐元素乘法明显不同。一种常见的应用是在计算机图形和计算机视觉中应用变换。矩阵乘法在应用于数学构造时是有意义的,但在应用于图像时则不然。不要认为必须使用矩阵乘法,因为cv::Mat也用于存储图像数据。

答案 1 :(得分:0)

我想这行中的问题

Mat map = Mat(2,3,CV_64F, m);

试试这个链接 error on Gaussian blur with convolution method in openCV2.3