Assertion Error while implementing SIFT algorithm :opencv

橙三吉。 提交于 2019-12-11 21:31:04

问题


I am using opencv 2.4.8 and studio 2013, n i am getting a run time error.my main code is this..

#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);

}

and my header file code is as below

#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();


    }



};

the build is successful but, at the run time it is showing the following error.

the error might be in the FindMaxMin() function and in this line

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

But I am not able to rectify it.


回答1:


Sorry, @user2396315, I didn't visit here constantly.

The problem is You didn't initial "Extrema", with Mat::create() with correct size and type. You only declared it "Mat Extrema[4][2];"

So after the if else...

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

will access an empty Mat "Extrema[i][j - 1]".

You may put

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

before it and you will see.

Always check your Mat by Mat::empty() before you use it. That is what I meant "Check the size" at this post. I didn't mean to check the size of arrays.

Remember, "Assertion failed" usually means you have passed an empty Mat or Mat with incorrect size as expectation.




回答2:


The if (cout << "message" && doesn't seem like very good practice. Separate the controls from the information output for a start.

Also, you're going to want to check and make sure your xiter and yiter variables are within the bounds you expect. Fixing this will very likely fix your issue.



来源:https://stackoverflow.com/questions/22587103/assertion-error-while-implementing-sift-algorithm-opencv

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!