Member 14192637 Ответов: 2

Ловушка прерывания:6 проблема с findchessboard


Я новичок на этом форуме. Я хотел бы задать вам вопрос, который раздражал меня весь этот день. проблема в том, что я ничего не нахожу в интернете об этом. В университете мы должны сделать это: написать программу, которая: -загружает изображения шахматной доски. ( эти изображения находятся в папке, предоставленной профессором, они представляют собой некоторые фотографии (15), сделанные смартфоном Huawei шахматной доски). -Обнаруживает пересечения шахматной доски на каждом изображении. Функция рад что вам нужно это CV::findChessboardCorners() (опционально: рассмотреть возможность использования резюме::cornerSubPix (функции), для уточнения угол обнаружения).

Я пишу его с помощью Xcode ( c++) с opencv 3.4.5 на Macbook.

Проблема в том, что при инструкции "findChessboardCorners" она выдает мне ошибку. Я действительно не понимаю, что вызывает это, проблема в том, что " abort trap: 6. Может ли кто-нибудь мне помочь?

Большое спасибо.

Что я уже пробовал:

#include <sstream>
#include <iostream>
#include <opencv2/core.hpp>
#include <opencv2/calib3d/calib3d.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/imgproc.hpp>


#define points_per_row 12
#define points_per_colum 8
using namespace cv;
using namespace std;


int main(int argc, const char * argv[]) {
    //read the file
    stringstream sst;
    vector<Mat> imagesArray;
    vector<Point2f> centers; //this will be filled by the detected centers
    Size patternSize = Size(11, 7); //2nd parameter FindchessCorners
    bool patternfound = false; //result of findChessboardCorners

    cout << "flag1 "<< endl;
    for(int i = 1; i < 16; i++){
        sst << "img" << i << ".jpg";
        cout << sst.str() << endl;
        imagesArray.push_back(imread(sst.str())); // putting into an array
        cout << "flag2" << endl;
    }//for
    //PUNTO 2: individuation of the corners of every image
    for(int i = 0 ; i <=15 ; i++){
        cout << "flag3" << endl;
        patternfound = findChessboardCorners(imagesArray[i] , patternSize , centers);
        if(patternfound){
            cout << "pattern found:"<< patternSize << endl;
            cout << "centroids: " << centers << endl;
            cout << "centroids array size: " << centers.size() << endl;
        for(int j = 0; j < centers.size(); j++)
                cout << centers[j] << endl;
        }
    }//for

return 0;
}

2 Ответов

Рейтинг:
2

Rick York

Проблема заключается в циклах for. Вы утверждали, что существует пятнадцать изображений. Поскольку индексы массива начинаются с нуля, пятнадцатое изображение будет иметь индекс четырнадцать, но ваш цикл for выходит на пятнадцать. Лучшим способом сделать это было бы определить константу :

const int ImageCount = 15;

// and write the for loops like this :

for( int i = 0; i < ImageCount; ++i )
{
    sst << "img" << i + 1 << ".jpg";   // first image is 1

    // rest of code goes here
}

for( int i = 0 ; i < ImageCount ; i++)
{
    patternfound = findChessboardCorners( imagesArray[i] , patternSize , centers );

    // rest of code goes here
}
Это должно работать лучше для вас


Рейтинг:
2

Member 14192637

Привет. Прежде всего, спасибо, что ответили. Я последовал вашему ценному совету(с небольшими изменениями, но это главное), но проблема не меняется. вот этот кусок кода правильный:

for(int i = 0 ; i < imagesArray.size(); i++){
                        cout << "flag3" << endl;
                        patternfound = findChessboardCorners(imagesArray[i] , patternSize , centers);
                        if(patternfound){
                            cout << "pattern found:"<< patternSize << endl;
                            cout << "centroids: " << centers << endl;
                            cout << "centroids array size: " << centers.size() << endl;
                        for(int j = 0; j < centers.size(); j++)
                                cout << centers[j] << endl;
                        }//if
                    }//for


Но все равно я получаю ту же ошибку при компиляции:

libc++abi.dylib: terminating with uncaught exception of type cv::Exception: OpenCV(3.4.5) /tmp/opencv@3-20190117-71360-ynjwgu/opencv-3.4.5/modules/core/src/matrix.cpp:757: error: (-215:Assertion failed) dims <= 2 && step[0] > 0 in function 'locateROI'

Abort trap: 6


Richard MacCutchan

Вам нужно посмотреть на трассировку стека, чтобы увидеть, какая часть вашего кода приводит к утверждению.

Member 14192637

Привет, я компилируюсь с терминалом. Вы знаете, как я могу это сделать?

Richard MacCutchan

Извините, я понятия не имею, что это значит. Вам нужно использовать все доступные функции отладки.

Rick York

Прежде всего, взгляните на то, что вы нам дали. Сообщение об ошибке из строки 757 matrix.cpp в функции locateROI. То, что вы не показали, - это код вокруг строки 757 из matrix.cpp в locateROI или там, где вы вызвали функцию. Как мы можем догадаться, что происходит из этого?

Во-вторых, это не решение вопроса. Вы должны были пересмотреть вопрос с более релевантной информацией.