实现SIFT算法时断言错误:opencv

时间:2014-03-23 04:31:19

标签: c++ opencv sift opencv-stitching

我正在使用opencv 2.4.8和studio 2013,我得到运行时错误。我的主要代码就是这个..

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>
#include"SIFT.h"
#include<iostream>
#include<stdio.h>
#include<conio.h>
using namespace cv;
using namespace std;
int main()
{
    cout << "hello";
    Mat image = imread("abc.jpg",0);
    cout << image.channels() << endl;
    SIFT controller(image);
    controller.DoSIFT();    
    waitKey(100000);

}

我的头文件代码如下

#include<opencv2\core\core.hpp>
#include<opencv2\highgui\highgui.hpp>
#include<opencv2\imgproc\imgproc.hpp>

#include<iostream>

using namespace cv;
using namespace std;

class SIFT{

private:
    Mat image_orig;
    Mat Scale_spaces[4][6];
    Mat LOG_img[4][4];
    Mat Extrema[4][2];
    Mat image_temp;
    Mat middle, up, down;


    void BuildScaleSpace()
    {

        cout << "in build space" <<endl;
        int i, j;
            //image should be in grey scale
        cout << endl<<image_temp.rows << image_temp.cols << endl;
            GaussianBlur(image_temp, image_temp, cv::Size(5, 5), 0.5);
            resize(image_temp, image_temp, Size(image_temp.cols * 2, image_temp.rows * 2), 0, 0, 1);
            cout << image_temp.rows << image_temp.cols << endl;
            Scale_spaces[0][0] =image_temp;
            cout << endl << image_temp.rows << image_temp.cols << endl;
            GaussianBlur(Scale_spaces[0][0], Scale_spaces[0][0], cv::Size(5, 5), 1);
            double int_sigma = sqrt(2) / 2;
            double sigma = int_sigma;;
            double mid;
            double power = 1.0;
            for (i = 0; i < 4; i++)
            {

                if (i>0)
                {
                    sigma = mid;
                    Scale_spaces[i][0] = image_temp;
                    resize(image_temp, Scale_spaces[i][0], Size(image_temp.cols / power, image_temp.rows / power), 0, 0, 1);
                    cout << endl << "after resizing" << Scale_spaces[i][0].rows << Scale_spaces[i][0].cols << endl;
                }

                for (j = 1; j <= 5; j++)
                {
                    if (j == 2)
                        mid = sigma;
            //      printf(" %f  ", sigma);
                            GaussianBlur(Scale_spaces[i][j-1], Scale_spaces[i][j], cv::Size(5, 5), sigma);
                    sigma = sigma*sqrt(2);

                }
        //      printf("\n");
                power = power * 2;
            }




    }

    void ShowScaleSpace()
    {
        cout << "\n show scale\n\n";
        namedWindow("image", CV_WINDOW_AUTOSIZE);
        int i, j;
        for (i = 0; i < 4; i++)
        {
            for (j = 0; j <= 5; j++)
            {
                cout << i<<"   "<<j<<endl;
                cout << Scale_spaces[i][j].rows<<"  " << Scale_spaces[i][j].cols << endl;
                imshow("image", Scale_spaces[i][j]);
                cvWaitKey(700);
            }
        }

    }

    void FindLOG()
    {
        cout << endl << "IN LOG  " << endl;
        int i;
        int j;
        for (i = 0; i < 4; i++)
        {
            for (j = 1; j < 5; j++)
            {
                addWeighted(Scale_spaces[i][j], 1, Scale_spaces[i][j + 1], -1,0, LOG_img[i][j - 1]);
            }
        }

    }

