Error mit OpenCV ROI

Ich versuche, ein Programm zu erstellen, das ein Muster identifiziert, indem eine ROI über ein Bild gezogen und die ROI mit einer Vorlage verglichen wird. Dabei werden die Pixelwerte der ROI und der Vorlage verglichen und der Zähler jedes Mal um 1 erhöht, wenn ein Pixel übereinstimmt , dann vergleiche ich den Zähler mit einem Schwellenwert, wenn er ein Rechteck passiert, wird es gezeichnet, wenn nicht, wird es weiter durch das Bild gleiten, wenn ich den Debugger darauf starte, werden keine Fehler beim Gleiten durch das Bild angezeigt, aber wenn Ich führe es normal aus, es löst die nächste Ausnahme aus:

OpenCV Error: Assertion failed (0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows) in Mat, file /home/abuild/rpmbuild/BUILD/opencv-2.4.6.1/modules/core/src/matrix.cpp, line 323
terminate called after throwing an instance of 'cv::Exception'
what():  /home/abuild/rpmbuild/BUILD/opencv-2.4.6.1/modules/core/src/matrix.cpp:323: error: (-215) 0 <= roi.x && 0 <= roi.width && roi.x + roi.width <= m.cols && 0 <= roi.y && 0 <= roi.height && roi.y + roi.height <= m.rows in function Mat

Ich lasse den Code unten:

#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <opencv2/highgui/highgui.hpp>
#include <opencv2/core/core.hpp>
#include <opencv2/imgproc/imgproc.hpp>


using namespace std;
using namespace cv;

Mat         iOrig;                          //imagen que se analizara
Mat         patron;                         //patron buscado
Point       corner1,corner2;                //esquinas del ROI
bool        tresholdpass;                   //boolean returned by comparar()
Rect        box;                            //rectangulo usado para crear el ROI
float       porcentaje;                     //distancia a recorrer que sera dada por el tamano de la imagen muestra para el patron
float       treshold;                       //treshold que debera ser superado para que se considere similar o igual al patron
float       valpx;                          //valor almacenado en el pixel comparado
float       contTreshold;                   //contador a comparar contra el porcentaje requerido para considerarse como patron encontrado
float       totpxpat;                       //cantidad de pixeles de la imagen muestra del patron
float       porctreshold;                   //porcentaje representativo para considerar que se encontro el patron en esa ROI

bool comparar(Mat region, Mat patron){

    int i=0;
    int j=0;
    contTreshold=0;

    for (i=0;i<patron.cols;i++){
        for (j=0;j<patron.rows;j++){
            Point a(i,j);
            if(abs(region.at<float>(a))==abs(patron.at<float>(a))){
            //se compara el contenido de el ROI y el patron en un punto
                contTreshold++;             //en caso de ser cierto, el contador aumenta en 1
            }
        }

    }
    totpxpat = patron.rows*patron.cols;     //se cuentan la cantidad de pixeles dado columnas*renglones
    porctreshold = 0.8;                     //el porcentaje que se usara para el treshold
    treshold = totpxpat * porctreshold;     //el treshold que determinara si se cumple el porcentaje de la imagen
                                        //para saber si cumple el patron o no, en caso de q se supere, retornara verdadero
                                        //en caso de que no se supere retornara falso y se elegira otro ROI para analizar
    if (contTreshold>treshold){
        return true;
    }else{
        return false;
    }
}

int main() {

    namedWindow("imagen");
    namedWindow("segmento");

    iOrig = imread( "/home/diego/Downloads/figuras.jpg",CV_LOAD_IMAGE_GRAYSCALE );
    patron = imread("/home/diego/Downloads/patron.jpg",CV_LOAD_IMAGE_GRAYSCALE);

    imshow("imagen",iOrig);
    imshow("segmento",patron);
    corner1.x = 1;
    corner1.y = 1;
    corner2.x = patron.cols;
    corner2.y = patron.rows;


    porcentaje = (int)patron.cols * 0.05;

    while (corner2.x<iOrig.rows-(patron.rows*2)){
        while(corner2.y<iOrig.cols-(patron.cols*2)){
            box.width = abs (corner1.x-corner2.x)+1;
            box.height = abs (corner1.y - corner2.y)+1;
            box.x = min(corner1.x, corner2.x);
            box.y = min(corner1.y, corner2.y);


        //se crea una imagen de la region de interes seleccionada apartir de las 2 esquinas de la ROI
            Mat     region(iOrig,box);              //region de interes que sera comparada

        //se manda a comparar el ROI con el patron
            tresholdpass=comparar(region,patron);
            if (tresholdpass == true){
                Mat local_img = iOrig.clone();
                rectangle(local_img,corner1,corner2,Scalar(0,0,255));
                imshow("imagen",local_img);

            }
            corner1.x+=porcentaje;
            corner2.x+=porcentaje;
        }
        corner1.y+=porcentaje;
        corner2.y+=porcentaje;
    }

    while (char(waitKey(1))!= 'q'){}
    return 0;
}

Ich kann die Bilder, die ich verwende, wegen des guten Rufs nicht hochladen ... aber das Originalbild ist 800 x 450 und die im Bild gesuchte Vorlage ist 131 x 132

sorry über die Kommentare in meinem Code, der auf Spanisch ist, Englisch ist nicht meine Muttersprache, wie Sie inzwischen erraten haben, ich weiß wirklich nicht, wo mein Fehler ist, aber ... Ich hoffe, es ist einfach, danke im Voraus!

Antworten auf die Frage(2)

Ihre Antwort auf die Frage