    void FindMaxMin()
    {

        cout << endl << "IN findmaxmin  " << endl;
        int i;
        int j;
        int xiter, yiter;
        for (i = 0; i < 4; i++)
        {
            for (j = 1; j < 3; j++)
            {

                std::cout << LOG_img[i][j].channels();
                middle = LOG_img[i][j].clone();
                up = LOG_img[i][j - 1].clone();
                down = LOG_img[i][j + 1].clone();

                for (yiter = 1; yiter < middle.rows-1; yiter++)
                {
                    for (xiter = 1; xiter < middle.cols-1; xiter++)
                    {
                        cout << i << "  " << j << "  " << yiter << "  " << xiter<< "  "<<endl;
                        double currentPixel = middle.at<uchar>(yiter, xiter);
                        cout << "1 ";
                        // Check for a maximum
                        if (cout << "helllo 2hhukjhgkj"&&currentPixel> middle.at<uchar>(yiter, xiter + 1) &&
                            currentPixel> middle.at<uchar>(yiter, xiter - 1) &&
                            currentPixel > middle.at<uchar>(yiter + 1, xiter) &&
                            currentPixel > middle.at<uchar>(yiter + 1, xiter - 1) &&
                            currentPixel > middle.at<uchar>(yiter, xiter + 1) &&
                            currentPixel > middle.at<uchar>(yiter - 1, xiter) &&
                            currentPixel > middle.at<uchar>(yiter - 1, xiter + 1) &&
                            currentPixel > middle.at<uchar>(yiter - 1, xiter - 1) &&

                            currentPixel > up.at<uchar>(yiter, xiter) &&
                            currentPixel > up.at<uchar>(yiter, xiter + 1) &&
                            currentPixel > up.at<uchar>(yiter, xiter - 1) &&
                            currentPixel > up.at<uchar>(yiter + 1, xiter) &&
                            currentPixel > up.at<uchar>(yiter + 1, xiter - 1) &&
                            currentPixel > up.at<uchar>(yiter, xiter + 1) &&
                            currentPixel > up.at<uchar>(yiter - 1, xiter) &&
                            currentPixel > up.at<uchar>(yiter - 1, xiter + 1) &&
                            currentPixel > up.at<uchar>(yiter - 1, xiter - 1) &&

                            currentPixel > down.at<uchar>(yiter, xiter) &&
                            currentPixel > down.at<uchar>(yiter, xiter + 1) &&
                            currentPixel > down.at<uchar>(yiter, xiter - 1) &&
                            currentPixel > down.at<uchar>(yiter + 1, xiter) &&
                            currentPixel > down.at<uchar>(yiter + 1, xiter - 1) &&
                            currentPixel > down.at<uchar>(yiter, xiter + 1) &&
                            currentPixel > down.at<uchar>(yiter - 1, xiter) &&
                            currentPixel > down.at<uchar>(yiter - 1, xiter + 1) &&
                            currentPixel > down.at<uchar>(yiter - 1, xiter - 1)
                            )
                        {
                            cout << "inside, updating extrema  ";
                            Extrema[i][j - 1].at<uchar>(xiter, yiter) = 255;
                        }

                        else if (currentPixel< middle.at<uchar>(yiter, xiter + 1) &&
                            currentPixel< middle.at<uchar>(yiter, xiter - 1) &&
                            currentPixel < middle.at<uchar>(yiter + 1, xiter) &&
                            currentPixel < middle.at<uchar>(yiter + 1, xiter - 1) &&
                            currentPixel < middle.at<uchar>(yiter, xiter + 1) &&
                            currentPixel < middle.at<uchar>(yiter - 1, xiter) &&
                            currentPixel < middle.at<uchar>(yiter - 1, xiter + 1) &&
                            currentPixel < middle.at<uchar>(yiter - 1, xiter - 1) &&

                            currentPixel < up.at<uchar>(yiter, xiter) &&
                            currentPixel < up.at<uchar>(yiter, xiter + 1) &&
                            currentPixel < up.at<uchar>(yiter, xiter - 1) &&
                            currentPixel < up.at<uchar>(yiter + 1, xiter) &&
                            currentPixel < up.at<uchar>(yiter + 1, xiter - 1) &&
                            currentPixel < up.at<uchar>(yiter, xiter + 1) &&
                            currentPixel < up.at<uchar>(yiter - 1, xiter) &&
                            currentPixel < up.at<uchar>(yiter - 1, xiter + 1) &&
                            currentPixel < up.at<uchar>(yiter - 1, xiter - 1) &&

                            currentPixel < down.at<uchar>(yiter, xiter) &&
                            currentPixel < down.at<uchar>(yiter, xiter + 1) &&
                            currentPixel < down.at<uchar>(yiter, xiter - 1) &&
                            currentPixel < down.at<uchar>(yiter + 1, xiter) &&
                            currentPixel < down.at<uchar>(yiter + 1, xiter - 1) &&
                            currentPixel < down.at<uchar>(yiter, xiter + 1) &&
                            currentPixel < down.at<uchar>(yiter - 1, xiter) &&
                            currentPixel < down.at<uchar>(yiter - 1, xiter + 1) &&
                            currentPixel < down.at<uchar>(yiter - 1, xiter - 1)
                            )
                        {
                            Extrema[i][j - 1].at<uchar>(xiter, yiter) = 255;
                        }

                        else
                            Extrema[i][j - 1].at<uchar>(xiter, yiter) = 0;
                    }




                }
            }
        }
    }



public:
    SIFT(Mat Image)
    {
        image_orig = Image;
        image_temp = Image;

    }

    void DoSIFT()
    {

        BuildScaleSpace();
        //ShowScaleSpace();
        FindLOG();
        FindMaxMin();


    }



};

构建成功但在运行时它显示以下错误。

enter image description here

错误可能出在FindMaxMin()函数和此行

  currentPixel> middle.at<uchar>(yiter, xiter + 1)

但我无法纠正它。

2 个答案:

答案 0 :(得分:1)

if (cout << "message" &&似乎不是很好的做法。将控件与信息输出分开以便开始。

此外,您还要检查并确保您的xiteryiter变量在您期望的范围内。修复此问题很可能会解决您的问题。

答案 1 :(得分:1)

对不起,@ user2396315,我没有经常访问这里。

问题是你没有初始化“Extrema”,Mat :: create()具有正确的大小和类型。 你只宣称它为“Mat Extrema [4] [2];”

所以在if else之后...

Extrema[i][j - 1].at<uchar>(xiter, yiter) = ??? ;

将访问一个空的Mat“Extrema [i] [j - 1]”。

你可以把

if( Extrema[i][j - 1].empty() == true )
   cerr << "Fatal error" << endl ;

之前,你会看到。

在使用之前,请务必通过Mat :: empty()检查Mat。 这就是我所说的“检查尺寸”post。我不是要检查数组的大小。

请记住,“断言失败”通常意味着您已经传递了一个空的垫子或垫子,其尺寸与预期的大小不同。